<?php
// api_corp/CORP_EVALUACIONES/evaluacion_asignaciones.php
// GET    ?ID_EVALUACION=X          ? lista asignaciones de esa evaluación
// POST   { ID_EVALUACION, items:[{TIPO,ID_CURSO|ID_ESTUDIANTE}] } ? reemplaza asignaciones
// DELETE ?ID_EVALUACION=X          ? elimina todas las asignaciones de la evaluación

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, POST, DELETE, 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 jsonBody(): array {
    $raw  = file_get_contents("php://input");
    $data = json_decode($raw, true);
    return is_array($data) ? $data : [];
}
function ok($data = [], string $message = "OK"): void {
    echo json_encode(["success" => true, "message" => $message] + $data); exit;
}
function fail(string $message, int $code = 400): void {
    http_response_code($code);
    echo json_encode(["success" => false, "message" => $message]); exit;
}

$method = $_SERVER["REQUEST_METHOD"];

// ===================== GET =====================
// Devuelve las asignaciones actuales de la evaluación
if ($method === "GET") {
    $idEval = isset($_GET["ID_EVALUACION"]) ? (int)$_GET["ID_EVALUACION"] : 0;
    if ($idEval <= 0) fail("ID_EVALUACION es requerido.");

    $sql = "
        SELECT
            ea.ID_ASIGNACION_EVAL,
            ea.TIPO_ASIGNACION,
            ea.ID_CURSO,
            c.NOMBRE_CURSO,
            c.GRADO_CURSO,
            ea.ID_ESTUDIANTE,
            CONCAT(e.NOMBRE_ESTUDIANTE,' ',e.APELLIDO_ESTUDIANTE) AS NOMBRE_ESTUDIANTE,
            e.DOCUMENTO_ESTUDIANTE,
            (
                SELECT COUNT(*) FROM MATRICULAS m
                WHERE m.ID_CURSO = ea.ID_CURSO AND m.ESTADO_MATRICULA = 1
            ) AS TOTAL_ESTUDIANTES_CURSO,
            ea.FECHA_ASIGNACION
        FROM EVALUACION_ASIGNACIONES ea
        LEFT JOIN CURSOS      c ON c.ID_CURSO      = ea.ID_CURSO
        LEFT JOIN ESTUDIANTES e ON e.ID_ESTUDIANTE = ea.ID_ESTUDIANTE
        WHERE ea.ID_EVALUACION = ?
        ORDER BY ea.TIPO_ASIGNACION, ea.ID_ASIGNACION_EVAL
    ";
    $st = $mysqli->prepare($sql);
    if (!$st) fail("Error preparando consulta: " . $mysqli->error);
    $st->bind_param("i", $idEval);
    $st->execute();
    $rows = [];
    $res  = $st->get_result();
    while ($r = $res->fetch_assoc()) $rows[] = $r;

    ok(["data" => $rows], "Asignaciones obtenidas");
}

// ===================== POST =====================
// Reemplaza todas las asignaciones de la evaluación por las enviadas
// Body: { ID_EVALUACION: int, items: [ { TIPO: "CURSO"|"ESTUDIANTE", ID: int } ] }
if ($method === "POST") {
    $b      = jsonBody();
    $idEval = (int)($b["ID_EVALUACION"] ?? 0);
    $items  = $b["items"] ?? [];

    if ($idEval <= 0)         fail("ID_EVALUACION es requerido.");
    if (!is_array($items))    fail("items debe ser un arreglo.");

    // Verificar que la evaluación existe
    $stChk = $mysqli->prepare("SELECT ID_EVALUACION FROM EVALUACIONES WHERE ID_EVALUACION = ? LIMIT 1");
    if (!$stChk) fail("Error verificando evaluación.");
    $stChk->bind_param("i", $idEval);
    $stChk->execute();
    if (!$stChk->get_result()->fetch_assoc()) fail("La evaluación no existe.", 404);

    $mysqli->begin_transaction();
    try {
        // 1. Borrar asignaciones anteriores
        $stDel = $mysqli->prepare("DELETE FROM EVALUACION_ASIGNACIONES WHERE ID_EVALUACION = ?");
        if (!$stDel) throw new Exception("Error preparando DELETE.");
        $stDel->bind_param("i", $idEval);
        $stDel->execute();

        // 2. Insertar las nuevas
        if (count($items) > 0) {
            $stIns = $mysqli->prepare("
                INSERT IGNORE INTO EVALUACION_ASIGNACIONES
                    (ID_EVALUACION, TIPO_ASIGNACION, ID_CURSO, ID_ESTUDIANTE)
                VALUES (?, ?, ?, ?)
            ");
            if (!$stIns) throw new Exception("Error preparando INSERT.");

            foreach ($items as $item) {
                $tipo        = strtoupper(trim($item["TIPO"] ?? ""));
                $idRef       = (int)($item["ID"] ?? 0);

                if (!in_array($tipo, ["CURSO", "ESTUDIANTE"]))
                    throw new Exception("TIPO inválido: '$tipo'. Use CURSO o ESTUDIANTE.");
                if ($idRef <= 0)
                    throw new Exception("ID inválido en item tipo $tipo.");

                $idCurso      = $tipo === "CURSO"      ? $idRef : null;
                $idEstudiante = $tipo === "ESTUDIANTE" ? $idRef : null;

                $stIns->bind_param("isii", $idEval, $tipo, $idCurso, $idEstudiante);
                $stIns->execute();
            }
        }

        $mysqli->commit();
        ok(["total" => count($items)], "Asignaciones guardadas correctamente");

    } catch (Exception $e) {
        $mysqli->rollback();
        fail($e->getMessage());
    }
}

// ===================== DELETE =====================
// Elimina todas las asignaciones de una evaluación
if ($method === "DELETE") {
    $idEval = isset($_GET["ID_EVALUACION"]) ? (int)$_GET["ID_EVALUACION"] : 0;
    if ($idEval <= 0) fail("ID_EVALUACION es requerido.");

    $st = $mysqli->prepare("DELETE FROM EVALUACION_ASIGNACIONES WHERE ID_EVALUACION = ?");
    if (!$st) fail("Error preparando DELETE.");
    $st->bind_param("i", $idEval);
    $st->execute();

    ok(["eliminados" => $mysqli->affected_rows], "Asignaciones eliminadas");
}

fail("Método no permitido.", 405);