<?php
ini_set('session.gc_maxlifetime', 10800);
ini_set('session.cookie_lifetime', 10800);
session_set_cookie_params([
    'lifetime' => 10800,
    'path'     => '/',
    'secure'   => false,
    'httponly' => true,
    'samesite' => 'Lax'
]);
session_start();
header('Content-Type: application/json');

// Verificar autenticación
if (!isset($_SESSION['usuario']) || !isset($_SESSION['token'])) {
    http_response_code(401);
    echo json_encode(['error' => 'No autorizado']);
    exit;
}

// Configuración BD
$host     = "localhost";
$user     = "ascensof_Admin1";
$password = "3DS0NCH4115H4CK3R+";
$db       = "ascensof_BDsimulador";

$conn = new mysqli($host, $user, $password, $db);
if ($conn->connect_error) {
    http_response_code(500);
    echo json_encode(['error' => 'Error de conexión a BD']);
    exit;
}
$conn->set_charset("utf8mb4");

// ✅ API KEY DE OPENROUTER
$OPENROUTER_API_KEY = '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';
$OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';
$MODELO             = 'openrouter/auto';

$input = file_get_contents('php://input');
$data  = json_decode($input, true);

if (!$data || !isset($data['accion'])) {
    http_response_code(400);
    echo json_encode(['error' => 'Datos inválidos']);
    exit;
}

// =====================================================================
// ACCIÓN: obtener_bloque — devuelve N preguntas sin explicacion_ia
// =====================================================================
if ($data['accion'] === 'obtener_bloque') {
    $cantidad = isset($data['cantidad']) ? intval($data['cantidad']) : 25;
    $offset   = isset($data['offset'])   ? intval($data['offset'])   : 0;

    // Contar total sin explicación
    $totalRes = $conn->query("SELECT COUNT(*) as total FROM Preguntas WHERE explicacion_ia IS NULL OR explicacion_ia = ''");
    $totalRow = $totalRes->fetch_assoc();
    $totalPendientes = intval($totalRow['total']);

    // Contar total general
    $totalGenRes = $conn->query("SELECT COUNT(*) as total FROM Preguntas");
    $totalGenRow = $totalGenRes->fetch_assoc();
    $totalGeneral = intval($totalGenRow['total']);

    // Obtener bloque de preguntas pendientes
    $stmt = $conn->prepare("
        SELECT Id, pregunta, pregunta_a, pregunta_b,
               opcion1, opcion2, opcion3, opcion4, opcion5,
               correcta_rpta
        FROM Preguntas
        WHERE explicacion_ia IS NULL OR explicacion_ia = ''
        LIMIT ? OFFSET ?
    ");
    $stmt->bind_param("ii", $cantidad, $offset);
    $stmt->execute();
    $result = $stmt->get_result();

    $preguntas = [];
    while ($row = $result->fetch_assoc()) {
        $preguntas[] = $row;
    }

    echo json_encode([
        'success'          => true,
        'preguntas'        => $preguntas,
        'total_pendientes' => $totalPendientes,
        'total_general'    => $totalGeneral,
        'procesadas'       => $totalGeneral - $totalPendientes,
    ]);
    exit;
}

// =====================================================================
// ACCIÓN: generar_una — genera explicación de UNA pregunta y la guarda
// =====================================================================
if ($data['accion'] === 'generar_una') {
    if (!isset($data['pregunta_id'])) {
        http_response_code(400);
        echo json_encode(['error' => 'Falta pregunta_id']);
        exit;
    }

    $preguntaId = intval($data['pregunta_id']);

    // Obtener la pregunta de la BD
    $stmt = $conn->prepare("
        SELECT Id, pregunta, pregunta_a, pregunta_b,
               opcion1, opcion2, opcion3, opcion4, opcion5,
               correcta_rpta
        FROM Preguntas WHERE Id = ?
    ");
    $stmt->bind_param("i", $preguntaId);
    $stmt->execute();
    $result = $stmt->get_result();
    $p = $result->fetch_assoc();

    if (!$p) {
        http_response_code(404);
        echo json_encode(['error' => 'Pregunta no encontrada']);
        exit;
    }

    // Verificar que tiene clave de respuesta válida
    $claveCorrecta = intval($p['correcta_rpta']);
    if ($claveCorrecta < 1 || $claveCorrecta > 5) {
        // Marcar como sin clave válida para no reprocesar
        $stmtUpd = $conn->prepare("UPDATE Preguntas SET explicacion_ia = ? WHERE Id = ?");
        $sinClave = "Sin clave de respuesta válida registrada.";
        $stmtUpd->bind_param("si", $sinClave, $preguntaId);
        $stmtUpd->execute();

        echo json_encode([
            'success'    => true,
            'pregunta_id' => $preguntaId,
            'mensaje'    => 'Sin clave válida, omitida',
            'omitida'    => true
        ]);
        exit;
    }

    // Construir el prompt con toda la información de la pregunta
    $letras  = ['A', 'B', 'C', 'D', 'E'];
    $prompt  = "Eres un asistente educativo. Explica de forma clara, directa y estructurada por qué la respuesta correcta es la correcta en la siguiente pregunta de examen. Responde en español, sin asteriscos ni formato Markdown, en texto plano limpio.\n\n";

    if (!empty(trim($p['pregunta'])))   $prompt .= "PREGUNTA: "   . trim($p['pregunta'])   . "\n\n";
    if (!empty(trim($p['pregunta_a']))) $prompt .= "CONTEXTO A: " . trim($p['pregunta_a']) . "\n\n";
    if (!empty(trim($p['pregunta_b']))) $prompt .= "CONTEXTO B: " . trim($p['pregunta_b']) . "\n\n";

    $prompt .= "OPCIONES:\n";
    for ($i = 1; $i <= 5; $i++) {
        $opcion = $p["opcion$i"] ?? '';
        if (!empty(trim($opcion))) {
            $esCorrecta = ($i === $claveCorrecta) ? " ✓ CORRECTA" : "";
            $prompt .= $letras[$i-1] . ") " . trim($opcion) . $esCorrecta . "\n";
        }
    }

    $opcionCorrectaTexto = $p["opcion$claveCorrecta"] ?? '';
    $prompt .= "\nRESPUESTA CORRECTA: " . $letras[$claveCorrecta-1] . ") " . trim($opcionCorrectaTexto) . "\n\n";
    $prompt .= "Por favor explica:\n";
    $prompt .= "1. Por qué esta opción es la correcta (conceptos que la respaldan)\n";
    $prompt .= "2. Por qué las otras opciones son incorrectas (brevemente)\n";

    // Llamar a OpenRouter
    $requestBody = [
        'model'    => $MODELO,
        'messages' => [
            ['role' => 'user', 'content' => $prompt]
        ],
        'max_tokens'  => 800,
        'temperature' => 0.5,
    ];

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL            => $OPENROUTER_API_URL,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($requestBody),
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $OPENROUTER_API_KEY,
            'HTTP-Referer: https://ascensofacil.com',
            'X-Title: AscensoFacil Generador'
        ],
        CURLOPT_TIMEOUT => 45,
    ]);

    $response  = curl_exec($ch);
    $httpCode  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);

    if ($curlError) {
        http_response_code(500);
        echo json_encode(['error' => 'Error de conexión: ' . $curlError]);
        exit;
    }

    if ($httpCode === 429) {
        http_response_code(429);
        echo json_encode([
            'error'       => 'Límite de OpenRouter alcanzado.',
            'http_code'   => 429,
            'retry_after' => 60
        ]);
        exit;
    }

    if ($httpCode !== 200) {
        $errResp = json_decode($response, true);
        $msg = $errResp['error']['message'] ?? 'Error desconocido';
        http_response_code($httpCode);
        echo json_encode(['error' => 'Error IA: ' . $msg]);
        exit;
    }

    $iaResponse = json_decode($response, true);
    $explicacion = trim($iaResponse['choices'][0]['message']['content'] ?? '');

    if (empty($explicacion)) {
        http_response_code(500);
        echo json_encode(['error' => 'Respuesta vacía de la IA']);
        exit;
    }

    // Guardar en la BD
    $stmtUpd = $conn->prepare("UPDATE Preguntas SET explicacion_ia = ? WHERE Id = ?");
    $stmtUpd->bind_param("si", $explicacion, $preguntaId);
    $stmtUpd->execute();

    echo json_encode([
        'success'     => true,
        'pregunta_id' => $preguntaId,
        'explicacion' => substr($explicacion, 0, 100) . '...',
    ]);
    exit;
}

// =====================================================================
// ACCIÓN: estadisticas — cuántas procesadas vs pendientes
// =====================================================================
if ($data['accion'] === 'estadisticas') {
    $res1 = $conn->query("SELECT COUNT(*) as total FROM Preguntas");
    $res2 = $conn->query("SELECT COUNT(*) as total FROM Preguntas WHERE explicacion_ia IS NOT NULL AND explicacion_ia != ''");

    $total     = intval($res1->fetch_assoc()['total']);
    $procesadas = intval($res2->fetch_assoc()['total']);

    echo json_encode([
        'success'    => true,
        'total'      => $total,
        'procesadas' => $procesadas,
        'pendientes' => $total - $procesadas,
        'porcentaje' => $total > 0 ? round(($procesadas / $total) * 100, 1) : 0
    ]);
    exit;
}

$conn->close();
echo json_encode(['error' => 'Acción no reconocida']);
?>
