<?php
/**
 * Proxy seguro para la API de IA (SIEinteligente).
 *
 * El token de IA se mantiene en el servidor y NUNCA se expone al navegador.
 * Las peticiones del cliente van a este proxy, que reenvía a la API real.
 *
 * @author R**G
 */
namespace dokuwiki\plugin\bez\meta;

if (!defined('DOKU_INC')) {
    define('DOKU_INC', realpath(__DIR__ . '/../../../../') . '/');
}

require_once DOKU_INC . 'inc/init.php';

// ===== VERIFICACIÓN DE AUTENTICACIÓN =====
if (empty($_SERVER['REMOTE_USER'])) {
    header("Content-Type: application/json");
    echo json_encode(["status" => "error", "error" => "No autorizado."]);
    http_response_code(401);
    exit;
}

header("Content-Type: application/json");

if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    echo json_encode(["status" => "error", "error" => "Método no permitido."]);
    http_response_code(405);
    exit;
}

// Obtener configuración del token de forma segura (del servidor, nunca del cliente).
global $conf;
$token_ia = isset($conf['token_ia']) ? $conf['token_ia'] : '';
$url_ia = isset($conf['url_ia']) ? $conf['url_ia'] : 'https://sie-ia-pnli.onrender.com';

if (empty($token_ia)) {
    echo json_encode(["status" => "error", "error" => "Token de IA no configurado en el servidor."]);
    http_response_code(500);
    exit;
}

// Determinar el endpoint solicitado.
$endpoint = isset($_POST['endpoint']) ? $_POST['endpoint'] : '';
$allowed_endpoints = ['/resumen-sie', '/consulta-historico'];

if (!in_array($endpoint, $allowed_endpoints)) {
    echo json_encode(["status" => "error", "error" => "Endpoint no permitido."]);
    http_response_code(400);
    exit;
}

// Reconstruir el FormData recibido y reenviarlo a la API de IA.
// Se construye el multipart MANUALMENTE porque FastAPI requiere que TODOS
// los archivos tengan el mismo campo "files", y PHP no permite keys
// duplicados en arrays (files[0], files[1] NO funciona con FastAPI).
$ch = curl_init($url_ia . $endpoint);

$boundary = '----SIEia' . uniqid();
$body = '';

// Copiar campos POST (excepto 'endpoint').
foreach ($_POST as $key => $value) {
    if ($key !== 'endpoint') {
        $body .= "--$boundary\r\n";
        $body .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
        $body .= "$value\r\n";
    }
}

// Copiar archivos subidos — TODOS con campo "files" (sin índice).
if (!empty($_FILES['files'])) {
    if (is_array($_FILES['files']['name'])) {
        for ($i = 0; $i < count($_FILES['files']['name']); $i++) {
            if ($_FILES['files']['error'][$i] === UPLOAD_ERR_OK) {
                $body .= "--$boundary\r\n";
                $body .= "Content-Disposition: form-data; name=\"files\"; filename=\"" . $_FILES['files']['name'][$i] . "\"\r\n";
                $body .= "Content-Type: " . $_FILES['files']['type'][$i] . "\r\n\r\n";
                $body .= file_get_contents($_FILES['files']['tmp_name'][$i]) . "\r\n";
            }
        }
    } else {
        if ($_FILES['files']['error'] === UPLOAD_ERR_OK) {
            $body .= "--$boundary\r\n";
            $body .= "Content-Disposition: form-data; name=\"files\"; filename=\"" . $_FILES['files']['name'] . "\"\r\n";
            $body .= "Content-Type: " . $_FILES['files']['type'] . "\r\n\r\n";
            $body .= file_get_contents($_FILES['files']['tmp_name']) . "\r\n";
        }
    }
}

$body .= "--$boundary--\r\n";

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 300,          // 5 minutos total (archivos grandes + procesamiento IA)
    CURLOPT_CONNECTTIMEOUT => 30,    // 30s para establecer conexion
    CURLOPT_HTTPHEADER => [
        "Content-Type: multipart/form-data; boundary=$boundary",
        "Authorization: Bearer " . $token_ia
    ]
]);

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

if ($curlError) {
    echo json_encode(["status" => "error", "error" => "Error de conexión con la API de IA."]);
    http_response_code(502);
    exit;
}

// Devolver la respuesta de la API al cliente.
http_response_code($httpCode);
echo $response;
exit;
