<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class forgot_password extends MX_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('forgot_model');
        $this->load->helper('url');
        $this->load->library('email');
    }

    public function index()
    {
        $settings = $this->setting_model->get_setting();
        $data['title']         = lang('forgot_password');
        $data['turnstile_key'] = $settings->turnstile_site_key ?? '';

        if ($this->input->post('submitted')) {
            $email = trim($this->input->post('email'));

            // Valida Turnstile
            $token = $this->input->post('cf-turnstile-response');
            if (!empty($data['turnstile_key'])) {
                if (!$this->_verify_turnstile($token, $settings->turnstile_secret_key ?? '')) {
                    $this->session->set_flashdata('error', 'Verificação de segurança falhou.');
                    redirect(site_url('forgot/forgot_password'));
                    return;
                }
            }

            if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $this->session->set_flashdata('error', 'E-mail inválido.');
                redirect(site_url('forgot/forgot_password'));
                return;
            }

            // Gera token seguro com expiração de 1 hora
            $reset_token  = bin2hex(random_bytes(32));
            $reset_expiry = date('Y-m-d H:i:s', strtotime('+1 hour'));

            $user = $this->db->where('email', $email)->get('users')->row();

            // Sempre mostra a mesma mensagem (evita enumerar e-mails)
            $this->session->set_flashdata('message', 
                'Se este e-mail estiver cadastrado, você receberá um link de redefinição em breve.');

            if ($user) {
                // Salva token no banco
                $this->db->where('id', $user->id)->update('users', [
                    'reset_token'  => $reset_token,
                    'reset_expiry' => $reset_expiry,
                ]);

                // Envia e-mail
                $reset_link = site_url('forgot/forgot_password/reset/' . $reset_token);
                $this->_send_reset_email($user, $reset_link, $settings);
            }

            redirect(site_url('forgot/forgot_password'));
        }

        $this->load->view('forgot_password', $data);
    }

    public function reset($token = '')
    {
        if (empty($token)) { redirect(site_url('forgot/forgot_password')); return; }

        // Verifica token válido e não expirado
        $user = $this->db->where('reset_token', $token)
                         ->where('reset_expiry >=', date('Y-m-d H:i:s'))
                         ->get('users')->row();

        if (!$user) {
            $this->session->set_flashdata('error', 'Link inválido ou expirado. Solicite um novo.');
            redirect(site_url('forgot/forgot_password'));
            return;
        }

        $settings = $this->setting_model->get_setting();
        $data['title']      = 'Redefinir Senha';
        $data['token']      = $token;
        $data['email']      = $user->email;
        $data['min_length'] = $settings->password_min_length ?? 8;
        $data['req_upper']  = $settings->password_require_upper ?? 1;
        $data['req_number'] = $settings->password_require_number ?? 1;
        $data['req_symbol'] = $settings->password_require_symbol ?? 1;

        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $password = $this->input->post('password');
            $confirm  = $this->input->post('confirm');
            $error    = $this->_validate_password($password, $settings);

            if ($error) {
                $data['error'] = $error;
            } elseif ($password !== $confirm) {
                $data['error'] = 'As senhas não coincidem.';
            } else {
                $this->db->where('id', $user->id)->update('users', [
                    'password'     => sha1($password),
                    'reset_token'  => null,
                    'reset_expiry' => null,
                ]);
                $this->session->set_flashdata('message', 'Senha redefinida com sucesso! Faça login.');
                redirect(site_url('admin/login'));
                return;
            }
        }

        $this->load->view('reset_password', $data);
    }

    private function _validate_password($password, $settings)
    {
        $min = $settings->password_min_length ?? 8;
        if (strlen($password) < $min)
            return "A senha deve ter no mínimo {$min} caracteres.";
        if (($settings->password_require_upper ?? 1) && !preg_match('/[A-Z]/', $password))
            return 'A senha deve conter pelo menos uma letra maiúscula.';
        if (($settings->password_require_number ?? 1) && !preg_match('/[0-9]/', $password))
            return 'A senha deve conter pelo menos um número.';
        if (($settings->password_require_symbol ?? 1) && !preg_match('/[^a-zA-Z0-9]/', $password))
            return 'A senha deve conter pelo menos um símbolo especial (!@#$%...).';
        return null;
    }

    private function _send_reset_email($user, $link, $settings)
    {
        $config = [
            'protocol'   => 'smtp',
            'smtp_host'  => $settings->smtp_host ?: 'localhost',
            'smtp_user'  => $settings->smtp_user,
            'smtp_pass'  => $settings->smtp_pass,
            'smtp_port'  => $settings->smtp_port ?: 587,
            'smtp_crypto'=> 'tls',
            'mailtype'   => 'html',
            'charset'    => 'utf-8',
            'newline'    => "\r\n",
        ];
        $this->email->initialize($config);
        $this->email->from($settings->smtp_user, $settings->name ?? 'Breno Paiva Advocacia');
        $this->email->to($user->email);
        $this->email->subject('Redefinição de Senha — Breno Paiva Advocacia');
        $this->email->message("
            <div style='font-family:Arial,sans-serif;max-width:500px;margin:0 auto'>
            <div style='background:#1a1a2e;padding:20px;text-align:center'>
                <h2 style='color:#fff;margin:0'>Breno Paiva Advocacia</h2>
            </div>
            <div style='padding:30px;border:1px solid #ddd'>
                <p>Olá, <strong>{$user->name}</strong>!</p>
                <p>Recebemos uma solicitação para redefinir a senha da sua conta.</p>
                <p>Clique no botão abaixo para criar uma nova senha:</p>
                <p style='text-align:center;margin:30px 0'>
                    <a href='{$link}' style='background:#0f3460;color:#fff;padding:14px 30px;border-radius:6px;text-decoration:none;font-weight:bold'>
                        Redefinir Minha Senha
                    </a>
                </p>
                <p style='color:#999;font-size:12px'>Este link expira em 1 hora. Se você não solicitou a redefinição, ignore este e-mail.</p>
                <hr style='border:none;border-top:1px solid #eee'>
                <p style='color:#aaa;font-size:11px;text-align:center'>
                    Breno Paiva Advocacia · OAB-PE 31.577 · Recife/PE
                </p>
            </div>
            </div>
        ");
        @$this->email->send();
    }

    private function _verify_turnstile($token, $secret)
    {
        if (empty($secret) || empty($token)) return true;
        $ch = curl_init('https://challenges.cloudflare.com/turnstile/v0/siteverify');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => http_build_query(['secret' => $secret, 'response' => $token]),
            CURLOPT_TIMEOUT        => 5,
        ]);
        $resp = curl_exec($ch);
        curl_close($ch);
        if (!$resp) return true;
        $r = json_decode($resp, true);
        return isset($r['success']) && $r['success'] === true;
    }
}
