<?php
// api_corp/CORP_EVALUACIONES/calificar_abiertos.php
// GET  ?ID_EVALUACION=X  → lista intentos con preguntas abiertas pendientes
// PATCH { ID_RESPUESTA, PUNTAJE_OBTENIDO, COMENTARIO_DOCENTE? } → califica una respuesta abierta

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, PATCH, 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;
}

// ─────────────────────────────────────────────────────────────────
// GET: lista intentos con abiertas pendientes
// ─────────────────────────────────────────────────────────────────
if ($_SERVER["REQUEST_METHOD"] === "GET") {
    $idEval = (int)($_GET["ID_EVALUACION"] ?? 0);
    if (!$idEval) fail("ID_EVALUACION requerido.");

    // Todos los intentos enviados de esta evaluación
    $stI = $mysqli->prepare("
        SELECT i.ID_INTENTO, i.NUMERO_INTENTO, i.FECHA_ENVIO,
               i.PUNTAJE_OBTENIDO, i.PUNTAJE_ABIERTOS, i.PUNTAJE_TOTAL,
               i.TIENE_ABIERTAS, i.ESTADO_INTENTO,
               CONCAT(e.NOMBRE_ESTUDIANTE,' ',e.APELLIDO_ESTUDIANTE) AS NOMBRE_ESTUDIANTE,
               e.DOCUMENTO_ESTUDIANTE
        FROM EVALUACION_INTENTOS i
        INNER JOIN ESTUDIANTES e ON e.ID_ESTUDIANTE = i.ID_ESTUDIANTE
        WHERE i.ID_EVALUACION = ? AND i.ESTADO_INTENTO IN ('ENVIADO','CALIFICADO')
        ORDER BY i.FECHA_ENVIO ASC
    ");
    $stI->bind_param("i", $idEval);
    $stI->execute();
    $intentos = $stI->get_result()->fetch_all(MYSQLI_ASSOC);

    // Para cada intento, traer sus respuestas abiertas
    foreach ($intentos as &$intento) {
        $stR = $mysqli->prepare("
            SELECT r.ID_RESPUESTA, r.TEXTO_RESPUESTA, r.ES_CORRECTA,
                   r.PUNTAJE_OBTENIDO, r.COMENTARIO_DOCENTE,
                   p.ID_PREGUNTA, p.ENUNCIADO, p.PUNTAJE_PREGUNTA, p.ORDEN_PREGUNTA,
                   p.RESPUESTA_ESPERADA
            FROM EVALUACION_RESPUESTAS r
            INNER JOIN EVALUACION_PREGUNTAS p ON p.ID_PREGUNTA = r.ID_PREGUNTA
            WHERE r.ID_INTENTO = ? AND p.TIPO_PREGUNTA = 'ABIERTA'
            ORDER BY p.ORDEN_PREGUNTA
        ");
        $stR->bind_param("i", $intento["ID_INTENTO"]);
        $stR->execute();
        $intento["respuestas_abiertas"] = $stR->get_result()->fetch_all(MYSQLI_ASSOC);
    }
    unset($intento);

    ok(["data" => $intentos]);
}

// ─────────────────────────────────────────────────────────────────
// PATCH: calificar una respuesta abierta
// ─────────────────────────────────────────────────────────────────
if ($_SERVER["REQUEST_METHOD"] === "PATCH") {
    $raw  = file_get_contents("php://input");
    $body = json_decode($raw, true) ?: [];

    $idResp     = (int)($body["ID_RESPUESTA"]      ?? 0);
    $puntaje    = (float)($body["PUNTAJE_OBTENIDO"] ?? -1);
    $comentario = trim($body["COMENTARIO_DOCENTE"]  ?? "");

    if (!$idResp)      fail("ID_RESPUESTA requerido.");
    if ($puntaje < 0)  fail("PUNTAJE_OBTENIDO requerido (puede ser 0).");

    // Traer la respuesta y su pregunta para validar puntaje máximo
    $stR = $mysqli->prepare("
        SELECT r.ID_INTENTO, r.ID_PREGUNTA, p.PUNTAJE_PREGUNTA
        FROM EVALUACION_RESPUESTAS r
        INNER JOIN EVALUACION_PREGUNTAS p ON p.ID_PREGUNTA = r.ID_PREGUNTA
        WHERE r.ID_RESPUESTA = ? LIMIT 1
    ");
    $stR->bind_param("i", $idResp);
    $stR->execute();
    $resp = $stR->get_result()->fetch_assoc();
    if (!$resp) fail("Respuesta no encontrada.", 404);

    $ptsMax = (float)$resp["PUNTAJE_PREGUNTA"];
    if ($puntaje > $ptsMax) fail("El puntaje no puede superar el máximo de $ptsMax.");

    $esCorrecta = $puntaje >= $ptsMax ? 1 : ($puntaje > 0 ? 1 : 0);
    $com        = $comentario ?: null;

    $stUpd = $mysqli->prepare("
        UPDATE EVALUACION_RESPUESTAS
        SET PUNTAJE_OBTENIDO = ?, ES_CORRECTA = ?, COMENTARIO_DOCENTE = ?
        WHERE ID_RESPUESTA = ?
    ");
    $stUpd->bind_param("diis", $puntaje, $esCorrecta, $com, $idResp);
    if (!$stUpd->execute()) fail("Error actualizando respuesta.");

    // Recalcular puntaje total del intento
    $idIntento = (int)$resp["ID_INTENTO"];

    $stSum = $mysqli->prepare("
        SELECT
            COALESCE(SUM(CASE WHEN p.TIPO_PREGUNTA != 'ABIERTA' THEN r.PUNTAJE_OBTENIDO ELSE 0 END), 0) AS pts_auto,
            COALESCE(SUM(CASE WHEN p.TIPO_PREGUNTA  = 'ABIERTA' THEN r.PUNTAJE_OBTENIDO ELSE 0 END), 0) AS pts_abiertos,
            SUM(CASE WHEN p.TIPO_PREGUNTA = 'ABIERTA' AND r.PUNTAJE_OBTENIDO IS NULL THEN 1 ELSE 0 END) AS pendientes
        FROM EVALUACION_RESPUESTAS r
        INNER JOIN EVALUACION_PREGUNTAS p ON p.ID_PREGUNTA = r.ID_PREGUNTA
        WHERE r.ID_INTENTO = ?
    ");
    $stSum->bind_param("i", $idIntento);
    $stSum->execute();
    $sums = $stSum->get_result()->fetch_assoc();

    $ptsAuto     = (float)$sums["pts_auto"];
    $ptsAbiertos = (float)$sums["pts_abiertos"];
    $pendientes  = (int)$sums["pendientes"];
    $ptsTotal    = $ptsAuto + $ptsAbiertos;
    $estado      = $pendientes === 0 ? "CALIFICADO" : "ENVIADO";
    $fechaCal    = $pendientes === 0 ? date("Y-m-d H:i:s") : null;
    $tieneAb     = $pendientes > 0 ? 1 : 0;

    $stFin = $mysqli->prepare("
        UPDATE EVALUACION_INTENTOS
        SET PUNTAJE_ABIERTOS = ?, PUNTAJE_TOTAL = ?,
            TIENE_ABIERTAS   = ?, ESTADO_INTENTO = ?,
            FECHA_CALIFICADO = ?
        WHERE ID_INTENTO = ?
    ");
    $stFin->bind_param("ddissi", $ptsAbiertos, $ptsTotal, $tieneAb, $estado, $fechaCal, $idIntento);
    $stFin->execute();

    ok([
        "puntaje_total"  => round($ptsTotal, 2),
        "pendientes"     => $pendientes,
        "estado_intento" => $estado,
    ], "Respuesta calificada correctamente");
}

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