<?php
/**
 * core/Auth.php
 * Gestión de sesión y autenticación de usuarios del panel.
 * Extraído de config/config.php para separar responsabilidades.
 *
 * USO:
 *   require_once __DIR__ . '/../core/Auth.php';
 *   Auth::requireLogin();           // en cualquier vista protegida
 *   Auth::requireNotEnfermero();    // excluir enfermeros del panel admin
 */

class Auth
{
    // ─── Verificación de sesión ─────────────────────────────────────────────

    public static function isLoggedIn(): bool
    {
        return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
    }

    public static function requireLogin(string $redirect = 'login.php'): void
    {
        if (!self::isLoggedIn()) {
            header("Location: $redirect");
            exit;
        }
    }

    public static function requireNotEnfermero(string $redirect = 'enfermero_portal.php'): void
    {
        if (self::isEnfermero()) {
            header("Location: $redirect");
            exit;
        }
    }

    // ─── Datos del usuario en sesión ────────────────────────────────────────

    public static function id(): ?int
    {
        return isset($_SESSION['admin_user']['id'])
            ? (int) $_SESSION['admin_user']['id']
            : null;
    }

    public static function role(): string
    {
        return $_SESSION['admin_user']['role'] ?? 'admin';
    }

    public static function fullName(): string
    {
        return $_SESSION['admin_user']['full_name']
            ?? $_SESSION['admin_user']['username']
            ?? 'Usuario';
    }

    public static function roleId(): ?int
    {
        $id = $_SESSION['admin_user']['role_id'] ?? null;
        return $id ? (int) $id : null;
    }

    public static function isEnfermero(): bool
    {
        return self::role() === 'enfermero';
    }

    public static function isBacteriologo(): bool
    {
        return self::role() === 'bacteriologo';
    }

    public static function isAdmin(): bool
    {
        return self::role() === 'admin';
    }

    public static function isSuperAdmin(): bool
    {
        return self::role() === 'superadmin';
    }

    // ─── Login / Logout ─────────────────────────────────────────────────────

    /**
     * Intenta autenticar usuario contra la BD.
     * Devuelve array con datos del usuario o false si falla.
     */
    public static function attempt(string $username, string $password): array|false
    {
        // Delegar en la función legacy de config.php mientras coexistan
        // (authenticateUser está definida en config/config.php)
        return authenticateUser($username, $password);
    }

    /**
     * Establece la sesión tras un login exitoso.
     */
    public static function login(array $userData): void
    {
        session_regenerate_id(true);
        $_SESSION['admin_logged_in'] = true;
        $_SESSION['admin_user']      = $userData;
        $_SESSION['login_time']      = time();
    }

    public static function logout(): void
    {
        $_SESSION = [];
        if (ini_get('session.use_cookies')) {
            $p = session_get_cookie_params();
            setcookie(
                session_name(), '', time() - 42000,
                $p['path'], $p['domain'], $p['secure'], $p['httponly']
            );
        }
        session_destroy();
    }

    // ─── Tiempo de sesión ───────────────────────────────────────────────────

    public static function isSessionExpired(): bool
    {
        if (!isset($_SESSION['login_time'])) return false;
        $timeout = defined('SESSION_TIMEOUT') ? SESSION_TIMEOUT : 1800;
        return (time() - $_SESSION['login_time']) > $timeout;
    }

    public static function refreshSession(): void
    {
        $_SESSION['login_time'] = time();
    }
}
