<?php
/**
 * Protection de session pour les pages admin - SERVICES-AE
 * À inclure au début de chaque page admin
 */

// Inclure la configuration des sessions AVANT de les démarrer
require_once __DIR__ . '/session-config.php';

// Démarrer la session si ce n'est pas déjà fait
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Pages qui n'ont pas besoin d'authentification
$public_pages = [
    'admin-login.php', 
    'login.php', 
    'logout-success.php',
    'index.php' // page d'accueil du site
];

$current_page_file = basename($_SERVER['PHP_SELF']);
$current_uri = $_SERVER['REQUEST_URI'] ?? '';

// Vérifier si on est sur une page qui nécessite une authentification
$needs_auth = !in_array($current_page_file, $public_pages);

// Si on est dans le dossier admin, toutes les pages nécessitent une auth sauf exceptions
if (strpos($current_uri, '/admin/') !== false) {
    $needs_auth = true;
}

if ($needs_auth) {
    // Vérifier si l'utilisateur est connecté
    if (!isset($_SESSION['admin_logged_in']) || $_SESSION['admin_logged_in'] !== true) {
        
        // Déterminer le chemin correct vers la page de login
        $login_path = 'admin-login.php';
        
        // Si on est dans le dossier admin, remonter d'un niveau
        if (strpos($current_uri, '/admin/') !== false) {
            $login_path = '../admin-login.php';
        }
        
        // Log de la tentative d'accès non autorisé
        $log_message = sprintf(
            "Unauthorized access attempt - Page: %s, URI: %s, Time: %s, IP: %s",
            $current_page_file,
            $current_uri,
            date('Y-m-d H:i:s'),
            $_SERVER['REMOTE_ADDR'] ?? 'unknown'
        );
        error_log($log_message);
        
        // Vérifier si c'est une requête AJAX
        $is_ajax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
                   strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
        
        // Ou vérifier si le paramètre ajax=1 est présent
        $is_ajax = $is_ajax || (isset($_POST['ajax']) && $_POST['ajax'] === '1') || 
                               (isset($_GET['ajax']) && $_GET['ajax'] === '1');
        
        if ($is_ajax) {
            // Retourner une réponse JSON pour les requêtes AJAX
            header('Content-Type: application/json');
            http_response_code(401);
            echo json_encode([
                'success' => false,
                'error' => 'auth_required',
                'message' => 'Authentification requise',
                'redirect' => $login_path
            ]);
            exit();
        } else {
            // Rediriger vers la page de connexion avec un message pour les requêtes normales
            $redirect_url = $login_path . '?redirect=' . urlencode($current_uri) . '&msg=auth_required';
            header("Location: " . $redirect_url);
            exit();
        }
    }
    
    // Vérifier si la session n'a pas expiré (24 heures par défaut)
    $session_timeout = 24 * 60 * 60; // 24 heures en secondes
    
    if (isset($_SESSION['admin_login_time'])) {
        if ((time() - $_SESSION['admin_login_time']) > $session_timeout) {
            // Session expirée
            session_destroy();
            
            // Log de l'expiration
            error_log("Session expired for user: " . ($_SESSION['admin_username'] ?? 'unknown') . " at " . date('Y-m-d H:i:s'));
            
            // Vérifier si c'est une requête AJAX
            $is_ajax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
                       strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
            $is_ajax = $is_ajax || (isset($_POST['ajax']) && $_POST['ajax'] === '1') || 
                                   (isset($_GET['ajax']) && $_GET['ajax'] === '1');
            
            if ($is_ajax) {
                // Retourner une réponse JSON pour les requêtes AJAX
                header('Content-Type: application/json');
                http_response_code(401);
                echo json_encode([
                    'success' => false,
                    'error' => 'session_expired',
                    'message' => 'Session expirée',
                    'redirect' => $login_path
                ]);
                exit();
            } else {
                // Rediriger avec message d'expiration pour les requêtes normales
                $login_path = (strpos($current_uri, '/admin/') !== false) ? '../admin-login.php' : 'admin-login.php';
                header("Location: " . $login_path . '?msg=session_expired');
                exit();
            }
        }
        
        // Renouveler le timestamp de session (pour session glissante)
        $_SESSION['admin_last_activity'] = time();
    }
}

/**
 * Fonction utilitaire pour vérifier si l'utilisateur est admin
 */
function isAdminLoggedIn() {
    return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
}

/**
 * Fonction utilitaire pour obtenir le nom d'utilisateur admin
 */
function getAdminUsername() {
    return $_SESSION['admin_username'] ?? 'Inconnu';
}

/**
 * Fonction utilitaire pour forcer la déconnexion
 */
function forceLogout($reason = 'manual') {
    if (session_status() === PHP_SESSION_ACTIVE) {
        // Log de la déconnexion
        error_log("Force logout - Reason: $reason, User: " . getAdminUsername() . ", Time: " . date('Y-m-d H:i:s'));
        
        // Détruire la session
        session_destroy();
    }
    
    // Redirection vers la page de login
    $current_uri = $_SERVER['REQUEST_URI'] ?? '';
    $login_path = (strpos($current_uri, '/admin/') !== false) ? '../admin-login.php' : 'admin-login.php';
    header("Location: " . $login_path . '?msg=logged_out');
    exit();
}

// Définir la variable globale $admin_logged pour compatibilité
$admin_logged = isAdminLoggedIn();
?>