<?php
/**
 * modules/registro_exams/api/get_orden.php
 * GET ?id=<orden_id>
 * Devuelve la orden completa: datos, paciente, ítems, muestras, resultados.
 */

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

$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
if ($id <= 0) {
    jsonError('ID de orden inválido');
}

$pdo = db();

// Orden + paciente
$stmt = $pdo->prepare('
    SELECT
        o.id, o.codigo, o.prioridad, o.estado,
        o.requiere_ayuno, o.horas_ayuno,
        o.medico_nombre, o.medico_registro,
        o.diagnostico, o.notas,
        o.solicitud_id, o.orden_medica_id,
        o.creado_por, o.creado_at, o.updated_at,
        p.id            AS paciente_id,
        p.nombre_completo,
        p.numero_documento,
        p.tipo_documento,
        p.telefono,
        p.email,
        p.fecha_nacimiento,
        p.genero,
        p.eps
    FROM exam_ordenes o
    JOIN lab_pacientes p ON p.id = o.paciente_id
    WHERE o.id = ?
');
$stmt->execute([$id]);
$orden = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$orden) {
    jsonError('Orden no encontrada', 404);
}

// Calcular edad
if ($orden['fecha_nacimiento']) {
    $diff = (new DateTime($orden['fecha_nacimiento']))->diff(new DateTime());
    $orden['edad'] = $diff->y;
} else {
    $orden['edad'] = null;
}

// Ítems
$stmt = $pdo->prepare('
    SELECT
        ei.id, ei.orden_id, ei.exam_tipo_id, ei.estado, ei.notas_tecnico, ei.creado_at,
        et.codigo AS tipo_codigo, et.nombre AS tipo_nombre,
        et.categoria, et.requiere_ayuno AS tipo_requiere_ayuno,
        et.instrucciones AS tipo_instrucciones
    FROM exam_items ei
    JOIN exam_tipos et ON et.id = ei.exam_tipo_id
    WHERE ei.orden_id = ?
    ORDER BY et.categoria, et.nombre
');
$stmt->execute([$id]);
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Resultados por ítem
$resultadosPorItem = [];
if ($items) {
    $itemIds = array_column($items, 'id');
    $inPh    = implode(',', array_fill(0, count($itemIds), '?'));
    $stmt    = $pdo->prepare("
        SELECT er.*, au.nombre AS ingresado_nombre
          FROM exam_resultados er
          LEFT JOIN admin_users au ON au.id = er.ingresado_por
         WHERE er.item_id IN ({$inPh})
         ORDER BY er.item_id, er.id
    ");
    $stmt->execute($itemIds);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $res) {
        $resultadosPorItem[(int) $res['item_id']][] = $res;
    }
}

// Agregar resultados a cada ítem
foreach ($items as &$item) {
    $item['resultados'] = $resultadosPorItem[(int) $item['id']] ?? [];
}
unset($item);

// Muestras
$stmt = $pdo->prepare('
    SELECT em.*, au.nombre AS tomada_nombre
      FROM exam_muestras em
      LEFT JOIN admin_users au ON au.id = em.tomada_por
     WHERE em.orden_id = ?
     ORDER BY em.id
');
$stmt->execute([$id]);
$muestras = $stmt->fetchAll(PDO::FETCH_ASSOC);

jsonOk([
    'data' => array_merge($orden, [
        'items'    => $items,
        'muestras' => $muestras,
    ]),
]);
