<?php
// api_corp/CORP_EVALUACIONES/resultado_examen.php
// GET ?ID_INTENTO=X → devuelve el detalle completo del intento con respuestas y calificaciones

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");

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;
}
function decodeJWT($token, $key) {
    $parts = explode(".", $token);
    if (count($parts) !== 3) return null;
    $payload = json_decode(base64_decode($parts[1]), true);
    $sig = base64_encode(hash_hmac("sha256", "$parts[0].$parts[1]", $key, true));
    if ($sig !== $parts[2]) return null;
    if (isset($payload["exp"]) && $payload["exp"] < time()) return null;
    return $payload;
}

if ($_SERVER["REQUEST_METHOD"] !== "GET") fail("Método no permitido.", 405);

// -- Validar JWT --
$authHeader = $_SERVER["HTTP_AUTHORIZATION"] ?? "";
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) fail("Token requerido.", 401);
$payload = decodeJWT($m[1], $JWT_KEY);
if (!$payload) fail("Token inválido.", 401);

$userRole     = $payload["userRole"] ?? "";
$idEstudiante = (int)($payload["userId"] ?? 0);

$idIntento = (int)($_GET["ID_INTENTO"] ?? 0);
if (!$idIntento) fail("ID_INTENTO requerido.");

// -- Traer cabecera del intento --
$stI = $mysqli->prepare("
    SELECT i.ID_INTENTO, i.ID_EVALUACION, i.ID_ESTUDIANTE,
           i.NUMERO_INTENTO, i.ESTADO_INTENTO,
           i.FECHA_INICIO, i.FECHA_ENVIO, i.FECHA_CALIFICADO,
           i.PUNTAJE_OBTENIDO, i.PUNTAJE_ABIERTOS, i.PUNTAJE_TOTAL,
           i.TIENE_ABIERTAS,
           e.TITULO_EVALUACION, e.PUNTAJE_TOTAL AS PUNTAJE_MAXIMO,
           e.DURACION_MINUTOS,
           CONCAT(est.NOMBRE_ESTUDIANTE,' ',est.APELLIDO_ESTUDIANTE) AS NOMBRE_ESTUDIANTE,
           est.DOCUMENTO_ESTUDIANTE
    FROM EVALUACION_INTENTOS i
    INNER JOIN EVALUACIONES e   ON e.ID_EVALUACION  = i.ID_EVALUACION
    INNER JOIN ESTUDIANTES  est ON est.ID_ESTUDIANTE = i.ID_ESTUDIANTE
    WHERE i.ID_INTENTO = ?
    LIMIT 1
");
if (!$stI) fail("Error interno.");
$stI->bind_param("i", $idIntento);
$stI->execute();
$intento = $stI->get_result()->fetch_assoc();

if (!$intento) fail("Intento no encontrado.", 404);

// -- Seguridad: el estudiante solo puede ver sus propios intentos --
if ($userRole === "ESTUDIANTE" && (int)$intento["ID_ESTUDIANTE"] !== $idEstudiante) {
    fail("Acceso no autorizado.", 403);
}

// -- Traer preguntas con respuestas del estudiante --
$stR = $mysqli->prepare("
    SELECT
        p.ID_PREGUNTA, p.ORDEN_PREGUNTA, p.ENUNCIADO,
        p.TIPO_PREGUNTA, p.PUNTAJE_PREGUNTA,
        p.RESPUESTA_ESPERADA, p.IMAGEN_URL,
        r.ID_RESPUESTA, r.ID_OPCION, r.IDS_OPCIONES,
        r.TEXTO_RESPUESTA, r.ES_CORRECTA,
        r.PUNTAJE_OBTENIDO, r.COMENTARIO_DOCENTE
    FROM EVALUACION_PREGUNTAS p
    LEFT JOIN EVALUACION_RESPUESTAS r
        ON r.ID_PREGUNTA = p.ID_PREGUNTA AND r.ID_INTENTO = ?
    WHERE p.ID_EVALUACION = ?
    ORDER BY p.ORDEN_PREGUNTA
");
if (!$stR) fail("Error interno.");
$stR->bind_param("ii", $idIntento, $intento["ID_EVALUACION"]);
$stR->execute();
$preguntas = $stR->get_result()->fetch_all(MYSQLI_ASSOC);

// -- Para preguntas de selección, traer las opciones con ES_CORRECTA --
foreach ($preguntas as &$preg) {
    if (in_array($preg["TIPO_PREGUNTA"], ["SELECCION_UNICA", "MULTIPLE", "CON_IMAGEN"])) {
        $stO = $mysqli->prepare("
            SELECT ID_OPCION, ORDEN_OPCION, TEXTO_OPCION, ES_CORRECTA
            FROM EVALUACION_PREGUNTA_OPCIONES
            WHERE ID_PREGUNTA = ?
            ORDER BY ORDEN_OPCION
        ");
        $stO->bind_param("i", $preg["ID_PREGUNTA"]);
        $stO->execute();
        $preg["opciones"] = $stO->get_result()->fetch_all(MYSQLI_ASSOC);

        // IDs seleccionados por el estudiante
        $preg["ids_seleccionados"] = [];
        if ($preg["IDS_OPCIONES"]) {
            $preg["ids_seleccionados"] = array_map("intval", explode(",", $preg["IDS_OPCIONES"]));
        } elseif ($preg["ID_OPCION"]) {
            $preg["ids_seleccionados"] = [(int)$preg["ID_OPCION"]];
        }
    } else {
        $preg["opciones"] = [];
        $preg["ids_seleccionados"] = [];
    }
}
unset($preg);

// -- Calcular porcentaje --
$porcentaje = null;
if ($intento["PUNTAJE_MAXIMO"] > 0 && $intento["PUNTAJE_TOTAL"] !== null) {
    $porcentaje = round(($intento["PUNTAJE_TOTAL"] / $intento["PUNTAJE_MAXIMO"]) * 100, 1);
}

ok([
    "intento"    => $intento,
    "preguntas"  => $preguntas,
    "porcentaje" => $porcentaje,
]);