<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") { http_response_code(200); exit; }

ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once(__DIR__ . "/../config.php");
require_once(__DIR__ . "/../auth_guard.php");

$authUser   = requireAuth($JWT_KEY);
$activeUser = requireActiveUser($mysqli, $authUser);

function ok($data = [], $message = "OK") {
    echo json_encode(array_merge(["success" => true, "message" => $message], $data));
    exit;
}
function fail($message, $code = 400) {
    http_response_code($code);
    echo json_encode(["success" => false, "message" => $message]);
    exit;
}

$idInstitucion = isset($_GET["ID_INSTITUCION"]) ? (int)$_GET["ID_INSTITUCION"] : 0;
$idDocente     = isset($_GET["ID_DOCENTE"])     ? (int)$_GET["ID_DOCENTE"]     : 0;
$idCurso       = isset($_GET["ID_CURSO"])       ? (int)$_GET["ID_CURSO"]       : 0;

if ($idInstitucion <= 0 && $idDocente > 0) {
    $stDoc = $mysqli->prepare("SELECT ID_INSTITUCION FROM DOCENTES WHERE ID_DOCENTE = ? LIMIT 1");
    if (!$stDoc) fail("Error resolviendo institucion: " . $mysqli->error);
    $stDoc->bind_param("i", $idDocente);
    $stDoc->execute();
    $rowDoc = $stDoc->get_result()->fetch_assoc();
    if (!$rowDoc) fail("Docente no encontrado.", 404);
    $idInstitucion = (int)$rowDoc["ID_INSTITUCION"];
}

if ($idInstitucion <= 0) fail("Se requiere ID_INSTITUCION o ID_DOCENTE.");

$sqlCursos = "SELECT ID_CURSO, NOMBRE_CURSO, GRADO_CURSO, JORNADA_CURSO,
    (SELECT COUNT(*) FROM MATRICULAS m WHERE m.ID_CURSO = c.ID_CURSO AND m.ESTADO_MATRICULA = 1) AS TOTAL_ESTUDIANTES
    FROM CURSOS c
    WHERE c.ID_INSTITUCION = ? AND c.ESTADO_CURSO = 1
    ORDER BY c.GRADO_CURSO, c.NOMBRE_CURSO";

$stC = $mysqli->prepare($sqlCursos);
if (!$stC) fail("Error preparando cursos: " . $mysqli->error);
$stC->bind_param("i", $idInstitucion);
$stC->execute();
$resCursos = $stC->get_result();
$cursos = [];
while ($c = $resCursos->fetch_assoc()) $cursos[] = $c;

$sqlEst = "SELECT m.ID_CURSO, e.ID_ESTUDIANTE,
    CONCAT(e.NOMBRE_ESTUDIANTE,' ',e.APELLIDO_ESTUDIANTE) AS NOMBRE_COMPLETO,
    e.DOCUMENTO_ESTUDIANTE, e.CORREO_ESTUDIANTE, e.GENERO_ESTUDIANTE
    FROM MATRICULAS m
    INNER JOIN ESTUDIANTES e ON e.ID_ESTUDIANTE = m.ID_ESTUDIANTE
    INNER JOIN CURSOS c ON c.ID_CURSO = m.ID_CURSO
    WHERE c.ID_INSTITUCION = ? AND m.ESTADO_MATRICULA = 1 AND e.ESTADO_ESTUDIANTE = 1";

$params = [$idInstitucion];
$types  = "i";

if ($idCurso > 0) {
    $sqlEst  .= " AND m.ID_CURSO = ?";
    $params[] = $idCurso;
    $types   .= "i";
}

$sqlEst .= " ORDER BY m.ID_CURSO, e.APELLIDO_ESTUDIANTE, e.NOMBRE_ESTUDIANTE";

$stE = $mysqli->prepare($sqlEst);
if (!$stE) fail("Error preparando estudiantes: " . $mysqli->error);

$refs = [$types];
foreach ($params as $k => $v) $refs[] = &$params[$k];
call_user_func_array([$stE, 'bind_param'], $refs);
$stE->execute();
$resEst = $stE->get_result();
$estudPorCurso = [];
while ($e = $resEst->fetch_assoc()) {
    $estudPorCurso[$e["ID_CURSO"]][] = $e;
}

foreach ($cursos as &$c) {
    $c["estudiantes"] = isset($estudPorCurso[$c["ID_CURSO"]]) ? $estudPorCurso[$c["ID_CURSO"]] : [];
}
unset($c);

ok(["data" => $cursos], "Cursos con estudiantes obtenidos");