<?php
// api_corp/CORP_EVALUACIONES/preguntas.php
// Gestión de preguntas individuales de evaluación
// Métodos: GET (detalle), DELETE (eliminar pregunta + sus opciones)

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

// ── Helpers ──
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;
}
function toInt($v, int $default = 0): int {
    if ($v === null || $v === "") return $default;
    return (int)$v;
}

$method = $_SERVER["REQUEST_METHOD"];

// ===================== GET — detalle de una pregunta =====================
if ($method === "GET") {
    $idPregunta = toInt($_GET["ID_PREGUNTA"] ?? 0);
    if ($idPregunta <= 0) fail("ID_PREGUNTA es requerido.");

    $stmt = $mysqli->prepare("
        SELECT
            P.ID_PREGUNTA,
            P.ID_EVALUACION,
            P.ORDEN_PREGUNTA,
            P.ENUNCIADO,
            P.TIPO_PREGUNTA,
            P.PUNTAJE_PREGUNTA,
            P.ID_COMPETENCIA,
            P.ID_HABILIDAD,
            P.RESPUESTA_ESPERADA
        FROM EVALUACION_PREGUNTAS P
        WHERE P.ID_PREGUNTA = ?
        LIMIT 1
    ");
    if (!$stmt) fail("Error preparando consulta: " . $mysqli->error);
    $stmt->bind_param("i", $idPregunta);
    $stmt->execute();
    $pregunta = $stmt->get_result()->fetch_assoc();
    if (!$pregunta) fail("La pregunta no existe.", 404);

    // Opciones
    $stOpc = $mysqli->prepare("
        SELECT ID_OPCION, ORDEN_OPCION, TEXTO_OPCION, ES_CORRECTA
        FROM EVALUACION_PREGUNTA_OPCIONES
        WHERE ID_PREGUNTA = ?
        ORDER BY ORDEN_OPCION ASC
    ");
    if (!$stOpc) fail("Error preparando opciones: " . $mysqli->error);
    $stOpc->bind_param("i", $idPregunta);
    $stOpc->execute();
    $resOpc = $stOpc->get_result();
    $opciones = [];
    while ($o = $resOpc->fetch_assoc()) $opciones[] = $o;
    $pregunta["opciones"] = $opciones;

    ok(["data" => $pregunta], "Pregunta encontrada");
}

// ===================== DELETE — eliminar pregunta + opciones =====================
if ($method === "DELETE") {
    $idPregunta  = toInt($_GET["ID_PREGUNTA"]  ?? 0);
    $idDocente   = toInt($_GET["ID_DOCENTE"]   ?? 0);
    $idEvalacion = toInt($_GET["ID_EVALUACION"] ?? 0);

    if ($idPregunta  <= 0) fail("ID_PREGUNTA es requerido.");
    if ($idDocente   <= 0) fail("ID_DOCENTE es requerido.");
    if ($idEvalacion <= 0) fail("ID_EVALUACION es requerido.");

    // ✅ Verificar que la pregunta pertenece a una evaluación del docente
    $stChk = $mysqli->prepare("
        SELECT P.ID_PREGUNTA
        FROM EVALUACION_PREGUNTAS P
        INNER JOIN EVALUACIONES E ON E.ID_EVALUACION = P.ID_EVALUACION
        WHERE P.ID_PREGUNTA  = ?
          AND P.ID_EVALUACION = ?
          AND E.ID_DOCENTE    = ?
        LIMIT 1
    ");
    if (!$stChk) fail("Error verificando pregunta: " . $mysqli->error);
    $stChk->bind_param("iii", $idPregunta, $idEvalacion, $idDocente);
    $stChk->execute();
    if (!$stChk->get_result()->fetch_assoc())
        fail("La pregunta no existe o no pertenece a tu evaluación.", 403);

    $mysqli->begin_transaction();

    try {
        // 1. Eliminar opciones
        $stDelOpc = $mysqli->prepare("
            DELETE FROM EVALUACION_PREGUNTA_OPCIONES WHERE ID_PREGUNTA = ?
        ");
        if (!$stDelOpc) throw new Exception("Error preparando DELETE opciones: " . $mysqli->error);
        $stDelOpc->bind_param("i", $idPregunta);
        if (!$stDelOpc->execute()) throw new Exception("Error eliminando opciones: " . $stDelOpc->error);

        // 2. Eliminar pregunta
        $stDelPreg = $mysqli->prepare("
            DELETE FROM EVALUACION_PREGUNTAS WHERE ID_PREGUNTA = ? LIMIT 1
        ");
        if (!$stDelPreg) throw new Exception("Error preparando DELETE pregunta: " . $mysqli->error);
        $stDelPreg->bind_param("i", $idPregunta);
        if (!$stDelPreg->execute()) throw new Exception("Error eliminando pregunta: " . $stDelPreg->error);

        // 3. Recalcular y actualizar PUNTAJE_TOTAL de la evaluación
        $stPuntaje = $mysqli->prepare("
            UPDATE EVALUACIONES
            SET PUNTAJE_TOTAL = (
                SELECT COALESCE(SUM(PUNTAJE_PREGUNTA), 0)
                FROM EVALUACION_PREGUNTAS
                WHERE ID_EVALUACION = ?
            )
            WHERE ID_EVALUACION = ?
        ");
        if (!$stPuntaje) throw new Exception("Error preparando UPDATE puntaje: " . $mysqli->error);
        $stPuntaje->bind_param("ii", $idEvalacion, $idEvalacion);
        if (!$stPuntaje->execute()) throw new Exception("Error actualizando puntaje: " . $stPuntaje->error);

        // 4. Reordenar preguntas restantes para que no queden huecos en ORDEN_PREGUNTA
        $stReorder = $mysqli->prepare("
            SELECT ID_PREGUNTA FROM EVALUACION_PREGUNTAS
            WHERE ID_EVALUACION = ?
            ORDER BY ORDEN_PREGUNTA ASC
        ");
        if (!$stReorder) throw new Exception("Error preparando reorden: " . $mysqli->error);
        $stReorder->bind_param("i", $idEvalacion);
        $stReorder->execute();
        $resReorder = $stReorder->get_result();
        $orden = 1;
        $stUpOrd = $mysqli->prepare("UPDATE EVALUACION_PREGUNTAS SET ORDEN_PREGUNTA = ? WHERE ID_PREGUNTA = ?");
        if (!$stUpOrd) throw new Exception("Error preparando UPDATE orden: " . $mysqli->error);
        while ($row = $resReorder->fetch_assoc()) {
            $stUpOrd->bind_param("ii", $orden, $row["ID_PREGUNTA"]);
            $stUpOrd->execute();
            $orden++;
        }

        $mysqli->commit();
        ok([], "Pregunta eliminada correctamente");

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

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