<?php
/**
 * Gestionnaire de sessions utilisateur
 * Fichier : includes/session.php
 */

// ═══════════════════════════════════════════════════════════════
// CONFIGURATION COOKIES DE SESSION
// ═══════════════════════════════════════════════════════════════
// IMPORTANT : Doit être fait AVANT session_start() !

// Méthode recommandée : session_set_cookie_params()
// Définir le nom de session (doit être fait AVANT session_start)
session_name('PHPSESSID');  // Utiliser le nom standard pour cohérence

session_set_cookie_params([
    'lifetime' => 0,                    // Cookie de session (expire à la fermeture navigateur)
    'path' => '/mathematiques/',        // Chemin - CRITIQUE pour que la session persiste
    'domain' => '',                     // Domaine par défaut
    'secure' => false,                  // HTTPS seulement (false car on utilise HTTP)
    'httponly' => true,                 // Pas accessible via JavaScript (sécurité XSS)
    'samesite' => 'Lax'                // Protection CSRF (Lax = compatible avec redirections)
]);

// Configuration supplémentaire via ini_set (pour compatibilité)
ini_set('session.use_strict_mode', '1');
ini_set('session.gc_maxlifetime', '5400');  // 90 minutes d'inactivité max (x3)

// Démarrage de la session
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}


/**
 * Classe SessionManager - Gestion centralisée des sessions
 */
class SessionManager {
    
    /**
     * Durée de vie de la session en secondes (90 minutes)
     */
    private const SESSION_LIFETIME = 5400; // 90 minutes (x3)
    
    /**
     * Vérifier si l'utilisateur est connecté
     */
    public static function isLoggedIn() {
        // Vérifier si la session contient un utilisateur
        if (!isset($_SESSION['user_id'])) {
            return false;
        }
        
        // Vérifier le timeout de session
        if (isset($_SESSION['last_activity'])) {
            $elapsed = time() - $_SESSION['last_activity'];
            if ($elapsed > self::SESSION_LIFETIME) {
                self::logout();
                return false;
            }
        }
        
        // Vérifier la cohérence du user agent (sécurité basique)
        if (isset($_SESSION['user_agent'])) {
            if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) {
                self::logout();
                return false;
            }
        }
        
        // Mettre à jour le timestamp d'activité
        $_SESSION['last_activity'] = time();
        
        return true;
    }
    
    /**
     * Créer une session pour un utilisateur
     * 
     * @param array $utilisateur Données de l'utilisateur depuis la BDD
     */
    public static function login($utilisateur) {
        // Régénérer l'ID de session pour éviter la fixation
        session_regenerate_id(false);  // false = garde ancien fichier pour éviter race condition
        
        // Stocker les informations utilisateur
        $_SESSION['user_id'] = $utilisateur['id_utilisateur'];
        $_SESSION['login'] = $utilisateur['login'];
        $_SESSION['nom'] = $utilisateur['nom'];
        $_SESSION['prenom'] = $utilisateur['prenom'];
        $_SESSION['id_type'] = $utilisateur['id_type'];
        $_SESSION['type_libelle'] = $utilisateur['type_libelle'];
        $_SESSION['id_classe'] = $utilisateur['id_classe'] ?? null;
        $_SESSION['nom_classe'] = $utilisateur['nom_classe'] ?? null;
        $_SESSION['niveau'] = $utilisateur['niveau'] ?? null;
        
        // Informations de sécurité
        $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
        $_SESSION['last_activity'] = time();
        $_SESSION['login_time'] = time();
        
        // Mettre à jour la date de dernière connexion
        self::updateLastLogin($utilisateur['id_utilisateur']);
    }
    
    /**
     * Détruire la session (déconnexion)
     */
    public static function logout() {
        $_SESSION = array();
        
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), '', time() - 3600, '/');
        }
        
        session_destroy();
    }
    
    /**
     * Récupérer les informations de l'utilisateur connecté
     * 
     * @return array|null Données utilisateur ou null si non connecté
     */
    public static function getUser() {
        if (!self::isLoggedIn()) {
            return null;
        }
        
        return [
            'id_utilisateur' => $_SESSION['user_id'],
            'id' => $_SESSION['user_id'], // Alias pour compatibilité
            'login' => $_SESSION['login'],
            'nom' => $_SESSION['nom'],
            'prenom' => $_SESSION['prenom'],
            'id_type' => $_SESSION['id_type'],
            'type_libelle' => $_SESSION['type_libelle'],
            'id_classe' => $_SESSION['id_classe'],
            'nom_classe' => $_SESSION['nom_classe'],
            'niveau' => $_SESSION['niveau']
        ];
    }
    
    /**
     * Vérifier si l'utilisateur est un élève
     */
    public static function isEleve() {
        return self::isLoggedIn() && 
               (isset($_SESSION['id_type']) && 
                ($_SESSION['id_type'] == 2 || $_SESSION['id_type'] == 3));
    }
    
    /**
     * Vérifier si l'utilisateur est un élève libre (soutien)
     */
    public static function isEleveLibre() {
        return self::isLoggedIn() && 
               (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 3);
    }
    
    /**
     * Vérifier si l'utilisateur est un élève de classe fixe
     */
    public static function isEleveClasse() {
        return self::isLoggedIn() && 
               (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 2);
    }
    
    /**
     * Vérifier si l'utilisateur est un enseignant
     */
    public static function isEnseignant() {
        return self::isLoggedIn() && 
               (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 1);
    }
    
    /**
     * Mettre à jour la date de dernière connexion
     * 
     * @param int $userId ID de l'utilisateur
     */
    private static function updateLastLogin($userId) {
        try {
            require_once __DIR__ . '/../config/database.php';
            $db = Database::getInstance();
            
            $query = "UPDATE utilisateurs 
                      SET date_derniere_connexion = NOW() 
                      WHERE id_utilisateur = ?";
            
            $db->query($query, [$userId]);
        } catch (Exception $e) {
            error_log("Erreur mise à jour dernière connexion : " . $e->getMessage());
        }
    }
    
    /**
     * Obtenir le temps restant de session en secondes
     */
    public static function getRemainingTime() {
        if (!self::isLoggedIn()) {
            return 0;
        }
        
        $elapsed = time() - $_SESSION['last_activity'];
        return max(0, self::SESSION_LIFETIME - $elapsed);
    }
}
