<?php
/**
 * Require Authentication Helper
 * Valida que existe una sesión activa con usuario válido
 * Redirecciona al login si no hay sesión o el usuario es inválido
 *
 * USO:
 * require_once __DIR__ . '/../../includes/require-auth.php';
 * $user = requireAuth($auth);
 * $adminId = $user['id'];
 * $rol = $user['rol'] ?? 'asesor';
 */

use App\Services\AuthService;

if (!function_exists('requireAuth')) {
    /**
     * Requiere autenticación válida
     * Redirecciona al login si no hay sesión
     *
     * @param AuthService $auth Instancia del servicio de autenticación
     * @return array Usuario autenticado con campos: id, email, nombre, rol, created_at
     */
    function requireAuth(AuthService $auth): array
    {
        // Validar que hay sesión activa y usuario válido
        $user = $auth->requireAuth();

        // Doble validación: asegurar que el rol existe y es válido
        if (!isset($user['rol']) || !in_array($user['rol'], ['administrador', 'asesor'], true)) {
            // Si el rol no existe o es inválido, asignar asesor por defecto y loguear
            $user['rol'] = 'asesor';

            if (class_exists('App\Services\Logger')) {
                $logger = new App\Services\Logger();
                $logger->logSecurity(
                    'invalid_role',
                    "User {$user['id']} has invalid or missing role, defaulting to asesor",
                    'warning',
                    ['user_id' => $user['id'], 'email' => $user['email']]
                );
            }
        }

        // Sincronizar rol en sesión para compatibilidad con código antiguo
        if (!isset($_SESSION['admin_rol']) || $_SESSION['admin_rol'] !== $user['rol']) {
            $_SESSION['admin_rol'] = $user['rol'];
        }

        return $user;
    }
}

if (!function_exists('requireRole')) {
    /**
     * Requiere un rol específico
     * Redirecciona al dashboard si el usuario no tiene el rol requerido
     *
     * @param string $requiredRole Rol requerido ('administrador' o 'asesor')
     * @param string $currentRole Rol actual del usuario
     * @param string $redirectUrl URL de redirección si no tiene el rol (default: dashboard)
     * @return void
     */
    function requireRole(string $requiredRole, string $currentRole, string $redirectUrl = null): void
    {
        if ($currentRole !== $requiredRole) {
            $redirectUrl = $redirectUrl ?? base_url('admin/dashboard');
            header('Location: ' . $redirectUrl);
            exit;
        }
    }
}
