<?php
require_once __DIR__ . '/../../config/config.php';
requireLogin();
require_once __DIR__ . '/../../vendor/autoload.php';

// /private/tmp siempre es escribible por cualquier usuario en macOS
$mpdfTempDir = '/private/tmp/mpdf_labclinic';
if (!is_dir($mpdfTempDir)) {
    mkdir($mpdfTempDir, 0777, true);
}

$db = getDB();
$orden_id = intval($_GET['orden_id'] ?? 0);

$stmt = $db->prepare("
    SELECT o.*, p.nombre, p.apellidos, p.documento_tipo, p.documento_numero, p.sexo, p.fecha_nacimiento, p.telefono,
           p.codigo as paciente_codigo,
           u.nombre as laboratorista_nombre, u.firma, u.firma_extension
    FROM ordenes o 
    JOIN pacientes p ON o.paciente_id = p.id 
    LEFT JOIN usuarios u ON o.laboratorista_id = u.id
    WHERE o.id = ?
");
$stmt->execute([$orden_id]);
$orden = $stmt->fetch();

if (!$orden) { die('Orden no encontrada'); }

$stmt = $db->query("SELECT * FROM configuracion LIMIT 1");
$config = $stmt->fetch();

$edad = 30;
if (!empty($orden['fecha_nacimiento'])) {
    $edad = date_diff(date_create($orden['fecha_nacimiento']), date_create('today'))->y;
}

$stmt = $db->prepare("
    SELECT od.*, e.nombre as examen_nombre, e.codigo as examen_codigo, e.muestra_requerida,
           c.nombre as categoria_nombre, c.id as categoria_id
    FROM orden_detalle od
    JOIN examenes e ON od.examen_id = e.id
    LEFT JOIN categorias_examenes c ON e.categoria_id = c.id
    WHERE od.orden_id = ?
    ORDER BY c.nombre, e.nombre
");
$stmt->execute([$orden_id]);
$detalles = $stmt->fetchAll();

$examenesPorCategoria = [];
foreach ($detalles as $det) {
    $cat = $det['categoria_nombre'] ?? 'Otros Examenes';
    $examenesPorCategoria[$cat][] = $det;
}

$ordenCategorias = [
    'Hematologia'=>1,'Coprologia'=>2,'Quimica Clinica'=>3,'Quimica'=>4,'Uroanalis'=>5,
    'Inmunologia'=>6,'Serologia'=>7,'Coagulacion'=>8,'Hormonas'=>9,'Microbiologia'=>10,
    'Parasitologia'=>11,'Marcadores Tumorales'=>12,'Gases Arteriales'=>13,'Liquidos Corporales'=>14,'Otros Examenes'=>99
];
uksort($examenesPorCategoria, function($a,$b) use($ordenCategorias){
    return ($ordenCategorias[$a]??50)-($ordenCategorias[$b]??50);
});

$categoriasTienenRangos = [];
foreach ($examenesPorCategoria as $catNombre => $exCat) {
    $tiene = false;
    foreach ($exCat as $dc) {
        $sc = $db->prepare("SELECT COUNT(*) FROM parametros_examen p JOIN rangos_referencia rr ON rr.parametro_id=p.id WHERE p.examen_id=? AND p.activo=1 AND (rr.sexo=? OR rr.sexo='Ambos') AND ? BETWEEN rr.edad_min AND rr.edad_max");
        $sc->execute([$dc['examen_id'], $orden['sexo'], $edad]);
        if ($sc->fetchColumn() > 0) { $tiene = true; break; }
    }
    $categoriasTienenRangos[$catNombre] = $tiene;
}

$cp = $config['color_primario']   ?? '#0097a7';
$cs = $config['color_secundario'] ?? '#455a64';

// QR
$qrBase64 = '';
if (!empty($orden['token_publico'])) {
    $urlPublica = SITE_URL . '/ver_resultados.php?token=' . urlencode($orden['token_publico']);
    $qrApiUrl   = 'https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=' . urlencode($urlPublica);
    $ctx = stream_context_create(['http' => ['timeout' => 5]]);
    $qrData = @file_get_contents($qrApiUrl, false, $ctx);
    if ($qrData) $qrBase64 = 'data:image/png;base64,' . base64_encode($qrData);
}

$logoHtml = '';
if (!empty($config['logo'])) {
    $logoHtml = '<img src="data:image/' . $config['logo_extension'] . ';base64,' . base64_encode($config['logo']) . '" style="max-width:110px;max-height:80px;">';
}

$registros = [];
if (!empty($config['jvplc'])) $registros[] = 'J.V.P.L.C. ' . htmlspecialchars($config['jvplc']);
if (!empty($config['cssp']))  $registros[] = 'C.S.S.P. N&amp;#176; ' . htmlspecialchars($config['cssp']);
$contacto = [];
if (!empty($config['telefono'])) $contacto[] = 'Tel: ' . htmlspecialchars($config['telefono']);
if (!empty($config['whatsapp'])) $contacto[] = 'WA: '  . htmlspecialchars($config['whatsapp']);
if (!empty($config['email']))    $contacto[] = htmlspecialchars($config['email']);

$firmaImgHtml = '';
if (!empty($orden['firma'])) {
    $firmaImgHtml = '<img src="data:image/' . ($orden['firma_extension'] ?? 'png') . ';base64,' . base64_encode($orden['firma']) . '" style="max-height:50px;max-width:120px;">';
}
$selloImgHtml = '';
if (!empty($config['sello_jvc'])) {
    $selloImgHtml = '<img src="data:image/' . ($config['sello_extension'] ?? 'png') . ';base64,' . base64_encode($config['sello_jvc']) . '" style="max-height:50px;max-width:120px;">';
}

ob_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family: Arial, sans-serif; font-size:10px; color:#333; }
table { border-collapse:collapse; width:100%; }
.divider { border-top:1.5px solid <?= $cs ?>; margin:4px 0; }
.field-label { background:<?= $cp ?>; color:#fff; font-weight:bold; font-size:8.5px; text-align:center; padding:2px 3px; }
.field-value { text-align:center; font-size:8.5px; padding:2px 3px; border:1px solid #aaa; border-top:none; }
.cat-header { color:<?= $cs ?>; font-weight:bold; font-size:9.5px; text-transform:uppercase; text-align:center; padding:2px 5px; border-bottom:1.5px solid <?= $cs ?>; }
.res-th { background:#f5f5f5; padding:2px 4px; font-size:8px; font-weight:bold; border-bottom:1px solid #ddd; text-align:left; }
.res-td { padding:1px 4px; font-size:8.5px; border-bottom:1px solid #eee; vertical-align:middle; }
.examen-nombre { font-weight:bold; font-size:9.5px; color:<?= $cs ?>; }
.param-nombre { padding-left:8px; }
.sep-titulo { background:#f5f5f5; font-weight:bold; font-size:8px; color:<?= $cs ?>; padding:2px 4px; text-transform:uppercase; }
.alto { color:#c62828; font-weight:bold; }
.bajo { color:#1976d2; font-weight:bold; }
.footer-legal { background:#fff0f0; color:#7b1a1a; font-weight:bold; font-style:italic; font-size:7.5px; text-align:center; padding:4px 6px; margin-top:6px; border-top:1px solid <?= $cs ?>; }
</style>
</head>
<body>

<table style="width:100%;margin-bottom:4px;">
<tr>
  <td style="width:100px;text-align:center;vertical-align:middle;"><?= $logoHtml ?></td>
  <td style="text-align:center;vertical-align:middle;padding:0 6px;">
    <div style="font-size:13px;font-weight:bold;text-transform:uppercase;color:#333;"><?= htmlspecialchars($config['nombre_laboratorio'] ?? SITE_NAME) ?></div>
    <?php if (!empty($config['informacion_adicional'])): ?>
    <div style="font-size:9.5px;font-style:italic;color:#444;"><?= htmlspecialchars($config['informacion_adicional']) ?></div>
    <?php endif; ?>
    <?php if (!empty($registros)): ?>
    <div style="font-size:8px;color:#333;"><?= implode('&nbsp;&nbsp;', $registros) ?></div>
    <?php endif; ?>
    <?php if (!empty($config['direccion'])): ?>
    <div style="font-size:8px;color:#444;"><?= htmlspecialchars($config['direccion']) ?></div>
    <?php endif; ?>
    <?php if (!empty($contacto)): ?>
    <div style="font-size:8px;color:#333;"><?= implode(' | ', $contacto) ?></div>
    <?php endif; ?>
  </td>
  <td style="width:55px;text-align:center;vertical-align:middle;">
    <?php if ($qrBase64): ?>
    <img src="<?= $qrBase64 ?>" style="width:48px;height:48px;">
    <div style="font-size:6px;color:#888;">Ver resultados</div>
    <?php endif; ?>
  </td>
</tr>
</table>

<div class="divider"></div>

<table style="width:100%;margin-bottom:3px;">
<tr>
  <td style="font-size:10px;color:<?= $cs ?>;">Informe de Resultados de Laboratorio</td>
  <td style="text-align:right;font-size:10px;color:<?= $cs ?>;font-weight:bold;">N&#176;. Orden: <?= htmlspecialchars($orden['codigo']) ?></td>
</tr>
</table>

<table style="width:100%;margin-bottom:2px;border-collapse:separate;border-spacing:2px 0;">
<tr>
  <td style="width:16%;">
    <div class="field-label">N&#176; Referencia</div>
    <div class="field-value"><?= htmlspecialchars($orden['paciente_codigo'] ?? $orden['codigo']) ?></div>
  </td>
  <td style="width:38%;">
    <div class="field-label">Paciente</div>
    <div class="field-value"><?= htmlspecialchars($orden['nombre'] . ' ' . $orden['apellidos']) ?></div>
  </td>
  <td style="width:13%;">
    <div class="field-label">Edad</div>
    <div class="field-value"><?= $edad ?> a&#241;os</div>
  </td>
  <td style="width:15%;">
    <div class="field-label">G&#233;nero</div>
    <div class="field-value"><?= $orden['sexo']=='M' ? 'Masculino' : 'Femenino' ?></div>
  </td>
  <td style="width:18%;">
    <div class="field-label">Recepci&#243;n</div>
    <div class="field-value"><?= date('d/m/Y h:i A', strtotime($orden['fecha_orden'])) ?></div>
  </td>
</tr>
</table>

<table style="width:100%;margin-bottom:5px;border-collapse:separate;border-spacing:2px 0;">
<tr>
  <td style="width:24%;">
    <div class="field-label"><?= htmlspecialchars($orden['documento_tipo'] ?? 'DUI') ?></div>
    <div class="field-value"><?= htmlspecialchars($orden['documento_numero'] ?? '-') ?></div>
  </td>
  <td style="width:24%;">
    <div class="field-label">Tel&#233;fono</div>
    <div class="field-value"><?= htmlspecialchars($orden['telefono'] ?? '-') ?></div>
  </td>
</tr>
</table>
<div class="divider"></div>

<?php foreach ($examenesPorCategoria as $categoria => $examenesCategoria):
    $conRangos = $categoriasTienenRangos[$categoria] ?? false;
    $cols = $conRangos ? 4 : 3;
?>
<div class="cat-header"><?= htmlspecialchars(strtoupper($categoria)) ?></div>
<table style="width:100%;border-collapse:collapse;table-layout:fixed;margin-bottom:5px;">
<colgroup>
  <col style="width:40%">
  <col style="width:20%">
  <?php if ($conRangos): ?><col style="width:25%"><?php endif; ?>
  <col style="width:<?= $conRangos ? '15%' : '40%' ?>">
</colgroup>
<thead>
<tr>
  <th class="res-th">EX&#193;MENES</th>
  <th class="res-th">RESULTADOS</th>
  <?php if ($conRangos): ?><th class="res-th">VALORES NORMALES</th><?php endif; ?>
  <th class="res-th">UNIDADES</th>
</tr>
</thead>
<tbody>
<?php foreach ($examenesCategoria as $det):
    $stmtRes = $db->prepare("
        SELECT p.id as parametro_id, p.nombre as parametro_nombre, p.unidad, p.tipo_entrada, p.es_titulo,
               r.valor, r.valor_numerico, r.fuera_rango
        FROM parametros_examen p
        LEFT JOIN resultados r ON r.parametro_id=p.id AND r.orden_detalle_id=?
        WHERE p.examen_id=? AND p.activo=1 ORDER BY p.orden, p.nombre
    ");
    $stmtRes->execute([$det['id'], $det['examen_id']]);
    $resultados = $stmtRes->fetchAll();

    $filasVisibles = array_values(array_filter($resultados, fn($r) =>
        !empty($r['es_titulo']) || ($r['valor'] !== null && $r['valor'] !== '')
    ));
    if (empty($filasVisibles)) continue;

    $totalReales = count(array_filter($filasVisibles, fn($r) => empty($r['es_titulo'])));
    $mostrarExamen = $totalReales > 1;

    if ($mostrarExamen):
?>
<tr><td colspan="<?= $cols ?>" class="res-td examen-nombre"><?= htmlspecialchars($det['examen_nombre']) ?></td></tr>
<?php endif; ?>
<?php foreach ($filasVisibles as $res):
    $esTitulo   = !empty($res['es_titulo']);
    $tipoEntrada = $res['tipo_entrada'] ?? 'numerico';
    $rangos = [];

    if (!$esTitulo) {
        $sr = $db->prepare("SELECT * FROM rangos_referencia WHERE parametro_id=? AND (sexo=? OR sexo='Ambos') AND ? BETWEEN edad_min AND edad_max ORDER BY edad_min,edad_max,id");
        $sr->execute([$res['parametro_id'], $orden['sexo'], $edad]);
        $rangosRaw = $sr->fetchAll();
        $rc = [];
        foreach ($rangosRaw as $rr) {
            $clave = $rr['sexo'].'|'.$rr['valor_min'].'|'.$rr['valor_max'].'|'.trim((string)($rr['valor_texto'] ?? ''));
            if (!isset($rc[$clave])) { $rc[$clave] = true; $rangos[] = $rr; }
        }
    }

    $claseVal = 'res-td';
    $simb = '';
    if (!$esTitulo && $tipoEntrada === 'numerico' && $res['fuera_rango']) {
        if (!empty($rangos) && $res['valor_numerico'] !== null) {
            $rm = $rangos[0];
            if ($rm['valor_min'] !== null && $res['valor_numerico'] < $rm['valor_min']) {
                $claseVal = 'res-td bajo'; $simb = '<span class="bajo">&#8595;</span>';
            } else {
                $claseVal = 'res-td alto'; $simb = '<span class="alto">&#8593;</span>';
            }
        } else {
            $claseVal = 'res-td alto'; $simb = '<span class="alto">&#8593;</span>';
        }
    }

    $valRef = '';
    if (!empty($rangos)) {
        $partes = [];
        foreach ($rangos as $ri) {
            if ($tipoEntrada === 'numerico' && $ri['valor_min'] !== null && $ri['valor_max'] !== null)
                $partes[] = number_format($ri['valor_min'], 2) . ' - ' . number_format($ri['valor_max'], 2);
            elseif (!empty($ri['valor_texto']))
                $partes[] = htmlspecialchars($ri['valor_texto']);
        }
        $valRef = implode('<br>', $partes);
    }

    if ($esTitulo):
?>
<tr><td colspan="<?= $cols ?>" class="res-td sep-titulo"><?= htmlspecialchars($res['parametro_nombre']) ?></td></tr>
<?php else:
    $bgRow       = $res['fuera_rango'] ? ' style="background:#fff0f0;"' : '';
    $nombreMostrar = $mostrarExamen ? $res['parametro_nombre'] : $det['examen_nombre'];
    $claseNombre   = $mostrarExamen ? 'res-td param-nombre' : 'res-td examen-nombre';
?>
<tr<?= $bgRow ?>>
  <td class="<?= $claseNombre ?>"><?= htmlspecialchars($nombreMostrar) ?></td>
  <td class="<?= $claseVal ?>"><?= htmlspecialchars($res['valor']) ?><?= $simb ?></td>
  <?php if ($conRangos): ?><td class="res-td" style="font-size:8px;color:#555;"><?= $valRef ?></td><?php endif; ?>
  <td class="res-td"><?= htmlspecialchars($res['unidad'] ?? '') ?></td>
</tr>
<?php endif; endforeach; endforeach; ?>
</tbody>
</table>
<?php endforeach; ?>

<table style="width:100%;margin-top:8px;border-top:1px solid <?= $cs ?>;">
<tr>
  <td style="width:50%;text-align:left;vertical-align:bottom;padding-top:4px;">
    <?= $firmaImgHtml ?>
    <?php if (!empty($orden['laboratorista_nombre'])): ?>
    <br><span style="font-size:9px;font-weight:600;"><?= htmlspecialchars($orden['laboratorista_nombre']) ?></span>
    <?php endif; ?>
  </td>
  <td style="width:50%;text-align:right;vertical-align:bottom;padding-top:4px;">
    <?= $selloImgHtml ?>
  </td>
</tr>
</table>
<div class="footer-legal">
  Los valores marcados con <span style="color:#c62828;font-weight:bold;">&#8593;</span> (alto) o <span style="color:#1976d2;font-weight:bold;">&#8595;</span> (bajo) estan fuera del rango de referencia. Consulte con su medico.<br>
  Resultados confidenciales de uso exclusivo del paciente y su medico tratante. Orden N&#176; <?= htmlspecialchars($orden['codigo']) ?>
</div>

</body>
</html>
<?php
$html = ob_get_clean();

$mpdf = new \Mpdf\Mpdf([
    'mode'          => 'utf-8',
    'format'        => 'Letter',
    'margin_top'    => 10,
    'margin_bottom' => 10,
    'margin_left'   => 15,
    'margin_right'  => 15,
    'tempDir'       => $mpdfTempDir,
]);

$mpdf->WriteHTML($html);

$nombreArchivo = 'Resultados_' . preg_replace('/[^A-Za-z0-9\-_]/', '_', $orden['codigo']) . '.pdf';
$mpdf->Output($nombreArchivo, \Mpdf\Output\Destination::DOWNLOAD);
exit;
