<?php
declare(strict_types=1);
/**
 * kyc/verify-ai.php
 * Usa el LLM de Manus (Forge API) para hacer OCR del INE subido y comparar con los datos del distribuidor.
 * Si el nombre coincide al 70%+ o el RFC coincide -> isVip=1 (verificado automáticamente).
 * Si no coincide -> queda en isVip=2 para revisión manual del admin.
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Content-Type');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../config.php';

$user     = auth();
$id_inver = (int)$user['idinv'];

$db = getDB();

// Obtener datos del distribuidor
$stmt = $db->prepare(
    "SELECT nombre, appat, apmat, rfc, isVip FROM inversionista WHERE id_inver = ? LIMIT 1"
);
$stmt->execute([$id_inver]);
$inv = $stmt->fetch();

if (!$inv) {
    jsonErr(404, 'Distribuidor no encontrado.');
}

if ((int)$inv['isVip'] === 1) {
    jsonOk(['isVip' => 1, 'message' => 'Ya estas verificado.', 'auto' => false]);
}

// Obtener imagen del INE (subTipo=2)
$stmt = $db->prepare(
    "SELECT nombre FROM archivo WHERE id_inver = ? AND subTipo = 2 AND tipo = 1
     ORDER BY fechaCreacion DESC LIMIT 1"
);
$stmt->execute([$id_inver]);
$doc = $stmt->fetch();

if (!$doc) {
    jsonErr(400, 'No se encontro la identificacion subida. Por favor sube tu INE primero.');
}

$imageUrl       = $doc['nombre'];
$nombreCompleto = trim(($inv['nombre'] ?? '') . ' ' . ($inv['appat'] ?? '') . ' ' . ($inv['apmat'] ?? ''));
$rfc            = strtoupper(trim($inv['rfc'] ?? ''));

// Llamar a Forge API (LLM de Manus) para OCR
// La API key se obtiene de las variables de entorno del servidor
$forgeApiKey = getenv('FORGE_API_KEY') ?: '';
$forgeApiUrl = getenv('FORGE_API_URL') ?: 'https://forge.manus.im';

if (empty($forgeApiKey)) {
    // Si no hay API key, marcar como en revisión manual
    $db->prepare("UPDATE inversionista SET isVip = 2 WHERE id_inver = ? AND isVip != 1")->execute([$id_inver]);
    jsonOk([
        'isVip'     => 2,
        'auto'      => false,
        'similitud' => 0,
        'message'   => 'Tus documentos fueron recibidos y estan en revision. Te notificaremos cuando se complete.',
    ]);
}

$llmEndpoint = rtrim($forgeApiUrl, '/') . '/v1/chat/completions';
$llmPayload  = json_encode([
    'model' => 'gemini-2.5-flash',
    'max_tokens' => 1024,
    'messages' => [
        [
            'role' => 'user',
            'content' => [
                [
                    'type' => 'text',
                    'text' => 'Analiza esta imagen de una identificacion oficial mexicana (INE/IFE o pasaporte). ' .
                              'Extrae: 1) El nombre completo tal como aparece en la identificacion. ' .
                              '2) El RFC o CURP si aparece. ' .
                              '3) Si es una identificacion oficial valida (true/false). ' .
                              'Responde SOLO en JSON: {"nombre":"...","rfc_curp":"...","es_id_valida":true}',
                ],
                [
                    'type' => 'image_url',
                    'image_url' => [
                        'url' => $imageUrl,
                        'detail' => 'high',
                    ],
                ],
            ],
        ],
    ],
    'response_format' => [
        'type' => 'json_object',
    ],
]);

$ch = curl_init($llmEndpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $llmPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $forgeApiKey,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$llmResponse = curl_exec($ch);
$httpCode    = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$autoVerificado = false;
$similitud      = 0.0;

if ($httpCode === 200 && $llmResponse) {
    $llmResult = json_decode($llmResponse, true);
    
    // La respuesta de Forge API tiene formato: {"choices": [{"message": {"content": "..."}}]}
    $content = $llmResult['choices'][0]['message']['content'] ?? '';
    
    if ($content) {
        $llmData   = json_decode($content, true);
        $nombreLLM = strtoupper(trim($llmData['nombre'] ?? ''));
        $rfcLLM    = strtoupper(trim($llmData['rfc_curp'] ?? ''));
        $esValida  = (bool)($llmData['es_id_valida'] ?? false);

        if ($esValida && $nombreLLM) {
            similar_text(strtoupper($nombreCompleto), $nombreLLM, $similitud);

            $rfcMatch = (strlen($rfc) >= 10 && strlen($rfcLLM) >= 10 &&
                         substr($rfc, 0, 10) === substr($rfcLLM, 0, 10));

            if ($similitud >= 70 || $rfcMatch) {
                $autoVerificado = true;
                $db->prepare("UPDATE inversionista SET isVip = 1 WHERE id_inver = ?")->execute([$id_inver]);
                $db->prepare("UPDATE archivo SET status = 1 WHERE id_inver = ? AND subTipo = 2 AND tipo = 1")->execute([$id_inver]);
            }
        }
    }
}

if (!$autoVerificado) {
    // Marcar como en revisión para admin
    $db->prepare("UPDATE inversionista SET isVip = 2 WHERE id_inver = ? AND isVip != 1")->execute([$id_inver]);
}

if ($autoVerificado) {
    jsonOk([
        'isVip'     => 1,
        'auto'      => true,
        'similitud' => round($similitud, 1),
        'message'   => 'Identidad verificada automaticamente. Ya tienes acceso a Ganancias.',
    ]);
} else {
    jsonOk([
        'isVip'     => 2,
        'auto'      => false,
        'similitud' => round($similitud, 1),
        'message'   => 'Tus documentos fueron recibidos y estan en revision. Te notificaremos cuando se complete.',
    ]);
}
