<?php

declare(strict_types=1);

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

Security::headers(false);

$token = is_string($_GET['token'] ?? null) ? trim((string) $_GET['token']) : '';
$tokenValid = false;
$userEmail = '';
$message = '';
$messageType = '';

if ($token !== '' && preg_match('/^[a-f0-9]{64}$/i', $token)) {
    try {
        $tokenHash = hash('sha256', $token);
        $stmt = $pdo->prepare('SELECT email, created_at FROM password_resets WHERE token = ? LIMIT 1');
        $stmt->execute([$tokenHash]);
        $request = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($request) {
            $created = strtotime((string) ($request['created_at'] ?? ''));
            if ($created !== false && (time() - $created) < 3600) {
                $tokenValid = true;
                $userEmail = (string) $request['email'];
            } else {
                $pdo->prepare('DELETE FROM password_resets WHERE token = ?')->execute([$tokenHash]);
            }
        }
    } catch (Throwable $e) {
        error_log('No se pudo validar el token de recuperación: ' . $e->getMessage());
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!$tokenValid) {
        $message = 'El enlace no es válido o ya venció.';
        $messageType = 'error';
    } elseif (!Security::validateCsrf()) {
        $message = 'La sesión de seguridad venció. Recarga la página e inténtalo nuevamente.';
        $messageType = 'error';
    } else {
        $password = (string) ($_POST['password'] ?? '');
        $confirmation = (string) ($_POST['confirm_password'] ?? '');
        if ($password === '' || $confirmation === '') {
            $message = 'Completa ambos campos de contraseña.';
            $messageType = 'error';
        } elseif ($password !== $confirmation) {
            $message = 'Las contraseñas no coinciden.';
            $messageType = 'error';
        } elseif (strlen($password) < 10) {
            $message = 'La contraseña debe tener al menos 10 caracteres.';
            $messageType = 'error';
        } elseif (!preg_match('/[A-Za-z]/', $password) || !preg_match('/\d/', $password)) {
            $message = 'La contraseña debe incluir letras y números.';
            $messageType = 'error';
        } else {
            try {
                $pdo->beginTransaction();
                $update = $pdo->prepare('UPDATE usuarios SET clave = ? WHERE correo = ?');
                $update->execute([password_hash($password, PASSWORD_DEFAULT), $userEmail]);
                if ($update->rowCount() < 1) throw new RuntimeException('No se pudo actualizar la cuenta.');
                $pdo->prepare('DELETE FROM password_resets WHERE email = ?')->execute([$userEmail]);
                $pdo->commit();
                session_regenerate_id(true);
                $tokenValid = false;
                $message = 'La contraseña fue actualizada correctamente. Ya puedes iniciar sesión.';
                $messageType = 'success';
            } catch (Throwable $e) {
                if ($pdo->inTransaction()) $pdo->rollBack();
                error_log('Error al restablecer contraseña: ' . $e->getMessage());
                $message = 'No fue posible actualizar la contraseña. Solicita un enlace nuevo.';
                $messageType = 'error';
            }
        }
    }
}

$authPageTitle = $ui_reset_page_title ?? 'Crear nueva contraseña';
$authEyebrow = $ui_reset_eyebrow ?? 'ENLACE TEMPORAL';
$authTitle = $ui_reset_hero_title ?? 'Define una contraseña nueva para recuperar el acceso.';
$authDescription = $ui_reset_hero_description ?? 'El enlace es de un solo uso y queda invalidado al actualizar la contraseña.';
$authFormTitle = $tokenValid ? ($ui_reset_form_title ?? 'Nueva contraseña') : 'Enlace no disponible';
$authFormDescription = $tokenValid ? ($ui_reset_form_description ?? 'Utiliza una combinación segura de al menos 10 caracteres.') : 'Solicita un nuevo enlace para continuar con la recuperación.';
$authFormIcon = $tokenValid ? 'fas fa-lock' : 'fas fa-link-slash';
$authBenefits = [
    ['icon' => 'fas fa-key', 'title' => 'Clave renovada', 'text' => 'La contraseña anterior deja de funcionar inmediatamente.'],
    ['icon' => 'fas fa-hourglass-half', 'title' => 'Vencimiento controlado', 'text' => 'Los enlaces caducan después de una hora.'],
    ['icon' => 'fas fa-shield-halved', 'title' => 'Token protegido', 'text' => 'La base de datos conserva únicamente el hash del token.'],
];
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; ?>

<?php if ($tokenValid): ?>
<form method="post" action="reset_password.php?token=<?= auth_e(urlencode($token)) ?>" class="auth-form" data-auth-form novalidate>
    <?= Security::csrfField() ?>

    <div class="auth-field">
        <label for="new-password"><i class="fas fa-lock"></i><?= auth_e($ui_reset_password_label ?? 'Nueva contraseña') ?></label>
        <div class="auth-input-wrap">
            <i class="fas fa-lock auth-input-icon"></i>
            <input id="new-password" name="password" type="password" autocomplete="new-password" minlength="10" required placeholder="Mínimo 10 caracteres" data-clear-placeholder data-password-strength>
            <button type="button" class="auth-password-toggle" data-password-toggle="new-password" aria-label="Mostrar contraseña"><i class="fas fa-eye"></i></button>
        </div>
        <div class="password-strength"><span data-password-strength-bar></span></div>
        <small data-password-strength-text>Utiliza mayúsculas, minúsculas, números y, de preferencia, un símbolo.</small>
        <div class="field-error" data-error-for="password" role="alert"></div>
    </div>

    <div class="auth-field">
        <label for="new-password-confirmation"><i class="fas fa-shield-halved"></i><?= auth_e($ui_reset_confirm_label ?? 'Confirmar contraseña') ?></label>
        <div class="auth-input-wrap">
            <i class="fas fa-shield-halved auth-input-icon"></i>
            <input id="new-password-confirmation" name="confirm_password" type="password" autocomplete="new-password" minlength="10" required placeholder="Repite tu nueva contraseña" data-clear-placeholder>
            <button type="button" class="auth-password-toggle" data-password-toggle="new-password-confirmation" aria-label="Mostrar contraseña"><i class="fas fa-eye"></i></button>
        </div>
        <div class="field-error" data-error-for="confirm_password" role="alert"></div>
    </div>

    <button type="submit" class="auth-submit" data-loading-text="Actualizando…"><i class="fas fa-shield-check"></i><span><?= auth_e($ui_reset_button_text ?? 'Actualizar contraseña') ?></span></button>
</form>
<?php elseif ($messageType === 'success'): ?>
    <div class="auth-form" style="margin-top:24px"><a class="auth-submit" href="login.php"><i class="fas fa-right-to-bracket"></i><span>Iniciar sesión</span></a></div>
<?php else: ?>
    <div class="auth-form" style="margin-top:24px">
        <div class="auth-alert auth-alert--warning"><i class="fas fa-clock-rotate-left"></i><span>El enlace pudo vencer, haber sido utilizado o no ser válido.</span></div>
        <a class="auth-submit" href="solicitar_reset.php"><i class="fas fa-paper-plane"></i><span><?= auth_e($ui_reset_new_link_text ?? 'Solicitar un enlace nuevo') ?></span></a>
        <div class="auth-secondary-link"><a href="login.php">Volver al inicio de sesión</a></div>
    </div>
<?php endif; ?>

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