<?php
namespace App\Services;

use App\Models\User;
use App\Config\Env;

/**
 * Servicio de autenticación
 */
class AuthService
{
    private $userModel;
    
    public function __construct()
    {
        $this->userModel = new User();
        $this->startSession();
    }
    
    /**
     * Inicia la sesión si no está iniciada
     */
    private function startSession()
    {
        if (session_status() === PHP_SESSION_NONE) {
            Env::load();
            
            session_name(Env::get('SESSION_NAME', 'contenedor_session'));
            
            session_start([
                'cookie_lifetime' => Env::get('SESSION_LIFETIME', 7200),
                'cookie_httponly' => true,
                'cookie_secure' => isset($_SERVER['HTTPS']),
                'use_strict_mode' => true
            ]);
        }
    }
    
    /**
     * Intenta autenticar un usuario
     * 
     * @param string $username
     * @param string $password
     * @return bool
     */
    public function login($username, $password)
    {
        $user = $this->userModel->findByUsername($username);
        
        if (!$user) {
            return false;
        }
        
        if (!$user['active']) {
            return false;
        }
        
        if (!password_verify($password, $user['password'])) {
            return false;
        }
        
        // Guardar datos del usuario en sesión
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        $_SESSION['full_name'] = $user['full_name'];
        $_SESSION['role'] = $user['role'];
        $_SESSION['logged_in'] = true;
        
        // Regenerar ID de sesión por seguridad
        session_regenerate_id(true);
        
        return true;
    }
    
    /**
     * Cierra la sesión del usuario
     */
    public function logout()
    {
        $_SESSION = [];
        
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), '', time() - 3600, '/');
        }
        
        session_destroy();
    }
    
    /**
     * Verifica si hay un usuario autenticado
     * 
     * @return bool
     */
    public function isLoggedIn()
    {
        return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true;
    }
    
    /**
     * Obtiene los datos del usuario actual
     * 
     * @return array|null
     */
    public function getCurrentUser()
    {
        if (!$this->isLoggedIn()) {
            return null;
        }
        
        return [
            'id' => $_SESSION['user_id'] ?? null,
            'username' => $_SESSION['username'] ?? null,
            'full_name' => $_SESSION['full_name'] ?? null,
            'role' => $_SESSION['role'] ?? null
        ];
    }
    
    /**
     * Verifica si el usuario tiene un rol específico
     * 
     * @param string|array $roles
     * @return bool
     */
    public function hasRole($roles)
    {
        if (!$this->isLoggedIn()) {
            return false;
        }
        
        $userRole = $_SESSION['role'] ?? null;
        
        if (is_array($roles)) {
            return in_array($userRole, $roles);
        }
        
        return $userRole === $roles;
    }
    
    /**
     * Requiere que el usuario tenga un rol específico
     * Redirige si no lo tiene
     * 
     * @param string|array $roles
     */
    public function requireRole($roles)
    {
        if (!$this->hasRole($roles)) {
            http_response_code(403);
            die('Acceso denegado. No tienes permisos para acceder a esta página.');
        }
    }
    
    /**
     * Requiere que el usuario esté autenticado
     * Redirige al login si no lo está
     */
    public function requireAuth()
    {
        if (!$this->isLoggedIn()) {
            redirect(siteUrl('login.php'));
        }
    }
    
    /**
     * Verifica si el usuario es administrador
     * 
     * @return bool
     */
    public function isAdmin()
    {
        return $this->hasRole('admin');
    }
    
    /**
     * Verifica si el usuario es coordinador
     * 
     * @return bool
     */
    public function isCoordinador()
    {
        return $this->hasRole('coordinador');
    }
    
    /**
     * Verifica si el usuario es ayudante
     * 
     * @return bool
     */
    public function isAyudante()
    {
        return $this->hasRole('ayudante');
    }
}
