<?php
/**
 * Vérification d'authentification
 * Inclure ce fichier dans toutes les pages protégées.
 * IMPORTANT : config/database.php doit être inclus AVANT ce fichier
 * car il définit BASE_URL et démarre la session.
 */
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// BASE_URL doit être défini par config/database.php
// Si ce n'est pas le cas (inclusion directe incorrecte), on définit une valeur de secours.
if (!defined('BASE_URL')) {
    $appDir  = str_replace('\\', '/', dirname(__DIR__));
    $docRoot = str_replace('\\', '/', rtrim((string)($_SERVER['DOCUMENT_ROOT'] ?? ''), '/'));
    $basePath = '';
    if ($docRoot !== '' && $appDir !== $docRoot && strpos($appDir . '/', $docRoot . '/') === 0) {
        $basePath = substr($appDir, strlen($docRoot));
    }
    define('BASE_PATH', $basePath . '/');
    define('BASE_URL', (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . BASE_PATH);
}

// ─── Protection contre le détournement de session ─────────────────────────────
if (isset($_SESSION['user_id'])) {
    $currentUserAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    if (!isset($_SESSION['_fingerprint'])) {
        $_SESSION['_fingerprint'] = hash('sha256', $currentUserAgent);
    }
    if (!hash_equals($_SESSION['_fingerprint'], hash('sha256', $currentUserAgent))) {
        session_unset();
        session_destroy();
        header('Location: ' . BASE_URL . 'auth/login.php?reason=security');
        exit;
    }
}

// ─── Vérification compte actif ────────────────────────────────────────────────
if (isset($_SESSION['user_id'])) {
    $uid = (int)$_SESSION['user_id'];
    if (isset($pdo) && $pdo) {
        try {
            $st = $pdo->prepare("SELECT active FROM users WHERE id=?");
            $st->execute([$uid]);
            $active = (int)$st->fetchColumn();
        } catch (PDOException $e) {
            $active = isset($_SESSION['user_active']) && (int)$_SESSION['user_active'] ? 1 : 0;
        }
    } else {
        $active = isset($_SESSION['user_active']) && (int)$_SESSION['user_active'] ? 1 : 0;
    }
    $_SESSION['user_active'] = $active;
    if (!$active) {
        session_unset();
        session_destroy();
        header('Location: ' . BASE_URL . 'auth/login.php?reason=disabled');
        exit;
    }
}

// ─── Vérification session inactive (idle timeout 30 min) ──────────────────────
if (isset($_SESSION['user_id'])) {
    $idleTimeout = 1800;
    if (isset($_SESSION['_last_activity']) && (time() - $_SESSION['_last_activity'] > $idleTimeout)) {
        session_unset();
        session_destroy();
        header('Location: ' . BASE_URL . 'auth/login.php?reason=timeout');
        exit;
    }
    $_SESSION['_last_activity'] = time();
}

// ─── Vérification connexion ───────────────────────────────────────────────────
if (!isset($_SESSION['user_id'])) {
    $reqPath = parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH) ?? '';
    if (defined('BASE_PATH') && BASE_PATH !== '/' && strpos($reqPath, BASE_PATH) === 0) {
        $reqPath = substr($reqPath, strlen(BASE_PATH));
    }
    $_SESSION['redirect_after_login'] = BASE_URL . ltrim($reqPath, '/');
    header('Location: ' . BASE_URL . 'auth/login.php');
    exit;
}

// ─── Rediriger les élèves/parents vers leur portail s'ils accèdent à l'admin ──
$currentRole = $_SESSION['user_role'] ?? '';
$currentPath = $_SERVER['PHP_SELF'] ?? '';
$isPortalPage = strpos($currentPath, '/portal/') !== false;
$isAdminPage  = strpos($currentPath, '/admin/')  !== false;

if (in_array($currentRole, ['student', 'parent'], true) && $isAdminPage) {
    header('Location: ' . BASE_URL . 'portal/dashboard.php');
    exit;
}
if (in_array($currentRole, ['super_admin','school_admin','teacher','accountant'], true) && $isPortalPage) {
    header('Location: ' . BASE_URL . 'admin/dashboard.php');
    exit;
}

// ─── Vérification du rôle ─────────────────────────────────────────────────────

/**
 * Restreint l'accès aux rôles autorisés.
 */
function checkRole($allowedRoles): void {
    if (!is_array($allowedRoles)) $allowedRoles = [$allowedRoles];
    if (!in_array($_SESSION['user_role'] ?? '', $allowedRoles, true)) {
        $role = $_SESSION['user_role'] ?? '';
        if (in_array($role, ['student', 'parent'], true)) {
            header('Location: ' . BASE_URL . 'portal/dashboard.php');
        } else {
            header('Location: ' . BASE_URL . 'admin/dashboard.php');
        }
        exit;
    }
}

/**
 * Retourne true si l'utilisateur courant a l'un des rôles donnés.
 */
function isSuperAdmin(): bool {
    return ($_SESSION['user_role'] ?? '') === 'super_admin';
}

function hasRole($roles): bool {
    if (!is_array($roles)) $roles = [$roles];
    return in_array($_SESSION['user_role'] ?? '', $roles, true);
}

/**
 * Retourne le school_id de l'utilisateur connecté (null = super_admin).
 */
function currentSchoolId(): ?int {
    return isset($_SESSION['school_id']) && $_SESSION['school_id']
        ? (int)$_SESSION['school_id']
        : null;
}

/**
 * Retourne true si l'utilisateur connecté peut gérer le compte $target.
 */
function canManageUser(array $target): bool {
    $role = $_SESSION['user_role'] ?? '';
    if ($role === 'super_admin') return true;
    if ($role === 'school_admin') {
        $targetSchool = $target['school_id'] ?? 0;
        return $targetSchool && (int)$targetSchool === (int)($_SESSION['school_id'] ?? 0)
            && !in_array($target['role'] ?? '', ['super_admin','school_admin'], true);
    }
    return false;
}

/**
 * Vérifie la permission et redirige si refusée.
 */
function requirePermission(string $page, string $action = 'view'): void {
    if (!hasPermission($page, $action)) {
        flashMessage('error', 'Vous n\'avez pas les droits pour effectuer cette action.');
        header('Location: ' . BASE_URL . 'admin/dashboard.php');
        exit;
    }
}
