<br />
<b>Warning</b>:  Undefined variable $auth in <b>/home/pevo0181/public_html/pia-soft.com/cleania/routes/index.php</b> on line <b>542</b><br />
<br />
<b>Warning</b>:  Trying to access array offset on value of type null in <b>/home/pevo0181/public_html/pia-soft.com/cleania/routes/index.php</b> on line <b>542</b><br />
<?php
// ============================================================
//  GET /api/bulletin.php?session_id=X
//  Retourne toutes les données du bulletin + rang dans la classe
// ============================================================
require_once __DIR__ . '/config.php';

$auth           = requireAuth();
$eleve_id       = $auth['eleve_id'];
$inscription_id = $auth['inscription_id'];
$db             = getDB();

$session_id = isset($_GET['session_id']) ? (int)$_GET['session_id'] : null;

// Session demandée ou dernière par défaut
if (!$session_id) {
    $s = $db->prepare("
        SELECT se.id FROM sessions_evaluation se
        JOIN notes n ON n.session_id = se.id
        WHERE n.eleve_id = ?
        ORDER BY se.ordre DESC LIMIT 1
    ");
    $s->execute([$eleve_id]);
    $session_id = $s->fetchColumn();
}
if (!$session_id) jsonError('Aucune note disponible');

// Infos session
$stmtSess = $db->prepare("SELECT * FROM sessions_evaluation WHERE id = ?");
$stmtSess->execute([$session_id]);
$session = $stmtSess->fetch();

// Infos élève + classe
$stmtEleve = $db->prepare("
    SELECT e.matricule, e.nom, e.prenom, e.date_naissance, e.sexe, e.photo,
           c.nom as classe, c.cycle_nom, n.nom_fr as niveau,
           a.libelle as annee_scolaire, a.date_debut, a.date_fin,
           i.statut as statut_inscription
    FROM eleves e
    JOIN inscriptions i ON i.eleve_id = e.id AND i.id = ?
    JOIN classes c ON c.id = i.classe_id
    JOIN niveaux n ON n.id = c.niveau_id
    JOIN annees_scolaires a ON a.id = i.annee_id
    WHERE e.id = ?
");
$stmtEleve->execute([$inscription_id, $eleve_id]);
$eleve = $stmtEleve->fetch();

// Notes de l'élève
$stmtNotes = $db->prepare("
    SELECT n.note, n.note_max, n.appreciation, n.absent,
           m.nom_fr as matiere, m.coefficient
    FROM notes n
    JOIN matieres m ON m.id = n.matiere_id
    WHERE n.eleve_id = ? AND n.session_id = ?
    ORDER BY m.nom_fr ASC
");
$stmtNotes->execute([$eleve_id, $session_id]);
$notes = $stmtNotes->fetchAll();

// Moyenne de l'élève
function calculerMoyenne(array $notes): ?float {
    $somme = 0; $coefs = 0;
    foreach ($notes as $n) {
        if (!$n['absent'] && $n['note'] !== null) {
            $somme += (float)$n['note'] * (float)$n['coefficient'];
            $coefs += (float)$n['coefficient'];
        }
    }
    return $coefs > 0 ? round($somme / $coefs, 2) : null;
}
$moyenne_eleve = calculerMoyenne($notes);

// ---- Rang dans la classe ----
// 1. Trouver la classe_id de l'élève
$stmtClasseId = $db->prepare("SELECT classe_id FROM inscriptions WHERE id = ?");
$stmtClasseId->execute([$inscription_id]);
$classe_id = $stmtClasseId->fetchColumn();

// 2. Calculer la moyenne de tous les élèves de la même classe pour cette session
$stmtTous = $db->prepare("
    SELECT n.eleve_id,
           SUM(n.note * m.coefficient) / SUM(m.coefficient) as moy
    FROM notes n
    JOIN matieres m ON m.id = n.matiere_id
    JOIN inscriptions i ON i.eleve_id = n.eleve_id AND i.classe_id = ?
    WHERE n.session_id = ? AND n.absent = 0 AND n.note IS NOT NULL
    GROUP BY n.eleve_id
    ORDER BY moy DESC
");
$stmtTous->execute([$classe_id, $session_id]);
$classement = $stmtTous->fetchAll();

$rang           = null;
$nb_eleves      = count($classement);
$moyenne_classe = null;

if ($nb_eleves > 0) {
    $total_moy = array_sum(array_column($classement, 'moy'));
    $moyenne_classe = round($total_moy / $nb_eleves, 2);
    foreach ($classement as $pos => $row) {
        if ((int)$row['eleve_id'] === (int)$eleve_id) {
            $rang = $pos + 1;
            break;
        }
    }
}

// Infos école depuis config_systeme
$stmtConfig = $db->query("SELECT cle, valeur FROM config_systeme");
$config = [];
foreach ($stmtConfig->fetchAll() as $row) {
    $config[$row['cle']] = $row['valeur'];
}

// Absences sur la période
$stmtAbs = $db->prepare("
    SELECT COUNT(*) as absences
    FROM presences
    WHERE eleve_id = ? AND statut = 'absent'
      AND date_appel BETWEEN ? AND ?
");
$stmtAbs->execute([
    $eleve_id,
    $session['date_debut'] ?? date('Y-01-01'),
    $session['date_fin']   ?? date('Y-12-31'),
]);
$absences = (int)$stmtAbs->fetchColumn();

// Appréciation globale automatique
function appreciation(float $moy): string {
    if ($moy >= 18) return 'Excellent';
    if ($moy >= 16) return 'Très bien';
    if ($moy >= 14) return 'Bien';
    if ($moy >= 12) return 'Assez bien';
    if ($moy >= 10) return 'Passable';
    if ($moy >= 8)  return 'Insuffisant';
    return 'Très insuffisant';
}

jsonOk([
    'session'        => $session,
    'eleve'          => $eleve,
    'notes'          => $notes,
    'moyenne'        => $moyenne_eleve,
    'appreciation'   => $moyenne_eleve !== null ? appreciation($moyenne_eleve) : '—',
    'rang'           => $rang,
    'nb_eleves'      => $nb_eleves,
    'moyenne_classe' => $moyenne_classe,
    'absences'       => $absences,
    'ecole'          => [
        'nom'       => $config['ecole_nom']       ?? '