<?php
/**
 * lib/auth.php — Autenticación de administradores basada en sesión.
 */

declare(strict_types=1);

require_once __DIR__ . '/db.php';

/**
 * Arranca la sesión con parámetros de cookie seguros (una sola vez).
 */
function auth_boot(): void
{
    if (session_status() === PHP_SESSION_ACTIVE) {
        return;
    }
    $secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
    session_set_cookie_params([
        'httponly' => true,
        'samesite' => 'Lax',
        'secure'   => $secure,
    ]);
    session_start();
}

/**
 * Intenta autenticar a un admin por usuario/contraseña.
 * Devuelve true si las credenciales son válidas (y deja la sesión iniciada).
 */
function auth_login(string $username, string $password): bool
{
    auth_boot();

    $stmt = db()->prepare('SELECT id, username, password_hash FROM admins WHERE username = ? LIMIT 1');
    $stmt->execute([$username]);
    $admin = $stmt->fetch();

    if (!$admin || !password_verify($password, $admin['password_hash'])) {
        return false;
    }

    // Regenerar id de sesión tras el login para evitar fijación de sesión.
    session_regenerate_id(true);
    $_SESSION['admin_id'] = (int) $admin['id'];
    $_SESSION['admin_username'] = $admin['username'];
    return true;
}

/**
 * Cierra la sesión del admin.
 */
function auth_logout(): void
{
    auth_boot();
    $_SESSION = [];
    if (ini_get('session.use_cookies')) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
    }
    session_destroy();
}

/**
 * ¿Hay un admin con sesión iniciada?
 */
function is_logged_in(): bool
{
    auth_boot();
    return !empty($_SESSION['admin_id']);
}

/**
 * Nombre del admin actual (o cadena vacía).
 */
function current_admin(): string
{
    auth_boot();
    return (string) ($_SESSION['admin_username'] ?? '');
}

/**
 * Exige sesión iniciada; si no, redirige a login.php.
 * Llamar al inicio de TODA página de administración.
 */
function require_login(): void
{
    if (!is_logged_in()) {
        header('Location: login.php');
        exit;
    }
}
