<?php
/**
 * modules/registro_exams/api/save_resultado.php
 * POST — agrega o reemplaza resultados de un ítem de examen.
 *
 * Body JSON:
 * {
 *   "item_id": int,                // requerido
 *   "resultados": [
 *     {
 *       "campo_nombre":    "Hemoglobina",
 *       "valor_texto":     "14.5",
 *       "valor_numerico":  14.5,         // null si no aplica
 *       "unidad":          "g/dL",
 *       "referencia_min":  12.0,         // null si no aplica
 *       "referencia_max":  16.0,
 *       "referencia_texto":"12.0 – 16.0 g/dL",
 *       "es_anormal":      false
 *     },
 *     ...
 *   ]
 * }
 *
 * Respuesta: { ok: true, inserted: N }
 */

require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireExams();

$body   = inputJson();
$itemId = isset($body['item_id']) ? (int) $body['item_id'] : 0;

if ($itemId <= 0) {
    jsonError('item_id inválido');
}

$resultados = $body['resultados'] ?? [];
if (!is_array($resultados) || count($resultados) === 0) {
    jsonError('Debe enviar al menos un resultado');
}

$pdo = db();

// Verificar que el ítem existe
$stmt = $pdo->prepare('SELECT id, orden_id FROM exam_items WHERE id = ?');
$stmt->execute([$itemId]);
$item = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$item) {
    jsonError('Ítem no encontrado', 404);
}

try {
    $pdo->beginTransaction();

    // Borrar resultados anteriores del ítem (reemplazo completo)
    $pdo->prepare('DELETE FROM exam_resultados WHERE item_id = ?')->execute([$itemId]);

    $ins = $pdo->prepare('
        INSERT INTO exam_resultados
            (item_id, campo_nombre, valor_texto, valor_numerico,
             unidad, referencia_min, referencia_max, referencia_texto,
             es_anormal, ingresado_por)
        VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ');

    $inserted = 0;
    foreach ($resultados as $r) {
        $campo = trim($r['campo_nombre'] ?? '');
        if ($campo === '') {
            continue;
        }
        $ins->execute([
            $itemId,
            $campo,
            isset($r['valor_texto']) && $r['valor_texto'] !== '' ? $r['valor_texto'] : null,
            isset($r['valor_numerico']) && $r['valor_numerico'] !== null ? (float) $r['valor_numerico'] : null,
            isset($r['unidad']) && $r['unidad'] !== '' ? $r['unidad'] : null,
            isset($r['referencia_min']) && $r['referencia_min'] !== null ? (float) $r['referencia_min'] : null,
            isset($r['referencia_max']) && $r['referencia_max'] !== null ? (float) $r['referencia_max'] : null,
            isset($r['referencia_texto']) && $r['referencia_texto'] !== '' ? $r['referencia_texto'] : null,
            empty($r['es_anormal']) ? 0 : 1,
            adminId(),
        ]);
        $inserted++;
    }

    if ($inserted === 0) {
        $pdo->rollBack();
        jsonError('No se guardó ningún resultado (verifique los campos)');
    }

    // Actualizar estado del ítem a resultado_listo
    $pdo->prepare(
        "UPDATE exam_items SET estado = 'resultado_listo' WHERE id = ?"
    )->execute([$itemId]);

    // Verificar si todos los ítems de la orden están listos para cerrarla
    $stmtCheck = $pdo->prepare(
        "SELECT COUNT(*) FROM exam_items
          WHERE orden_id = ?
            AND estado NOT IN ('resultado_listo','entregado')"
    );
    $stmtCheck->execute([$item['orden_id']]);
    $pendientes = (int) $stmtCheck->fetchColumn();

    if ($pendientes === 0) {
        $pdo->prepare(
            "UPDATE exam_ordenes SET estado = 'completa', updated_at = NOW() WHERE id = ?"
        )->execute([$item['orden_id']]);
    }

    $pdo->commit();

    jsonOk(['inserted' => $inserted], 'Resultados guardados');

} catch (\Throwable $e) {
    $pdo->rollBack();
    jsonError('Error al guardar resultados: ' . $e->getMessage(), 500);
}
