<?php
session_start();
header('Content-Type: application/json');

// Verificar que el usuario esté autenticado
if (!isset($_SESSION['usuario']) || !isset($_SESSION['token'])) {
    http_response_code(401);
    echo json_encode(['error' => 'No autorizado']);
    exit;
}

// ✅ API KEY DE OPENROUTER
$OPENROUTER_API_KEY = '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'; // 👈 Reemplaza con tu key de openrouter.ai
$OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';

// ✅ MODELO GRATUITO - Puedes cambiar por cualquier modelo free de openrouter.ai
// Opciones gratuitas disponibles:
// 'meta-llama/llama-3.3-8b-instruct:free'      <- rápido y ligero
// 'meta-llama/llama-3.1-8b-instruct:free'      <- alternativa estable
// 'mistralai/mistral-7b-instruct:free'          <- buena calidad
// 'google/gemma-3-27b-it:free'                  <- de Google, sin cuota

// DESPUÉS (router automático, siempre funciona):
$MODELO = 'openrouter/auto';

// Validar método POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Método no permitido']);
    exit;
}

// Obtener datos del POST
$input = file_get_contents('php://input');
$data = json_decode($input, true);

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

$pregunta = trim($data['pregunta']);

if (empty($pregunta)) {
    http_response_code(400);
    echo json_encode(['error' => 'Pregunta vacía']);
    exit;
}

// ✅ CACHÉ EN SESIÓN: Si ya se consultó esta pregunta, devolver respuesta guardada
// Evita gastar cuota repitiendo la misma pregunta
$cacheKey = 'ia_cache_' . md5($pregunta);
if (isset($_SESSION[$cacheKey])) {
    echo json_encode([
        'success'      => true,
        'respuesta'    => $_SESSION[$cacheKey],
        'desde_cache'  => true
    ]);
    exit;
}

// ✅ CONTROL DE VELOCIDAD: mínimo 2 segundos entre llamadas
$ultimaLlamada = $_SESSION['ia_ultima_llamada'] ?? 0;
$tiempoTranscurrido = time() - $ultimaLlamada;
if ($tiempoTranscurrido < 2) {
    sleep(2 - $tiempoTranscurrido);
}

// Estructura de la solicitud para OpenRouter
$requestBody = [
    'model'    => $MODELO,
    'messages' => [
        [
            'role'    => 'system',
            'content' => 'Eres un asistente educativo que explica preguntas de examen de forma clara, directa y estructurada. Responde siempre en español. NO uses asteriscos (*) ni formato Markdown. Usa texto plano limpio y estructurado.'
        ],
        [
            'role'    => 'user',
            'content' => $pregunta
        ]
    ],
    'max_tokens'  => 1024,
    'temperature' => 0.7,
];

// ✅ FUNCIÓN REUTILIZABLE para llamar a OpenRouter
function llamarOpenRouter($url, $apiKey, $titulo, $requestBody) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode($requestBody),
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $apiKey,
            'HTTP-Referer: https://ascensofacil.com',
            'X-Title: ' . $titulo
        ],
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $response  = curl_exec($ch);
    $httpCode  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    return ['response' => $response, 'httpCode' => $httpCode, 'error' => $curlError];
}

// ✅ PRIMER INTENTO
$_SESSION['ia_ultima_llamada'] = time();
$resultado = llamarOpenRouter($OPENROUTER_API_URL, $OPENROUTER_API_KEY, 'AscensoFacil Simulador', $requestBody);

// ✅ RETRY AUTOMÁTICO en 429: esperar 15 segundos y reintentar una vez
if ($resultado['httpCode'] === 429) {
    sleep(15);
    $_SESSION['ia_ultima_llamada'] = time();
    $resultado = llamarOpenRouter($OPENROUTER_API_URL, $OPENROUTER_API_KEY, 'AscensoFacil Simulador', $requestBody);
}

// Manejar errores de cURL
if ($resultado['error']) {
    http_response_code(500);
    echo json_encode(['error' => 'Error de conexión. Verifique su internet.']);
    exit;
}

// Manejar errores HTTP
if ($resultado['httpCode'] !== 200) {
    $errorResponse = json_decode($resultado['response'], true);
    $mensaje = $errorResponse['error']['message'] ?? 'Error desconocido';

    if ($resultado['httpCode'] === 429) {
        http_response_code(429);
        echo json_encode([
            'error'       => 'El servicio de IA está temporalmente ocupado. Intente en unos segundos.',
            'http_code'   => 429,
            'retry_after' => 30
        ]);
    } elseif ($resultado['httpCode'] === 401) {
        http_response_code(401);
        echo json_encode([
            'error'     => 'API key inválida. Contacte al administrador.',
            'http_code' => 401
        ]);
    } elseif ($resultado['httpCode'] === 402) {
        http_response_code(402);
        echo json_encode([
            'error'     => 'Créditos de IA agotados. Contacte al administrador.',
            'http_code' => 402
        ]);
    } else {
        http_response_code($resultado['httpCode']);
        echo json_encode([
            'error'     => 'Error del servicio IA: ' . $mensaje,
            'http_code' => $resultado['httpCode']
        ]);
    }
    exit;
}

// ✅ Procesar respuesta exitosa de OpenRouter
$iaResponse = json_decode($resultado['response'], true);

if (!$iaResponse || !isset($iaResponse['choices'][0]['message']['content'])) {
    http_response_code(500);
    echo json_encode(['error' => 'Respuesta inválida del servicio IA']);
    exit;
}

$respuesta = trim($iaResponse['choices'][0]['message']['content']);

// ✅ GUARDAR EN CACHÉ DE SESIÓN (máximo 20 respuestas guardadas)
$cacheKeys = $_SESSION['ia_cache_keys'] ?? [];
if (count($cacheKeys) >= 20) {
    $keyMasAntigua = array_shift($cacheKeys);
    unset($_SESSION[$keyMasAntigua]);
}
$cacheKeys[]               = $cacheKey;
$_SESSION['ia_cache_keys'] = $cacheKeys;
$_SESSION[$cacheKey]       = $respuesta;

// Devolver respuesta exitosa
echo json_encode([
    'success'   => true,
    'respuesta' => $respuesta
]);
?>
