<?php
// api/analizar.php
// Un paciente por CC (UNIQUE). Si ya existe se actualiza, no se duplica.
// id_nota ya tiene UNIQUE — INSERT IGNORE descarta notas repetidas.

require_once __DIR__ . '/../middleware/auth_check.php';
require_once __DIR__ . '/../lib/parser.php';

header('Content-Type: application/json; charset=utf-8');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'msg' => 'Método no soportado']);
    exit;
}

$body      = json_decode(file_get_contents('php://input'), true) ?? [];
$texto_pdf = trim($body['texto_pdf'] ?? '');

if (!$texto_pdf) {
    echo json_encode(['ok' => false, 'msg' => 'texto_pdf es requerido']);
    exit;
}

// Fallback base64
if (str_starts_with($texto_pdf, '__BASE64__:')) {
    $b64   = substr($texto_pdf, strlen('__BASE64__:'));
    $bytes = base64_decode($b64);
    $tmp   = tempnam(sys_get_temp_dir(), 'pdf_') . '.pdf';
    file_put_contents($tmp, $bytes);
    try {
        $resultado = ParserNotas::parsear($tmp);
    } catch (Throwable $e) {
        @unlink($tmp);
        echo json_encode(['ok' => false, 'msg' => 'Error leyendo PDF: ' . $e->getMessage()]);
        exit;
    }
    @unlink($tmp);
} else {
    try {
        $resultado = ParserNotas::parsearTexto($texto_pdf);
    } catch (Throwable $e) {
        echo json_encode(['ok' => false, 'msg' => $e->getMessage()]);
        exit;
    }
}

$notas    = $resultado['resultados'] ?? [];
$paciente = $resultado['paciente']   ?? [];
$nombre   = trim($paciente['nombre'] ?? 'Sin nombre');
$cc       = trim($paciente['cc']     ?? '0');

if (empty($notas)) {
    echo json_encode(['ok' => false, 'msg' => 'No se encontraron notas en el PDF']);
    exit;
}

$pdo = db();
$pdo->beginTransaction();

try {
    // ── 1. Upsert paciente — un solo registro por CC ─────────
    $pdo->prepare("
        INSERT INTO pacientes (cc, nombre, archivo_pdf, total_notas, total_hallazgos, usuario_id, job_estado)
        VALUES (?, ?, '', 0, 0, ?, 'completado')
        ON DUPLICATE KEY UPDATE
            nombre     = VALUES(nombre),
            usuario_id = VALUES(usuario_id),
            job_estado = 'completado'
    ")->execute([$cc, $nombre, $USUARIO_ACTUAL['id']]);

    // Recuperar id (sea nuevo o existente)
    $stmt = $pdo->prepare("SELECT id FROM pacientes WHERE cc = ?");
    $stmt->execute([$cc]);
    $paciente_id = (int)$stmt->fetchColumn();

    if (!$paciente_id) throw new RuntimeException('No se pudo obtener el id del paciente');

    // ── 2. Insertar notas — INSERT IGNORE descarta duplicadas ─
    $total_hallazgos = 0;
    $duplicados      = 0;

    $insH = $pdo->prepare("
        INSERT IGNORE INTO hallazgos
            (paciente_id, id_nota, profesional,
             fecha_grabacion, hora_grabacion, ampm_grabacion,
             fecha_atencion,  hora_atencion,  ampm_atencion,
             r1_ok, r2_ok, r3_ok,
             r1_detalle, r2_detalle, r3_detalle,
             num_hallazgos, estado)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ");

    foreach ($notas as $n) {
        $hora_grab = explode(' ', $n['hora_grab'] ?? '')[0] ?? null;
        $hora_aten = $n['hora_aten'] ? explode(' ', $n['hora_aten'])[0] : null;

        $insH->execute([
            $paciente_id,
            $n['id_nota'],
            $n['profesional'],
            $n['fecha_grab'],
            $hora_grab,
            $n['ampm_grab'],
            $n['fecha_aten']    ?? null,
            $hora_aten,
            $n['ampm_aten']     ?? null,
            $n['r1_ok']  ? 1 : 0,
            $n['r2_ok']  ? 1 : 0,
            $n['r3_ok']  ? 1 : 0,
            $n['r1_detalle']    ?? null,
            $n['r2_detalle']    ?? null,
            $n['r3_detalle']    ?? null,
            $n['num_hallazgos'] ?? 0,
            $n['estado'],
        ]);

        if ($insH->rowCount() === 0) $duplicados++;
        if ($n['estado'] === 'HALLAZGO') $total_hallazgos++;
    }

    // ── 3. Recalcular totales reales del paciente ─────────────
    $pdo->prepare("
        UPDATE pacientes
        SET total_notas      = (SELECT COUNT(*)                        FROM hallazgos WHERE paciente_id = ?),
            total_hallazgos  = (SELECT COUNT(*) FROM hallazgos WHERE paciente_id = ? AND estado = 'HALLAZGO'),
            job_estado       = 'completado'
        WHERE id = ?
    ")->execute([$paciente_id, $paciente_id, $paciente_id]);

    $pdo->commit();

    $notas_nuevas = count($notas) - $duplicados;

    echo json_encode([
        'ok'              => true,
        'paciente_id'     => $paciente_id,
        'paciente_nombre' => $nombre,
        'paciente_cc'     => $cc,
        'total_notas'     => count($notas),
        'notas_nuevas'    => $notas_nuevas,
        'total_hallazgos' => $total_hallazgos,
        'duplicados_omit' => $duplicados,
        'msg'             => $duplicados > 0
            ? "Análisis guardado — {$notas_nuevas} notas nuevas, {$duplicados} ya existían"
            : 'Análisis guardado correctamente',
    ]);

} catch (Throwable $e) {
    $pdo->rollBack();
    error_log('[analizar] ' . $e->getMessage());
    echo json_encode(['ok' => false, 'msg' => 'Error interno: ' . $e->getMessage()]);
}
