<?php

declare(strict_types=1);

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/config_ui.php';
require_once __DIR__ . '/lib/MailService.php';

Security::headers(false);

$message = '';
$messageType = '';
$emailValue = trim((string) ($_POST['correo'] ?? ''));

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!Security::validateCsrf()) {
        $message = 'La sesión de seguridad venció. Recarga la página e inténtalo nuevamente.';
        $messageType = 'error';
    } else {
        $email = filter_input(INPUT_POST, 'correo', FILTER_VALIDATE_EMAIL);
        $email = $email ? strtolower(trim((string) $email)) : '';
        $rate = Security::rateLimit('password-reset:' . Security::clientIp(), 5, 3600);

        if (!$rate['allowed']) {
            $message = 'Se realizaron demasiadas solicitudes. Vuelve a intentarlo más tarde.';
            $messageType = 'error';
        } elseif ($email === '') {
            $message = 'Ingresa una dirección de correo válida.';
            $messageType = 'error';
        } else {
            try {
                $stmt = $pdo->prepare('SELECT id FROM usuarios WHERE correo = ? LIMIT 1');
                $stmt->execute([$email]);
                $userId = $stmt->fetchColumn();

                if ($userId) {
                    $token = bin2hex(random_bytes(32));
                    $tokenHash = hash('sha256', $token);
                    $pdo->beginTransaction();
                    $pdo->prepare('DELETE FROM password_resets WHERE email = ?')->execute([$email]);
                    $pdo->prepare('INSERT INTO password_resets (email, token) VALUES (?, ?)')->execute([$email, $tokenHash]);
                    $pdo->commit();

                    $protocol = Security::isHttps() ? 'https' : 'http';
                    $basePath = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'] ?? '/')), '/');
                    $resetLink = $protocol . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . $basePath . '/reset_password.php?token=' . urlencode($token);
                    $systemName = htmlspecialchars((string) ($ui_title_system ?? 'Ave Fénix'), ENT_QUOTES, 'UTF-8');
                    $safeLink = htmlspecialchars($resetLink, ENT_QUOTES, 'UTF-8');
                    $brandColor = preg_match('/^#[0-9a-fA-F]{6}$/', (string) ($ui_color_primary_bg_hex ?? '')) ? (string) $ui_color_primary_bg_hex : '#dc2626';
                    $html = '<!doctype html><html lang="es"><body style="margin:0;background:#f4f7fb;font-family:Arial,sans-serif;color:#172033">'
                        . '<div style="max-width:600px;margin:30px auto;background:#fff;border:1px solid #e2e8f0;border-radius:18px;overflow:hidden">'
                        . '<div style="padding:22px 26px;background:' . $brandColor . ';color:#fff;font-size:20px;font-weight:700">' . $systemName . '</div>'
                        . '<div style="padding:28px"><h1 style="margin:0 0 14px;font-size:22px">Crea una nueva contraseña</h1>'
                        . '<p style="line-height:1.6;color:#475569">Recibimos una solicitud para restablecer el acceso de tu cuenta.</p>'
                        . '<p style="margin:24px 0"><a href="' . $safeLink . '" style="display:inline-block;padding:13px 20px;border-radius:10px;background:' . $brandColor . ';color:#fff;text-decoration:none;font-weight:700">Restablecer contraseña</a></p>'
                        . '<p style="font-size:13px;line-height:1.6;color:#64748b">El enlace expira en una hora y solo puede utilizarse una vez. Si no solicitaste el cambio, ignora este mensaje.</p>'
                        . '<p style="font-size:12px;word-break:break-all;color:#94a3b8">' . $safeLink . '</p></div></div></body></html>';

                    $mailConfig = require __DIR__ . '/config_mail.php';
                    $mailer = new MailService($mailConfig);
                    if (!$mailer->sendHtml($email, 'Restablecimiento de contraseña', $html)) {
                        error_log('No se pudo enviar el correo de recuperación: ' . $mailer->getLastError());
                    }
                }
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) $pdo->rollBack();
                error_log('Error al solicitar recuperación: ' . $e->getMessage());
            }

            $message = 'Si el correo está registrado, recibirás las instrucciones de recuperación.';
            $messageType = 'success';
            $emailValue = '';
        }
    }
}

$authPageTitle = $ui_recover_page_title ?? 'Recuperar contraseña';
$authEyebrow = $ui_recover_eyebrow ?? 'RESTABLECER ACCESO';
$authTitle = $ui_recover_hero_title ?? 'Recupera tu cuenta mediante un enlace temporal y seguro.';
$authDescription = $ui_recover_hero_description ?? 'La respuesta visible es siempre la misma para proteger la privacidad.';
$authFormTitle = $ui_recover_form_title ?? '¿Olvidaste tu contraseña?';
$authFormDescription = $ui_recover_form_description ?? 'Ingresa tu correo y te enviaremos instrucciones para crear una nueva contraseña.';
$authFormIcon = 'fas fa-key';
$authBenefits = [
    ['icon' => 'fas fa-clock', 'title' => 'Enlace temporal', 'text' => 'La solicitud vence después de una hora.'],
    ['icon' => 'fas fa-link-slash', 'title' => 'Un solo uso', 'text' => 'El token se invalida cuando actualizas la contraseña.'],
    ['icon' => 'fas fa-user-shield', 'title' => 'Respuesta privada', 'text' => 'No confirmamos públicamente si el correo existe.'],
];
require __DIR__ . '/partials/auth_header.php';
?>

<?php if ($message !== ''): ?>
    <div class="auth-alert auth-alert--<?= auth_e($messageType) ?>" role="status"><i class="fas <?= $messageType === 'success' ? 'fa-circle-check' : 'fa-circle-exclamation' ?>"></i><span><?= auth_e($message) ?></span></div>
<?php endif; ?>

<form method="post" action="solicitar_reset.php" class="auth-form" data-auth-form novalidate>
    <?= Security::csrfField() ?>
    <div class="auth-guide-box"><i class="fas fa-circle-info"></i><span><strong>Recupera tu acceso</strong>Escribe tu correo. Si está registrado, recibirás un enlace temporal para crear una nueva contraseña.</span></div>

    <div class="auth-field">
        <label for="reset-email"><i class="fas fa-envelope"></i><?= auth_e($ui_recover_email_label ?? 'Correo electrónico') ?></label>
        <div class="auth-input-wrap"><i class="fas fa-envelope auth-input-icon"></i><input id="reset-email" name="correo" type="email" autocomplete="email" inputmode="email" required placeholder="<?= auth_e($ui_recover_email_placeholder ?? 'correo@dominio.com') ?>" data-clear-placeholder value="<?= auth_e($emailValue) ?>"></div>
        <small>Te enviaremos un enlace temporal si el correo está registrado.</small>
        <div class="field-error" data-error-for="correo" role="alert"></div>
    </div>

    <button type="submit" class="auth-submit" data-loading-text="Enviando…"><i class="fas fa-paper-plane"></i><span><?= auth_e($ui_recover_button_text ?? 'Enviar instrucciones') ?></span></button>
    <div class="auth-secondary-link">¿Recordaste tu contraseña? <a href="login.php"><?= auth_e($ui_recover_back_text ?? 'Iniciar sesión') ?></a></div>
    <div class="auth-security-note"><i class="fas fa-shield-check"></i><span><strong>Protección de privacidad</strong>Por seguridad, no confirmaremos públicamente si una dirección está registrada.</span></div>
</form>

<?php require __DIR__ . '/partials/auth_footer.php'; ?>
