<?php

declare(strict_types=1);

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

Security::headers(false);

if (!empty($_SESSION['admin']['uid'])) {
    header('Location: admin/index.php');
    exit;
}

$errorMessage = '';
$rememberedEmail = is_string($_COOKIE['remember_email'] ?? null)
    ? trim((string) $_COOKIE['remember_email'])
    : '';
$emailValue = trim((string) ($_POST['correo'] ?? $rememberedEmail));

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!Security::validateCsrf()) {
        $errorMessage = 'La sesión de seguridad venció. Recarga la página e inténtalo nuevamente.';
    } else {
        $email = filter_input(INPUT_POST, 'correo', FILTER_VALIDATE_EMAIL);
        $email = $email ? strtolower(trim((string) $email)) : null;
        $password = is_string($_POST['password'] ?? null) ? (string) $_POST['password'] : '';
        $remember = isset($_POST['remember_me']);
        $rateKey = 'admin-login|' . Security::clientIp() . '|' . hash('sha256', (string) $email);
        $limit = Security::rateLimit($rateKey, 6, 900);

        if (!$limit['allowed']) {
            $errorMessage = 'Se realizaron demasiados intentos. Vuelve a intentarlo en unos minutos.';
        } elseif (!$email || $password === '') {
            $errorMessage = $ui_login_error_generic ?? 'Completa todos los campos.';
        } else {
            try {
                $stmt = $pdo->prepare(
                    "SELECT u.id, u.clave, u.id_rol, u.correo, u.nombre_usuario, u.telefono, r.nombre_rol
                     FROM usuarios u
                     JOIN roles r ON r.id = u.id_rol
                     WHERE u.correo = ?
                     LIMIT 1"
                );
                $stmt->execute([$email]);
                $user = $stmt->fetch(PDO::FETCH_ASSOC);

                $authorizedRole = $user && in_array(
                    (string) $user['nombre_rol'],
                    ['Superadmin', 'Admin', 'Ayudante de Superadmin'],
                    true
                );

                if ($authorizedRole && password_verify($password, (string) $user['clave'])) {
                    if (password_needs_rehash((string) $user['clave'], PASSWORD_DEFAULT)) {
                        $newHash = password_hash($password, PASSWORD_DEFAULT);
                        $pdo->prepare('UPDATE usuarios SET clave = ? WHERE id = ?')->execute([$newHash, $user['id']]);
                    }

                    $permissions = [];
                    if ((string) $user['nombre_rol'] !== 'Superadmin') {
                        $permissionStmt = $pdo->prepare(
                            "SELECT p.clave_permiso
                             FROM rol_permiso rp
                             JOIN permisos p ON p.id = rp.id_permiso
                             WHERE rp.id_rol = ?"
                        );
                        $permissionStmt->execute([(int) $user['id_rol']]);
                        $permissions = $permissionStmt->fetchAll(PDO::FETCH_COLUMN, 0);
                    }

                    session_regenerate_id(true);
                    $now = time();
                    $_SESSION['admin'] = [
                        'uid' => (int) $user['id'],
                        'id_rol' => (int) $user['id_rol'],
                        'rol' => (string) $user['nombre_rol'],
                        'permisos' => array_values(array_unique(array_map('strval', $permissions))),
                        'correo' => (string) $user['correo'],
                        'nombre_usuario' => (string) $user['nombre_usuario'],
                        'telefono' => (string) ($user['telefono'] ?? ''),
                        'created_at' => $now,
                        'last_activity' => $now,
                        'fingerprint' => Security::fingerprint(),
                    ];

                    setcookie('remember_email', $remember ? (string) $user['correo'] : '', [
                        'expires' => $remember ? time() + 2592000 : time() - 3600,
                        'path' => '/',
                        'secure' => Security::isHttps(),
                        'httponly' => true,
                        'samesite' => 'Lax',
                    ]);
                    Security::clearRateLimit($rateKey);
                    header('Location: admin/index.php');
                    exit;
                }

                usleep(250000);
                $errorMessage = $ui_login_error_credentials ?? 'El correo o la contraseña no son correctos.';
            } catch (Throwable $e) {
                error_log('Error en login.php: ' . $e->getMessage());
                $errorMessage = 'Ocurrió un error en el servidor. Inténtalo más tarde.';
            }
        }
    }
} elseif (isset($_GET['error'])) {
    $errorMessage = match ((string) $_GET['error']) {
        'login_required' => $ui_login_error_login_required ?? 'Debes iniciar sesión para continuar.',
        'session_expired' => 'Tu sesión venció. Inicia sesión nuevamente.',
        'session_invalid' => 'La sesión fue cerrada por seguridad.',
        'db_error' => 'No fue posible validar tu acceso. Inténtalo más tarde.',
        default => '',
    };
}

$authPageTitle = $ui_login_page_title ?? 'Iniciar sesión';
$authEyebrow = $ui_login_eyebrow ?? 'ACCESO SEGURO';
$authTitle = $ui_login_hero_title ?? 'Centraliza tus códigos de acceso y entrégalos de forma automática desde el primer día.';
$authDescription = $ui_login_hero_description ?? 'Configura buzones, dominios y asuntos para localizar y entregar códigos con rapidez.';
$authFormTitle = $ui_login_form_title ?? 'Bienvenido de nuevo';
$authFormDescription = $ui_login_form_description ?? 'Ingresa con el correo y la contraseña que registraste al crear tu cuenta.';
$authFormIcon = 'fas fa-right-to-bracket';
$authBenefits = [
    ['icon' => 'fas fa-users-gear', 'title' => 'Operación centralizada', 'text' => 'Clientes, cuentas, dominios y vencimientos en un mismo panel.'],
    ['icon' => 'fas fa-shield-halved', 'title' => 'Privacidad configurable', 'text' => 'Controla qué asuntos son públicos y cuáles requieren autenticación.'],
    ['icon' => 'fas fa-chart-line', 'title' => 'Seguimiento comercial', 'text' => 'Revisa suscripciones, pagos, créditos y referidos según tu rol.'],
];
require __DIR__ . '/partials/auth_header.php';
?>

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

<form method="post" action="login.php" class="auth-form" data-auth-form novalidate autocomplete="on">
    <?= Security::csrfField() ?>

    <div class="auth-field">
        <label for="login-email"><i class="fas fa-envelope"></i><?= auth_e($ui_login_email_label ?? 'Correo electrónico') ?></label>
        <div class="auth-input-wrap">
            <i class="fas fa-envelope auth-input-icon"></i>
            <input id="login-email" name="correo" type="email" autocomplete="username" inputmode="email" required
                   placeholder="<?= auth_e($ui_login_email_placeholder ?? 'correo@dominio.com') ?>" data-clear-placeholder value="<?= auth_e($emailValue) ?>">
        </div>
        <small><?= auth_e($ui_login_email_help ?? 'Utiliza el correo registrado para administrar tu cuenta.') ?></small>
        <div class="field-error" data-error-for="correo" role="alert"></div>
    </div>

    <div class="auth-field">
        <label for="login-password"><i class="fas fa-lock"></i><?= auth_e($ui_login_password_label ?? 'Contraseña') ?></label>
        <div class="auth-input-wrap">
            <i class="fas fa-lock auth-input-icon"></i>
            <input id="login-password" name="password" type="password" autocomplete="current-password" required
                   placeholder="<?= auth_e($ui_login_password_placeholder ?? 'Ingresa tu contraseña') ?>" data-clear-placeholder>
            <button type="button" class="auth-password-toggle" data-password-toggle="login-password" aria-label="Mostrar contraseña" title="Mostrar contraseña"><i class="fas fa-eye"></i></button>
        </div>
        <div class="field-error" data-error-for="password" role="alert"></div>
    </div>

    <div class="auth-form-options">
        <label class="auth-check"><input type="checkbox" name="remember_me" value="1" <?= $rememberedEmail !== '' ? 'checked' : '' ?>><span><?= auth_e($ui_login_remember_text ?? 'Recordar mi correo') ?></span></label>
        <a href="solicitar_reset.php"><?= auth_e($ui_login_forgot_text ?? '¿Olvidaste tu contraseña?') ?></a>
    </div>

    <button type="submit" class="auth-submit" data-loading-text="Verificando acceso…"><i class="fas fa-right-to-bracket"></i><span><?= auth_e($ui_login_button_login ?? 'Iniciar sesión') ?></span></button>

    <div class="auth-secondary-link"><?= auth_e($ui_login_no_account_text ?? '¿No tienes cuenta?') ?> <a href="registro.php"><?= auth_e($ui_login_register_text ?? 'Crear una cuenta') ?></a></div>

    <div class="auth-security-note"><i class="fas fa-shield-halved"></i><span><strong><?= auth_e($ui_login_security_title ?? 'Tu acceso está protegido') ?></strong><?= auth_e($ui_login_security_text ?? 'La contraseña no se guarda en cookies ni se muestra dentro del sistema.') ?></span></div>
</form>

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