<?php
require_once __DIR__ . '/config.php';

$error = null;
if (($_GET['motivo'] ?? '') === 'sesion_invalida') {
    $error = 'Tu sesión ya no es válida (la cuenta pudo haber cambiado). Inicia sesión de nuevo.';
}
const MAX_INTENTOS = 5;
const MINUTOS_BLOQUEO = 15;

// ── Si ya hay sesión activa, no mostrar login de nuevo ─────────
if (usuarioActual()) {
    header('Location: portal.php');
    exit;
}

// ── Auto-login vía cookie "recordarme" (selector/validador) ────
if (!usuarioActual() && !empty($_COOKIE['recordarme'])) {
    [$selector, $validador] = array_pad(explode(':', $_COOKIE['recordarme'], 2), 2, '');
    if ($selector && $validador) {
        $pdo = db();
        $stmt = $pdo->prepare("
            SELECT sr.*, u.id AS uid, u.nombre_completo, u.correo, u.rol, u.activo
            FROM sesiones_recordarme sr
            JOIN usuarios u ON u.id = sr.usuario_id
            WHERE sr.selector = ? AND sr.expira_en > NOW()
        ");
        $stmt->execute([$selector]);
        $fila = $stmt->fetch();

        if ($fila && $fila['activo'] && hash_equals($fila['validador_hash'], hash('sha256', $validador))) {
            session_regenerate_id(true);
            $_SESSION['usuario'] = [
                'id' => $fila['uid'], 'nombre' => $fila['nombre_completo'],
                'correo' => $fila['correo'], 'rol' => $fila['rol'],
            ];
            header('Location: portal.php');
            exit;
        }
        // Cookie inválida/expirada: se limpia para no reintentar en cada carga.
        setcookie('recordarme', '', time() - 3600, '/', '', false, true);
    }
}

// ── Procesar envío del formulario ───────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrfValidarOMorir();

    $correo    = trim($_POST['correo'] ?? '');
    $password  = $_POST['password'] ?? '';
    $recordar  = !empty($_POST['recordarme']);

    if (!$correo || !$password) {
        $error = 'Ingresa tu correo y contraseña.';
    } else {
        $pdo = db();
        $stmt = $pdo->prepare("SELECT * FROM usuarios WHERE correo = ?");
        $stmt->execute([$correo]);
        $u = $stmt->fetch();

        // Mensaje genérico siempre — nunca revelar si el correo existe o no.
        $credencialesInvalidas = 'Correo o contraseña incorrectos.';

        if (!$u || !$u['activo']) {
            $error = $credencialesInvalidas;
        } elseif ($u['bloqueado_hasta'] && strtotime($u['bloqueado_hasta']) > time()) {
            $minutosRestantes = ceil((strtotime($u['bloqueado_hasta']) - time()) / 60);
            $error = "Cuenta bloqueada temporalmente por múltiples intentos fallidos. Intenta de nuevo en {$minutosRestantes} minuto(s).";
        } elseif (!password_verify($password, $u['password_hash'])) {
            $intentos = $u['intentos_fallidos'] + 1;
            $bloqueado_hasta = null;
            if ($intentos >= MAX_INTENTOS) {
                $bloqueado_hasta = date('Y-m-d H:i:s', time() + MINUTOS_BLOQUEO * 60);
                $intentos = 0; // se reinicia el contador junto con el bloqueo
            }
            $pdo->prepare("UPDATE usuarios SET intentos_fallidos = ?, bloqueado_hasta = ? WHERE id = ?")
                ->execute([$intentos, $bloqueado_hasta, $u['id']]);
            $error = $credencialesInvalidas;
        } else {
            // ── Login correcto ──────────────────────────────────
            $pdo->prepare("
                UPDATE usuarios SET intentos_fallidos = 0, bloqueado_hasta = NULL, ultimo_login = NOW()
                WHERE id = ?
            ")->execute([$u['id']]);

            // Regenerar el ID de sesión previene fijación de sesión.
            session_regenerate_id(true);
            $_SESSION['usuario'] = [
                'id' => $u['id'], 'nombre' => $u['nombre_completo'],
                'correo' => $u['correo'], 'rol' => $u['rol'],
            ];

            if ($recordar) {
                $selector  = bin2hex(random_bytes(9));
                $validador = bin2hex(random_bytes(32));
                $expira    = date('Y-m-d H:i:s', time() + 30 * 24 * 3600); // 30 días

                $pdo->prepare("
                    INSERT INTO sesiones_recordarme (usuario_id, selector, validador_hash, expira_en)
                    VALUES (?, ?, ?, ?)
                ")->execute([$u['id'], $selector, hash('sha256', $validador), $expira]);

                setcookie('recordarme', "$selector:$validador", [
                    'expires'  => time() + 30 * 24 * 3600,
                    'path'     => '/',
                    'secure'   => !empty($_SERVER['HTTPS']),
                    'httponly' => true,
                    'samesite' => 'Lax',
                ]);
            }

            header('Location: portal.php');
            exit;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Iniciar sesión — Fondo Documental SGC</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="estilos.css" rel="stylesheet">
</head>
<body class="pagina-auth">
<div class="container">
<div class="card card-login">
    <div class="card-body">
        <div class="d-flex align-items-center gap-2 mb-4">
            <div class="logo-badge"><i class="bi bi-music-note-beamed"></i></div>
            <div>
                <p class="fw-semibold mb-0" style="font-size:.95rem">Fondo documental SGC</p>
                <p class="text-muted mb-0" style="font-size:.78rem">Gestor documental de obras</p>
            </div>
        </div>

        <?php if ($error): ?>
            <div class="alert alert-danger py-2 mb-3"><i class="bi bi-exclamation-circle me-1"></i> <?= htmlspecialchars($error) ?></div>
        <?php endif; ?>

        <form method="post" novalidate>
            <?= csrfCampoOculto() ?>
            <div class="mb-3">
                <label class="form-label">Correo electrónico</label>
                <input type="email" name="correo" class="form-control" required autofocus
                       value="<?= htmlspecialchars($_POST['correo'] ?? '') ?>">
            </div>
            <div class="mb-2">
                <label class="form-label">Contraseña</label>
                <input type="password" name="password" class="form-control" required>
            </div>
            <div class="d-flex justify-content-between align-items-center mb-3">
                <div class="form-check">
                    <input class="form-check-input" type="checkbox" name="recordarme" id="recordarme">
                    <label class="form-check-label" for="recordarme" style="font-size:.8rem">Recordarme</label>
                </div>
                <a href="recuperar_password.php" style="font-size:.8rem;color:var(--azul-texto)">Olvidé mi contraseña</a>
            </div>
            <button type="submit" class="btn btn-sgc-primary w-100 mb-2">Iniciar sesión</button>
            <a href="registro.php" class="btn btn-outline-secondary w-100">Crear cuenta gratuita</a>
        </form>
        <p class="text-muted text-center mt-3 mb-0" style="font-size:.72rem">
            El rol de la cuenta lo asigna el administrador. Las cuentas nuevas inician como cargador.
        </p>
    </div>
</div>
</div>
</body>
</html>
