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

$db = getDB();
$orden_id = intval($_GET['orden_id'] ?? 0);
$descargarPdf = (isset($_GET['auto_pdf']) && $_GET['auto_pdf'] == '1');

// Obtener orden
$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');
}

// Obtener configuración
$stmt = $db->query("SELECT * FROM configuracion LIMIT 1");
$config = $stmt->fetch();

// Calcular edad
$edad = 30; // valor por defecto si no hay fecha
if (!empty($orden['fecha_nacimiento'])) {
    $edadCalc = date_diff(date_create($orden['fecha_nacimiento']), date_create('today'))->y;
    $edad = $edadCalc; // puede ser 0 para recién nacidos, es válido
}

// Obtener exámenes y resultados agrupados por categoría
$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();

// Agrupar por categoría
$examenesPorCategoria = [];
foreach ($detalles as $det) {
    $cat = $det['categoria_nombre'] ?? 'Otros Exámenes';
    if (!isset($examenesPorCategoria[$cat])) {
        $examenesPorCategoria[$cat] = [];
    }
    $examenesPorCategoria[$cat][] = $det;
}

// Ordenar categorías en orden específico
$ordenCategorias = [
    'Hematología' => 1,
    'Coprología' => 2,
    'Química Clínica' => 3,
    'Química' => 4,
    'Uroanálisis' => 5,
    'Inmunología' => 6,
    'Serología' => 7,
    'Coagulación' => 8,
    'Hormonas' => 9,
    'Microbiología' => 10,
    'Parasitología' => 11,
    'Marcadores Tumorales' => 12,
    'Gases Arteriales' => 13,
    'Líquidos Corporales' => 14,
    'Otros Exámenes' => 99
];

uksort($examenesPorCategoria, function($a, $b) use ($ordenCategorias) {
    $ordenA = $ordenCategorias[$a] ?? 50;
    $ordenB = $ordenCategorias[$b] ?? 50;
    return $ordenA - $ordenB;
});

// Pre-computar si cada categoría tiene rangos de referencia para este paciente
$categoriasTienenRangos = [];
foreach ($examenesPorCategoria as $catNombre => $examenesCategoriaTmp2) {
    $tieneRangos = false;
    foreach ($examenesCategoriaTmp2 as $detCheck) {
        $stmtCheck = $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
        ");
        $stmtCheck->execute([$detCheck['examen_id'], $orden['sexo'], $edad]);
        if ($stmtCheck->fetchColumn() > 0) {
            $tieneRangos = true;
            break;
        }
    }
    $categoriasTienenRangos[$catNombre] = $tieneRangos;
}

// Contar exámenes que realmente se renderizan (para evitar salto al último)
$totalExamenesRenderizables = 0;
foreach ($examenesPorCategoria as $examenesCategoriaTmp) {
    foreach ($examenesCategoriaTmp as $detTmp) {
        $stmtResTmp = $db->prepare(" 
            SELECT 
                p.es_titulo,
                r.valor
            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
        ");
        $stmtResTmp->execute([$detTmp['id'], $detTmp['examen_id']]);
        $resultadosTmp = $stmtResTmp->fetchAll();

        $filasVisiblesTmp = array_values(array_filter($resultadosTmp, function($row) {
            return !empty($row['es_titulo']) || ($row['valor'] !== null && $row['valor'] !== '');
        }));

        if (!empty($filasVisiblesTmp)) {
            $totalExamenesRenderizables++;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Resultados - <?= $orden['codigo'] ?></title>
    <?php
    // Generar URLs públicas con token encriptado
    $urlPublica = SITE_URL . '/ver_resultados.php?token=' . urlencode($orden['token_publico'] ?? '');
    $urlPublicaPdf = $urlPublica . '&descargar_pdf=1';
    // QR via API qrserver.com - descargar y embeber como base64
    $qrBase64 = '';
    $qrPublicUrl = '';
    if (!empty($orden['token_publico'])) {
        // El QR apunta directamente a la descarga del PDF
        $qrPublicUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=' . urlencode($urlPublicaPdf);
        $qrApiUrl = 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=' . urlencode($urlPublicaPdf);
        $ctx = stream_context_create(['http' => ['timeout' => 5]]);
        $qrData = @file_get_contents($qrApiUrl, false, $ctx);
        if ($qrData !== false) {
            $qrBase64 = 'data:image/png;base64,' . base64_encode($qrData);
        }
    }
    ?>
    <style>
        <?php
        $colorPrimario = $config['color_primario'] ?? '#0097a7';
        $colorSecundario = $config['color_secundario'] ?? '#455a64';

        $hex = ltrim((string)$colorPrimario, '#');
        if (strlen($hex) === 3) {
            $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
        }
        if (strlen($hex) !== 6 || !ctype_xdigit($hex)) {
            $hex = '0097a7';
        }
        $sombraR = hexdec(substr($hex, 0, 2));
        $sombraG = hexdec(substr($hex, 2, 2));
        $sombraB = hexdec(substr($hex, 4, 2));
        ?>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        
        body {
            font-family: 'Arial', sans-serif;
            font-size: 12px;
            line-height: 1.4;
            color: #333;
            background: #e0e0e0;
            margin: 0;
            padding: 20px 0;
        }
        
        /* ===== CONTENEDOR TIPO PÁGINA CARTA ===== */
        .page-wrapper {
            width: 8.5in;
            min-height: 11in;
            margin: 0 auto;
            background: #ffffff;
            box-shadow: 0 2px 20px rgba(<?= $sombraR ?>, <?= $sombraG ?>, <?= $sombraB ?>, 0.28);
            padding: 0.5in 0.6in;
        }
        /* Ocultar page-wrapper cuando se muestran páginas visuales (via clase, no inline) */
        .page-wrapper-hidden { display: none; }
        /* Páginas visuales en navegador */
        .pages-container { max-width: 900px; margin: 20px auto; }
        .visual-page { width: 8.5in; height: 11in; background: #fff; box-shadow: 0 2px 20px rgba(<?= $sombraR ?>, <?= $sombraG ?>, <?= $sombraB ?>, 0.28); margin: 18px auto; padding: 0.5in 0.6in; box-sizing: border-box; overflow: hidden; }
        .visual-page .page-inner { display: block; height: 100%; position: relative; padding-bottom: 180px; }
        .visual-page .page-content { display: block; overflow: hidden; }
        .visual-page .page-footer { position: absolute; left: 0; right: 0; bottom: 0; }

        /* Bloque superior con firma y sello */
        .top-signs { display:flex; justify-content:center; gap:30px; align-items:center; margin:6px 0 10px; }
        .top-sign { display:flex; flex-direction:column; align-items:center; gap:6px; }
        .top-firma, .top-sello { max-height:56px; max-width:220px; height:auto; display:block; }
        .top-firma-name { font-size:11px; font-weight:600; color: #222; }
        .top-sello-label { font-size:10px; color:#666; }
        
        /* Tabla principal: thead=encabezado, tfoot=pie, tbody=contenido */
        .main-table {
            width: 100%;
            border-collapse: collapse;
        }
        .main-table > thead { display: table-header-group; }
        .main-table > tfoot { display: table-footer-group; }
        .main-table > tbody { display: table-row-group; }
        .main-table > thead td,
        .main-table > tfoot td,
        .main-table > tbody td {
            padding: 0;
            vertical-align: top;
        }
        
        /* ===== ENCABEZADO DEL LABORATORIO ===== */
        .lab-header {
            display: flex;
            align-items: center;
            padding: 0 0 8px 0;
            gap: 12px;
        }
        .lab-header .logo-container {
            flex: 0 0 140px;
            text-align: center;
        }
        .lab-header .logo-container img {
            max-width: 135px;
            max-height: 100px;
        }
        .lab-header .lab-info {
            flex: 1;
            text-align: center;
        }
        .lab-header .qr-container {
            flex: 0 0 60px;
            text-align: center;
        }
        .lab-header .qr-container img {
            width: 55px;
            height: 55px;
        }
        .lab-header .qr-container .qr-text {
            font-size: 6.5px;
            color: #888;
            margin-top: 2px;
        }
        .lab-header h1 {
            color: #333;
            font-size: 16px;
            font-weight: bold;
            margin-bottom: 1px;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        .lab-header .lab-subtitle {
            font-size: 12.5px;
            font-style: italic;
            color: #444;
            margin-bottom: 1px;
        }
        .lab-header .lab-registro {
            font-size: 10px;
            color: #333;
            margin-bottom: 1px;
        }
        .lab-header .lab-direccion {
            font-size: 9px;
            color: #444;
            margin-bottom: 1px;
            line-height: 1.4;
        }
        .lab-header .lab-contacto {
            font-size: 9.5px;
            color: #333;
            margin-top: 3px;
            display: flex;
            justify-content: center;
            gap: 15px;
            flex-wrap: wrap;
        }
        .lab-header .lab-contacto span {
            margin: 0;
            white-space: nowrap;
        }
        
        /* ===== BARRA TÍTULO INFORME ===== */
        .titulo-barra {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 4px 5px;
            margin-bottom: 5px;
        }
        .titulo-barra .titulo {
            font-weight: normal;
            font-size: 11.5px;
            color: <?= $colorSecundario ?>;
        }
        .titulo-barra .orden-num {
            font-size: 11.5px;
            color: <?= $colorSecundario ?>;
        }
        .titulo-barra .orden-num strong {
            font-size: 13px;
            margin-left: 8px;
        }
        
        /* ===== GRID PACIENTE - BLOQUES APILADOS ===== */
        .patient-rows {
            margin-bottom: 6px;
        }
        .patient-row {
            display: flex;
            gap: 5px;
            margin-bottom: 5px;
        }
        .field-block {
            flex: 1;
            border-radius: 7px;
            overflow: hidden;
            border: 1px solid #aaa;
        }
        .field-block .field-label {
            background: <?= $colorPrimario ?>;
            color: #ffffff;
            font-weight: bold;
            font-size: 11px;
            text-align: center;
            padding: 3px 6px;
            white-space: nowrap;
        }
        .field-block .field-value {
            background: #ffffff;
            text-align: center;
            font-size: 11.5px;
            padding: 4px 6px;
            min-height: 22px;
            color: #333;
        }
        
        /* ===== RESULTADOS ===== */
        .categoria-section {
            page-break-inside: auto;
            margin-top: 5px;
        }
        .categoria-header {
            color: <?= $colorSecundario ?>;
            font-weight: bold;
            font-size: 11px;
            text-transform: uppercase;
            text-align: center;
            padding: 3px 10px;
            border-bottom: 1.5px solid <?= $colorSecundario ?>;
            margin-bottom: 0;
        }
        .resultados-table {
            width: 100%;
            border-collapse: collapse;
            table-layout: fixed;
        }
        .resultados-header-categoria {
            margin-bottom: 0;
        }
        .resultados-table th {
            background: #f5f5f5;
            padding: 2px 8px;
            text-align: left;
            font-size: 9px;
            font-weight: bold;
            color: #333;
            border-bottom: 1px solid #ddd;
        }
        .resultados-table td {
            padding: 1px 8px;
            font-size: 10px;
            vertical-align: middle;
            border-bottom: 1px solid #eee;
            line-height: 1.2;
        }
        .examen-block {
            margin-top: 0;
        }
        .examen-block.examen-separado {
            /* salto forzado desactivado */
        }
        .examen-nombre {
            font-weight: bold;
            font-size: 12.5px;
            color: <?= $colorSecundario ?>;
        }
        .muestra-badge {
            display: inline-block;
            font-size: 7px;
            font-weight: bold;
            color: #fff;
            background: #78909c;
            padding: 1px 4px;
            border-radius: 3px;
            margin-left: 5px;
            vertical-align: middle;
            letter-spacing: 0.3px;
        }
        .parametro-nombre {
            padding-left: 12px !important;
        }
        .separador-impresion td {
            background: #f5f5f5;
            color: <?= $colorSecundario ?>;
            font-weight: bold;
            text-transform: uppercase;
            letter-spacing: 0.3px;
            border-bottom: 1px solid #ddd;
            padding: 4px 8px;
        }
        .resultado-alto { color: #c62828; font-weight: bold; }
        .resultado-bajo { color: #1976d2; font-weight: bold; }
        .fuera-rango { background-color: #fff0f0; }
        
        /* ===== NOTA ===== */
        .nota {
            background: #fffbeb;
            border-left: 3px solid #f59e0b;
            padding: 6px 8px;
            margin: 12px 0;
            font-size: 8.5px;
        }
        
        /* ===== FIRMA Y SELLO ===== */
        .firma-section {
            margin-top: 25px;
            display: flex;
            justify-content: center;
            gap: 50px;
        }
        .firma {
            text-align: center;
            flex: 1 1 0;
            max-width: 48%;
        }
        .firma img {
            display: block;
            margin: 0 auto;
            max-height: 80px;
            max-width: 100%;
            height: auto;
        }
        .firma .sello-laboratorista,
        .firma .sello-laboratorio {
            max-height: 160px;
            max-width: 100%;
        }
        .firma-line {
            border-top: 1px solid #333;
            margin-top: 35px;
            padding-top: 4px;
            font-size: 10px;
        }
        
        /* ===== PIE DE PÁGINA (se repite en cada hoja) ===== */
        .page-footer {
            padding-top: 8px;
            text-align: center;
            background: transparent;
        }
        .page-footer .footer-top {
            display: flex;
            justify-content: space-between;
            align-items: flex-end;
            gap: 8px;
            margin-bottom: 6px;
        }
        .page-footer .footer-col {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
        .page-footer .footer-col-left  { align-items: flex-start; }
        .page-footer .footer-col-right { align-items: flex-end; }
        .page-footer .footer-firma {
            max-height: 126px;
            max-width: 288px;
            height: auto;
            display: block;
        }
        .page-footer .footer-sello {
            max-height: 126px;
            max-width: 100%;
            height: auto;
            display: block;
            margin-top: 0;
            margin-bottom: 4px;
        }
        .page-footer .footer-firma-name { font-size: 11px; font-weight: 600; color: #222; white-space: nowrap; text-align: center; }
        .page-footer .footer-sello-label { font-size: 10px; color: #666; text-align: right; }
        .page-footer .footer-lab-name { font-size: 12px; font-weight: 700; color: <?= $colorSecundario ?>; text-align: left; line-height: 1.4; }
        .page-footer .footer-legal {
            border-top: 1.5px solid <?= $colorSecundario ?>;
            padding: 5px 8px;
            font-size: 9px;
            color: #7b1a1a;
            margin-top: 6px;
            font-style: italic;
            font-weight: bold;
            text-align: center;
            background: #fff0f0;
            border-radius: 4px;
        }
        
        /* ===== BOTONES FLOTANTES ===== */
        /* ===== BARRA ESTILO VISOR PDF ===== */
        .floating-buttons {
            position: fixed;
            bottom: 24px;
            left: 50%;
            transform: translateX(-50%);
            z-index: 1000;
            display: flex;
            align-items: center;
            gap: 0;
            background: #3a3a3a;
            border-radius: 32px;
            padding: 8px 14px;
            box-shadow: 0 4px 24px rgba(0,0,0,0.45);
        }
        .floating-buttons .btn-float {
            background: transparent;
            color: #e0e0e0;
            border: none;
            border-radius: 50%;
            width: 40px;
            height: 40px;
            cursor: pointer;
            font-size: 19px;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            text-decoration: none;
            transition: background 0.15s, color 0.15s;
            padding: 0;
        }
        .floating-buttons .btn-float:hover {
            background: rgba(255,255,255,0.13);
            color: #fff;
        }
        .floating-buttons .btn-sep {
            width: 1px;
            height: 26px;
            background: rgba(255,255,255,0.22);
            margin: 0 6px;
            display: inline-block;
        }
        .floating-buttons .btn-zoom-out::before { content: '\2212'; font-size:18px; font-weight:bold; }
        .floating-buttons .btn-zoom-in::before  { content: '\002B'; font-size:18px; font-weight:bold; }
        .floating-buttons .btn-print-icon svg,
        .floating-buttons .btn-download svg { width:20px; height:20px; fill:#e0e0e0; }
        .floating-buttons .btn-print-icon:hover svg,
        .floating-buttons .btn-download:hover svg { fill:#fff; }
        .floating-buttons .btn-whatsapp {
            background: #25D366;
            color: #e0e0e0;
        }
        .floating-buttons .btn-whatsapp svg { fill: #e0e0e0; }
        .floating-buttons .btn-whatsapp:hover { background: #1ebe5d; color:#fff; }

        /* Elementos fijos de impresión: nunca se muestran */
        .print-header-fixed, .print-footer-fixed { display: none !important; }

        /* ===== ESTILOS DE IMPRESIÓN ===== */
        @media print {
            @page {
                size: letter portrait;
                margin: 0;
            }
            * {
                -webkit-print-color-adjust: exact !important;
                print-color-adjust: exact !important;
            }
            html, body {
                margin: 0 !important;
                padding: 0 !important;
                background: #fff !important;
            }

            /* Ocultar botones y wrapper original */
            .floating-buttons { display: none !important; }
            .footer-firma, .footer-firma-name, .footer-sello { display: none !important; }
            .page-wrapper { display: none !important; }

            /* Mostrar el paginador visual igual que en pantalla */
            .pages-container {
                display: block !important;
                max-width: none !important;
                margin: 0 !important;
                padding: 0 !important;
            }

            /* Cada página visual ocupa exactamente una hoja impresa */
            .visual-page {
                display: block !important;
                width: 8.5in !important;
                height: 11in !important;
                margin: 0 !important;
                padding: 0.5in 0.6in !important;
                box-shadow: none !important;
                box-sizing: border-box !important;
                overflow: hidden !important;
                page-break-after: always;
                break-after: page;
            }
            /* Evitar salto extra en la última página */
            .visual-page:last-child {
                page-break-after: avoid;
                break-after: avoid;
            }

            /* El pie de cada visual-page ya está posicionado absolute dentro de page-inner */
            .visual-page .page-inner {
                display: block !important;
                height: 100% !important;
                position: relative !important;
            }
            .visual-page .page-footer {
                position: absolute !important;
                left: 0 !important;
                right: 0 !important;
                bottom: 0 !important;
            }

            /* Ocultar firma y sello en impresión, pero dejar el nombre */
            .footer-firma { display: none !important; }
            .footer-sello { display: none !important; }
            .footer-sello-label { display: none !important; }
            .footer-firma-name { display: block !important; }
            .footer-lab-name { display: block !important; }
        }
    </style>
</head>
<body>
    <div class="floating-buttons no-print" id="viewerToolbar">
        <!-- Zoom out -->
        <button class="btn-float btn-zoom-out" title="Reducir zoom" onclick="zoomPage(-0.1)"></button>
        <!-- Zoom in -->
        <button class="btn-float btn-zoom-in" title="Ampliar zoom" onclick="zoomPage(0.1)"></button>
        <span class="btn-sep"></span>
        <!-- Imprimir -->
        <button class="btn-float btn-print-icon" title="Imprimir" onclick="window.print()">
            <svg viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v5h4v3h12v-3h4v-5c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></svg>
        </button>
        <!-- Descargar PDF -->
        <button class="btn-float btn-download" title="Descargar PDF" id="btnDescargar" onclick="descargarPDF()">
            <svg viewBox="0 0 24 24"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg>
        </button>
        <!-- WhatsApp -->
        <?php
        $waHref = '';
        if (!empty($orden['token_publico'])) {
            $telPaciente = !empty($orden['telefono']) ? preg_replace('/[^0-9]/', '', $orden['telefono']) : '';
            if (strlen($telPaciente) === 8) $telPaciente = '503' . $telPaciente;
            $nombrePaciente = $orden['nombre'] . ' ' . $orden['apellidos'];
            $mensajeWA = 'Estimado(a) ' . $nombrePaciente . ', sus resultados de laboratorio están disponibles aquí: ' . $urlPublicaPdf;
            $waHref = !empty($telPaciente)
                ? 'https://wa.me/' . $telPaciente . '?text=' . urlencode($mensajeWA)
                : 'https://wa.me/?text=' . urlencode($mensajeWA);
        }
        ?>
        <?php if ($waHref): ?>
        <span class="btn-sep"></span>
        <a class="btn-float btn-whatsapp" href="<?= $waHref ?>" target="_blank" title="Enviar por WhatsApp">
            <svg viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
        </a>
        <?php endif; ?>
    </div>

    <div class="page-wrapper">
    <table class="main-table">
        <!-- ===== ENCABEZADO (se repite en cada página) ===== -->
        <thead>
            <tr>
                <td>
                    <div class="lab-header">
                        <div class="logo-container">
                            <?php if (!empty($config['logo'])): ?>
                                <img src="data:image/<?= $config['logo_extension'] ?>;base64,<?= base64_encode($config['logo']) ?>" alt="Logo">
                            <?php endif; ?>
                        </div>
                        <div class="lab-info">
                            <h1><?= htmlspecialchars($config['nombre_laboratorio'] ?? SITE_NAME) ?></h1>
                            <?php if (!empty($config['informacion_adicional'])): ?>
                                <div class="lab-subtitle"><?= htmlspecialchars($config['informacion_adicional']) ?></div>
                            <?php endif; ?>
                            <?php
                            $registros = [];
                            if (!empty($config['jvplc'])) $registros[] = 'J.V.P.L.C. ' . htmlspecialchars($config['jvplc']);
                            if (!empty($config['cssp'])) $registros[] = 'C.S.S.P. N° ' . htmlspecialchars($config['cssp']);
                            if (!empty($registros)): ?>
                                <div class="lab-registro"><?= implode('&nbsp;&nbsp;', $registros) ?></div>
                            <?php endif; ?>
                            <?php if (!empty($config['direccion'])): 
                                // Dividir dirección en 2 líneas si es larga (por coma o punto)
                                $dir = htmlspecialchars($config['direccion']);
                                $dirLineas = preg_split('/,\s*/', $dir, 2);
                                if (count($dirLineas) > 1): ?>
                                <div class="lab-direccion"><?= $dirLineas[0] ?>,</div>
                                <div class="lab-direccion"><?= $dirLineas[1] ?></div>
                                <?php else: ?>
                                <div class="lab-direccion"><?= $dir ?></div>
                                <?php endif; ?>
                            <?php endif; ?>
                            <div class="lab-contacto">
                                <?php if (!empty($config['telefono'])): ?>
                                    <span>📞 <?= htmlspecialchars($config['telefono']) ?></span>
                                <?php endif; ?>
                                <?php if (!empty($config['whatsapp'])): ?>
                                    <span><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="#25D366" style="vertical-align:-2px;margin-right:2px;"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg> <?= htmlspecialchars($config['whatsapp']) ?></span>
                                <?php endif; ?>
                                <?php if (!empty($config['email'])): ?>
                                    <span>✉️ <?= htmlspecialchars($config['email']) ?></span>
                                <?php endif; ?>
                            </div>
                        </div>
                        <div class="qr-container">
                            <?php if (!empty($qrBase64)): ?>
                                <img src="<?= $qrBase64 ?>" alt="QR">
                                <div class="qr-text">Escanear para<br>ver resultados</div>
                            <?php endif; ?>
                        </div>
                    </div>
                    
                    <div class="titulo-barra">
                        <span class="titulo">Informe de Resultados de Laboratorio</span>
                        <span class="orden-num">N°. Orden: <strong><?= htmlspecialchars($orden['codigo']) ?></strong></span>
                    </div>
                    <!-- (La firma y sello se mostrarán en el pie de página) -->
                    
                    <div class="patient-rows">
                        <div class="patient-row">
                            <div class="field-block" style="flex: 1;">
                                <div class="field-label">N° Referencia:</div>
                                <div class="field-value"><?= htmlspecialchars($orden['paciente_codigo'] ?? $orden['codigo']) ?></div>
                            </div>
                            <div class="field-block" style="flex: 2.5;">
                                <div class="field-label">Paciente:</div>
                                <div class="field-value"><?= htmlspecialchars($orden['nombre'] . ' ' . $orden['apellidos']) ?></div>
                            </div>
                            <div class="field-block" style="flex: 0.8;">
                                <div class="field-label">Edad:</div>
                                <div class="field-value"><?= $edad !== null ? $edad . ' años' : '-' ?></div>
                            </div>
                        </div>
                        <div class="patient-row">
                            <div class="field-block" style="flex: 1;">
                                <div class="field-label">Género:</div>
                                <div class="field-value"><?= $orden['sexo'] == 'M' ? 'Masculino' : 'Femenino' ?></div>
                            </div>
                            <div class="field-block" style="flex: 1.2;">
                                <div class="field-label"><?= htmlspecialchars($orden['documento_tipo'] ?? 'DUI') ?>/Pasaporte:</div>
                                <div class="field-value"><?= htmlspecialchars($orden['documento_numero'] ?? '') ?></div>
                            </div>
                            <div class="field-block" style="flex: 1;">
                                <div class="field-label">Teléfono:</div>
                                <div class="field-value"><?= htmlspecialchars($orden['telefono'] ?? '') ?></div>
                            </div>
                            <div class="field-block" style="flex: 1.2;">
                                <div class="field-label">Recepción:</div>
                                <div class="field-value"><?= date('d/m/Y h:i A', strtotime($orden['fecha_orden'])) ?></div>
                            </div>
                        </div>
                    </div>
                </td>
            </tr>
        </thead>

        <!-- ===== PIE DE PÁGINA (se repite en cada página) ===== -->
        <tfoot>
            <tr>
                <td>
                    <div class="page-footer">
                        <div class="footer-top">
                            <!-- Columna izquierda: firma + nombre del laboratorista -->
                            <div class="footer-col footer-col-left">
                                <?php if (!empty($orden['laboratorista_nombre'])): ?>
                                    <?php if (!empty($orden['firma'])): ?>
                                        <img class="footer-firma" src="data:image/<?= $orden['firma_extension'] ?? 'png' ?>;base64,<?= base64_encode($orden['firma']) ?>" alt="Firma">
                                    <?php endif; ?>
                                    <div class="footer-firma-name"><?= htmlspecialchars($orden['laboratorista_nombre']) ?></div>
                                <?php endif; ?>
                            </div>
                            <!-- Columna derecha: sello del laboratorio -->
                            <div class="footer-col footer-col-right">
                                <?php if (!empty($config['sello_jvc'])): ?>
                                    <img class="footer-sello" src="data:image/<?= $config['sello_extension'] ?? 'png' ?>;base64,<?= base64_encode($config['sello_jvc']) ?>" alt="Sello">
                                <?php endif; ?>
                            </div>
                        </div>
                        <div class="footer-legal">Los valores marcados con <span style="color:#c62828;font-weight:bold;">↑</span> (alto) o <span style="color:#1976d2;font-weight:bold;">↓</span> (bajo) están fuera del rango de referencia. Consulte con su médico.<br>Los resultados de este informe son confidenciales y de uso exclusivo del paciente y su médico tratante. Orden N° <?= htmlspecialchars($orden['codigo']) ?></div>
                    </div>
                </td>
            </tr>
        </tfoot>

        <!-- ===== CONTENIDO ===== -->
        <tbody>
                    <!-- Resultados por Categoría -->
                    <?php $indiceExamenRenderizado = 0; ?>
                    <?php foreach ($examenesPorCategoria as $categoria => $examenesCategoria): ?>
                    <?php $categoriaConRangos = $categoriasTienenRangos[$categoria] ?? false; ?>
            <tr>
                <td>
                    <div class="categoria-section">
                        <div class="categoria-header"><?= htmlspecialchars(strtoupper($categoria)) ?></div>
                        <table class="resultados-table resultados-header-categoria">
                            <colgroup>
                                <col style="width:40%">
                                <col style="width:20%">
                                <?php if ($categoriaConRangos): ?><col style="width:25%"><?php endif; ?>
                                <col style="width:<?= $categoriaConRangos ? '15%' : '40%' ?>">
                            </colgroup>
                            <thead>
                                <tr>
                                    <th>EXÁMENES</th>
                                    <th>RESULTADOS</th>
                                    <?php if ($categoriaConRangos): ?><th>VALORES NORMALES</th><?php endif; ?>
                                    <th>UNIDADES</th>
                                </tr>
                            </thead>
                        </table>
                        <?php foreach ($examenesCategoria as $det): ?>
                            <?php
                            $stmtRes = $db->prepare("
                                SELECT 
                                    p.id as parametro_id,
                                    p.nombre as parametro_nombre,
                                    p.unidad,
                                    p.tipo_entrada,
                                    p.es_titulo,
                                    r.id as resultado_id,
                                    r.valor,
                                    r.valor_numerico,
                                    r.fuera_rango,
                                    r.observacion
                                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, function($row) {
                                return !empty($row['es_titulo']) || ($row['valor'] !== null && $row['valor'] !== '');
                            }));
                            
                            if (empty($filasVisibles)) continue;
                            $indiceExamenRenderizado++;
                            $esUltimoExamenRenderizado = ($indiceExamenRenderizado === $totalExamenesRenderizables);
                            
                            $totalResultadosReales = count(array_filter($filasVisibles, function($row) {
                                return empty($row['es_titulo']);
                            }));
                            $totalParametrosExamen = count(array_filter($resultados, function($row) {
                                return empty($row['es_titulo']);
                            }));
                            $mostrarExamen = $totalResultadosReales > 1;
                            $forzarSaltoExamen = ($totalParametrosExamen > 15 && !$esUltimoExamenRenderizado);
                            // Exámenes que deben ocupar su propia hoja
                            $examenesHojaPropia = ['hemograma','espermograma','cultivo','general de orina','general de heces','leucograma','ego','examen general de orina'];
                            $nombreExamenLower = mb_strtolower(trim($det['examen_nombre']), 'UTF-8');
                            $esPaginaPropia = false;
                            foreach ($examenesHojaPropia as $ep) {
                                if (strpos($nombreExamenLower, $ep) !== false) { $esPaginaPropia = true; break; }
                            }
                            ?>

                            <div class="examen-block <?= $forzarSaltoExamen ? 'examen-separado' : '' ?> <?= ($esPaginaPropia && !$esUltimoExamenRenderizado) ? 'examen-pagina-propia' : '' ?>">
                            <table class="resultados-table">
                                <colgroup>
                                    <col style="width:40%">
                                    <col style="width:20%">
                                    <?php if ($categoriaConRangos): ?><col style="width:25%"><?php endif; ?>
                                    <col style="width:<?= $categoriaConRangos ? '15%' : '40%' ?>">
                                </colgroup>
                                <tbody>
                            
                            <?php if ($mostrarExamen): 
                                // Abreviatura tipo de muestra
                                $abrevMuestra = '';
                                $muestra = $det['muestra_requerida'] ?? '';
                                $muestraAbrevs = [
                                    'Suero' => 'S',
                                    'Plasma' => 'P',
                                    'Sangre Completa' => 'SC',
                                    'Orina' => 'O',
                                    'Heces' => 'H'
                                ];
                                $abrevMuestra = $muestraAbrevs[$muestra] ?? '';
                            ?>
                            <tr>
                                <td class="examen-nombre" colspan="<?= $categoriaConRangos ? '4' : '3' ?>">
                                    <?= htmlspecialchars($det['examen_nombre']) ?>
                                    <?php if (!empty($det['prueba_controlada'])): ?>
                                        <span class="muestra-badge" style="background:#b71c1c;font-size:7px;letter-spacing:0.3px;">&#9733; PRUEBA CONTROLADA</span>
                                    <?php endif; ?>
                                </td>
                            </tr>
                            <?php endif; ?>

                            <?php foreach ($filasVisibles as $res): ?>
                            <?php
                            $esTitulo = !empty($res['es_titulo']);
                            $tipoEntrada = $res['tipo_entrada'] ?? 'numerico';
                            $rangos = [];

                            if (!$esTitulo) {
                                $stmtRango = $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
                                ");
                                $stmtRango->execute([$res['parametro_id'], $orden['sexo'], $edad]);
                                $rangosRaw = $stmtRango->fetchAll();
                                // Deduplicar rangos con mismos valores para evitar mostrar duplicados
                                $rangos = [];
                                $rangosClave = [];
                                foreach ($rangosRaw as $rr) {
                                    $clave = $rr['sexo'] . '|' . $rr['edad_min'] . '|' . $rr['edad_max'] . '|' . $rr['valor_min'] . '|' . $rr['valor_max'] . '|' . trim((string)($rr['valor_texto'] ?? '')) . '|' . trim((string)($rr['descripcion'] ?? ''));
                                    if (!isset($rangosClave[$clave])) {
                                        $rangosClave[$clave] = true;
                                        $rangos[] = $rr;
                                    }
                                }
                            }

                            $claseResultado = '';
                            if (!$esTitulo && $tipoEntrada === 'numerico' && $res['fuera_rango']) {
                                if (!empty($rangos) && $res['valor_numerico'] !== null) {
                                    $rangoComparacion = $rangos[0];
                                    $claseResultado = ($rangoComparacion['valor_min'] !== null && $res['valor_numerico'] < $rangoComparacion['valor_min'])
                                        ? 'resultado-bajo' : 'resultado-alto';
                                } else {
                                    $claseResultado = 'resultado-alto';
                                }
                            }

                            $valoresRef = '';
                            if (!empty($rangos)) {
                                $partesRango = [];
                                foreach ($rangos as $rangoItem) {
                                    $textoBase = '';
                                    if ($tipoEntrada === 'numerico' && $rangoItem['valor_min'] !== null && $rangoItem['valor_max'] !== null) {
                                        $textoBase = number_format($rangoItem['valor_min'], 2) . ' - ' . number_format($rangoItem['valor_max'], 2);
                                    } elseif (!empty($rangoItem['valor_texto'])) {
                                        $textoBase = nl2br(htmlspecialchars($rangoItem['valor_texto']));
                                    }

                                    if ($textoBase === '') {
                                        continue;
                                    }

                                    $partesRango[] = $textoBase;
                                }

                                $valoresRef = implode('<br>', $partesRango);
                            }
                            $mostrarReferencia = (!$esTitulo && $valoresRef !== '');

                            $nombreMostrar = $mostrarExamen ? $res['parametro_nombre'] : $det['examen_nombre'];
                            $claseNombre = $mostrarExamen ? 'parametro-nombre' : 'examen-nombre';

                            $muestraSingle = '';
                            if (!$mostrarExamen) {
                                $muestra = $det['muestra_requerida'] ?? '';
                                $muestraAbrevs = [
                                    'Suero' => 'S', 'Plasma' => 'P', 'Sangre Completa' => 'SC',
                                    'Orina' => 'O', 'Heces' => 'H'
                                ];
                                $muestraSingle = $muestraAbrevs[$muestra] ?? '';
                            }
                            ?>
                            <?php if ($esTitulo): ?>
                            <tr class="separador-impresion">
                                <td colspan="<?= $categoriaConRangos ? '4' : '3' ?>"><?= htmlspecialchars($res['parametro_nombre']) ?></td>
                            </tr>
                            <?php else: ?>
                            <tr class="<?= $res['fuera_rango'] ? 'fuera-rango' : '' ?>">
                                <td class="<?= $claseNombre ?>">
                                    <?= htmlspecialchars($nombreMostrar) ?>
                                    <?php if (!$mostrarExamen && !empty($det['prueba_controlada'])): ?>
                                        <span class="muestra-badge" style="background:#b71c1c;font-size:7px;letter-spacing:0.3px;">&#9733; PRUEBA CONTROLADA</span>
                                    <?php endif; ?>
                                </td>
                                <td class="<?= $claseResultado ?>">
                                    <?= htmlspecialchars($res['valor']) ?>
                                    <?php if ($claseResultado === 'resultado-alto'): ?>
                                        <span style="font-weight:bold;color:#c62828;">&#8593;</span>
                                    <?php elseif ($claseResultado === 'resultado-bajo'): ?>
                                        <span style="font-weight:bold;color:#1976d2;">&#8595;</span>
                                    <?php endif; ?>
                                </td>
                                <?php if ($categoriaConRangos): ?><td><?= $mostrarReferencia ? $valoresRef : '' ?></td><?php endif; ?>
                                <td><?= !empty(trim((string)($res['unidad'] ?? ''))) ? htmlspecialchars($res['unidad']) : '' ?></td>
                            </tr>
                            <?php
                            // Descripción del rango: usar solo el primer rango coincidente
                            $descLineas = [];
                            if (!empty($rangos)) {
                                $sexoPaciente = $orden['sexo'] ?? '';
                                $rangosSexo  = array_values(array_filter($rangos, fn($r) => $r['sexo'] === $sexoPaciente));
                                $rangosAmbos = array_values(array_filter($rangos, fn($r) => $r['sexo'] === 'Ambos'));
                                $primerRango = !empty($rangosSexo) ? $rangosSexo[0] : (!empty($rangosAmbos) ? $rangosAmbos[0] : null);
                                if ($primerRango) {
                                    $desc = trim(str_replace("\r", "", (string)($primerRango['descripcion'] ?? '')));
                                    if ($desc !== '') {
                                        foreach (explode("\n", $desc) as $linea) {
                                            $linea = trim($linea);
                                            if ($linea !== '') $descLineas[] = htmlspecialchars($linea);
                                        }
                                    }
                                }
                            }
                            ?>
                            <?php if (!empty($descLineas)): ?>
                            <tr class="fila-descripcion">
                                <td colspan="<?= $categoriaConRangos ? '4' : '3' ?>" style="padding:2px 8px 5px 20px;font-size:8.5px;color:#555;font-style:italic;border-bottom:1px solid #eee;">
                                    <?php foreach ($descLineas as $linea): ?>
                                    <div><i style="margin-right:3px;">&#9656;</i><?= $linea ?></div>
                                    <?php endforeach; ?>
                                </td>
                            </tr>
                            <?php endif; ?>

                            <?php endif; ?>
                            <?php endforeach; ?>
                                </tbody>
                            </table>
                            </div>
                        <?php endforeach; ?>
                    </div>
                </td>
            </tr>
                    <?php endforeach; ?>
        </tbody>
    </table>
    </div><!-- /page-wrapper -->
    <div class="pages-container" aria-hidden="false"></div>
    <script>
        function imprimirComoPdf() {
            window.print();
        }

        <?php if ($descargarPdf): ?>
        // Modo descarga: ocultar barra de botones y disparar impresión automáticamente
        document.getElementById('viewerToolbar').style.display = 'none';
        window.addEventListener('load', function () {
            setTimeout(function () {
                window.print();
            }, 1200);
        });
        <?php endif; ?>
        // Paginador visual: divide las secciones en páginas carta visibles en navegador
        document.addEventListener('DOMContentLoaded', function () {
            var originalTable = document.querySelector('.page-wrapper .main-table');
            if (!originalTable) return;

            var headerTd = originalTable.querySelector('thead td');
            var footerTd = originalTable.querySelector('tfoot td');
            if (!headerTd || !footerTd) return;
            // Recoger nodos de contenido solo del tbody DIRECTO de la tabla principal (no tablas anidadas)
            var mainTbody = originalTable.querySelector(':scope > tbody');
            var contentNodes = [];
            if (mainTbody) {
                mainTbody.querySelectorAll(':scope > tr > td').forEach(function(td) {
                    Array.from(td.children).forEach(function(child) {
                        contentNodes.push(child);
                    });
                });
            }
            if (contentNodes.length === 0) return;

            var headerHtml = headerTd.innerHTML;
            var footerHtml = footerTd.innerHTML;

            var pagesContainer = document.querySelector('.pages-container');
            pagesContainer.innerHTML = '';

            // Crear primera página para medir espacio disponible para contenido
            var firstPage = createPage(headerHtml, footerHtml);
            firstPage.style.visibility = 'hidden';
            pagesContainer.appendChild(firstPage);

            // Medir espacio neto disponible para .page-content en una página vacía
            var pageInnerEl = firstPage.querySelector('.page-inner');
            var pageContentEl = firstPage.querySelector('.page-content');
            var pageFooterEl = firstPage.querySelector('.page-footer');
            var footerSpacerEl = firstPage.querySelector('.footer-spacer');

            // Hacer visible ANTES de medir para obtener dimensiones reales
            firstPage.style.visibility = '';

            var footerH = (pageFooterEl ? pageFooterEl.offsetHeight : 0) + (footerSpacerEl ? footerSpacerEl.offsetHeight : 0);
            var footerReserva = footerH + 8;
            if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
            var currentPage = firstPage;
            pageContentEl = currentPage.querySelector('.page-content');
            pageFooterEl = currentPage.querySelector('.page-footer');

            // Calcular y aplicar max-height al page-content para que overflow:hidden corte físicamente
            function aplicarMaxHeight() {
                var innerH = pageInnerEl ? pageInnerEl.clientHeight : 0;
                var contentTop = pageContentEl ? pageContentEl.offsetTop : 0;
                var maxH = innerH - contentTop - footerReserva;
                if (pageContentEl) pageContentEl.style.maxHeight = maxH + 'px';
                return maxH;
            }
            var alturaDisponible = aplicarMaxHeight();

            function excedePagina() {
                // scrollHeight > clientHeight significa que el contenido supera el max-height asignado
                return pageContentEl.scrollHeight > pageContentEl.clientHeight;
            }

            function actualizarAlturaDisponible() {
                alturaDisponible = aplicarMaxHeight();
            }

            var anteriorForzaPagina = false;
            contentNodes.forEach(function (node) {
                var examBlocks = node.querySelectorAll('.examen-block');

                if (examBlocks.length === 0) {
                    // Sin examen-blocks: insertar nodo completo
                    var clone = node.cloneNode(true);
                    pageContentEl.appendChild(clone);
                    if (excedePagina() && pageContentEl.children.length > 1) {
                        pageContentEl.removeChild(clone);
                        currentPage = createPage(headerHtml, footerHtml);
                        pagesContainer.appendChild(currentPage);
                        pageInnerEl = currentPage.querySelector('.page-inner');
                        if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                        pageContentEl = currentPage.querySelector('.page-content');
                        pageFooterEl = currentPage.querySelector('.page-footer');
                        actualizarAlturaDisponible();
                        pageContentEl.appendChild(clone);
                    }
                    return;
                }

                // Extraer HTML del encabezado de categoría (sin examen-blocks ni filas de descripción) como string
                var catTemp = node.cloneNode(true);
                catTemp.querySelectorAll('.examen-block').forEach(function(b) { b.parentNode.removeChild(b); });
                catTemp.querySelectorAll('.fila-descripcion').forEach(function(r) { r.parentNode && r.parentNode.removeChild(r); });
                var catHeaderHtml = catTemp.outerHTML;

                // Función helper: añadir encabezado de categoría en la página actual y devolver su .categoria-section
                function insertarEncabezadoCategoria() {
                    var wrapper = document.createElement('div');
                    wrapper.innerHTML = catHeaderHtml;
                    var catEl = wrapper.firstElementChild;
                    pageContentEl.appendChild(catEl);
                    // Si el solo encabezado ya excede Y no es la única cosa → nueva página
                    if (excedePagina() && pageContentEl.children.length > 1) {
                        pageContentEl.removeChild(catEl);
                        currentPage = createPage(headerHtml, footerHtml);
                        pagesContainer.appendChild(currentPage);
                        pageInnerEl = currentPage.querySelector('.page-inner');
                        if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                        pageContentEl = currentPage.querySelector('.page-content');
                        pageFooterEl = currentPage.querySelector('.page-footer');
                        actualizarAlturaDisponible();
                        wrapper = document.createElement('div');
                        wrapper.innerHTML = catHeaderHtml;
                        catEl = wrapper.firstElementChild;
                        pageContentEl.appendChild(catEl);
                    }
                    return catEl.querySelector('.categoria-section') || catEl;
                }

                // Si la categoría anterior terminó con examen de página propia → nueva página antes del encabezado
                if (anteriorForzaPagina) {
                    anteriorForzaPagina = false;
                    currentPage = createPage(headerHtml, footerHtml);
                    pagesContainer.appendChild(currentPage);
                    pageInnerEl = currentPage.querySelector('.page-inner');
                    if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                    pageContentEl = currentPage.querySelector('.page-content');
                    pageFooterEl = currentPage.querySelector('.page-footer');
                    actualizarAlturaDisponible();
                }

                var activeCatSection = insertarEncabezadoCategoria();
                var bloquesPuestos = 0; // cuántos examen-blocks ya se pusieron en esta sección

                examBlocks.forEach(function(block) {
                    var esPaginaPropia = block.classList.contains('examen-pagina-propia');
                    var blockClone = block.cloneNode(true);

                    // Nueva página si: el bloque anterior era página-propia,
                    // O este bloque ES página-propia y ya hay contenido en la página
                    var necesitaNuevaPagina = anteriorForzaPagina || (esPaginaPropia && bloquesPuestos > 0);
                    if (necesitaNuevaPagina) {
                        anteriorForzaPagina = false;
                        currentPage = createPage(headerHtml, footerHtml);
                        pagesContainer.appendChild(currentPage);
                        pageInnerEl = currentPage.querySelector('.page-inner');
                        if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                        pageContentEl = currentPage.querySelector('.page-content');
                        pageFooterEl = currentPage.querySelector('.page-footer');
                        actualizarAlturaDisponible();
                        activeCatSection = insertarEncabezadoCategoria();
                        bloquesPuestos = 0;
                    }
                    anteriorForzaPagina = esPaginaPropia;

                    activeCatSection.appendChild(blockClone);
                    bloquesPuestos++;

                    if (excedePagina()) {
                        if (bloquesPuestos > 1) {
                            // Mover bloque completo a nueva página
                            activeCatSection.removeChild(blockClone);
                            bloquesPuestos = 0;
                            currentPage = createPage(headerHtml, footerHtml);
                            pagesContainer.appendChild(currentPage);
                            pageInnerEl = currentPage.querySelector('.page-inner');
                            if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                            pageContentEl = currentPage.querySelector('.page-content');
                            pageFooterEl = currentPage.querySelector('.page-footer');
                            actualizarAlturaDisponible();
                            activeCatSection = insertarEncabezadoCategoria();
                            activeCatSection.appendChild(blockClone);
                            bloquesPuestos = 1;
                        }

                        // Si aún excede (bloque muy largo), dividir por filas
                        if (excedePagina()) {
                            activeCatSection.removeChild(blockClone);
                            bloquesPuestos--;

                            // Obtener todas las filas del bloque
                            var filas = Array.from(blockClone.querySelectorAll('table tbody tr, table thead tr'));
                            if (filas.length === 0) {
                                // Sin filas detectables: reinsertar completo
                                activeCatSection.appendChild(blockClone);
                                bloquesPuestos++;
                                return;
                            }

                            // Crear bloque parcial vacío (clonar estructura sin filas)
                            function crearBloqueVacio() {
                                var b = blockClone.cloneNode(true);
                                b.querySelectorAll('table tbody tr').forEach(function(r) { r.parentNode.removeChild(r); });
                                return b;
                            }

                            var bloqueActual = crearBloqueVacio();
                            activeCatSection.appendChild(bloqueActual);
                            bloquesPuestos++;
                            var tbodyActual = bloqueActual.querySelector('table tbody');

                            filas.forEach(function(fila) {
                                if (!fila.closest('tbody')) return; // skip thead rows
                                var filaClone = fila.cloneNode(true);
                                if (!tbodyActual) return;
                                tbodyActual.appendChild(filaClone);

                                if (excedePagina()) {
                                    tbodyActual.removeChild(filaClone);
                                    // Saltar a nueva página
                                    currentPage = createPage(headerHtml, footerHtml);
                                    pagesContainer.appendChild(currentPage);
                                    pageInnerEl = currentPage.querySelector('.page-inner');
                                    if (pageInnerEl) pageInnerEl.style.paddingBottom = footerReserva + 'px';
                                    pageContentEl = currentPage.querySelector('.page-content');
                                    pageFooterEl = currentPage.querySelector('.page-footer');
                                    actualizarAlturaDisponible();
                                    activeCatSection = insertarEncabezadoCategoria();

                                    bloqueActual = crearBloqueVacio();
                                    activeCatSection.appendChild(bloqueActual);
                                    bloquesPuestos = 1;
                                    tbodyActual = bloqueActual.querySelector('table tbody');
                                    if (tbodyActual) tbodyActual.appendChild(filaClone);
                                }
                            });
                        }
                    }
                });
            });

            // Ocultar la representación original para enfocarse en las páginas visuales
            document.querySelector('.page-wrapper').classList.add('page-wrapper-hidden');

            function createPage(hHtml, fHtml) {
                var p = document.createElement('div');
                p.className = 'page visual-page';
                p.innerHTML = '<div class="page-inner">' + hHtml + '<div class="page-content"></div>' + fHtml + '</div>';
                return p;
            }
        });

        // ===== Zoom del visor =====
        var currentScale = 1;
        function zoomPage(delta) {
            currentScale = Math.min(2, Math.max(0.4, currentScale + delta));
            document.querySelectorAll('.visual-page').forEach(function(p) {
                p.style.transform = 'scale(' + currentScale + ')';
                p.style.transformOrigin = 'top center';
                p.style.marginBottom = ((currentScale - 1) * p.offsetHeight) + 'px';
            });
        }

        // ===== Descarga PDF idéntica a la vista =====
        async function descargarPDF() {
            var btn = document.getElementById('btnDescargar');
            var svgOrig = btn.innerHTML;
            btn.innerHTML = '<svg viewBox="0 0 24 24" style="animation:spin 1s linear infinite"><path d="M12 4V2A10 10 0 0 0 2 12h2a8 8 0 0 1 8-8z"/></svg>';
            btn.disabled = true;

            // Temporalmente restablecer escala para captura limpia
            var savedScale = currentScale;
            if (savedScale !== 1) zoomPage(0); // reset a 1
            // esperar repaint
            await new Promise(r => setTimeout(r, 120));

            var pages = document.querySelectorAll('.visual-page');
            if (!pages.length) {
                btn.innerHTML = svgOrig; btn.disabled = false;
                window.print();
                return;
            }

            try {
                var { jsPDF } = window.jspdf;
                // Tamaño carta en puntos (8.5 x 11 in * 72)
                var pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'letter' });
                var pdfW = pdf.internal.pageSize.getWidth();
                var pdfH = pdf.internal.pageSize.getHeight();

                for (var i = 0; i < pages.length; i++) {
                    var page = pages[i];
                    var canvas = await html2canvas(page, {
                        scale: 2,
                        useCORS: true,
                        allowTaint: true,
                        backgroundColor: '#ffffff',
                        scrollX: 0,
                        scrollY: 0,
                        width: page.offsetWidth,
                        height: page.offsetHeight
                    });
                    var imgData = canvas.toDataURL('image/jpeg', 0.95);
                    if (i > 0) pdf.addPage('letter', 'p');
                    pdf.addImage(imgData, 'JPEG', 0, 0, pdfW, pdfH);
                }

                pdf.save('Resultados_<?= preg_replace('/[^A-Za-z0-9\-_]/', '_', $orden['codigo']) ?>.pdf');
            } catch(e) {
                console.error(e);
                window.print();
            }

            // Restaurar zoom anterior
            if (savedScale !== 1) zoomPage(savedScale - 1);
            btn.innerHTML = svgOrig;
            btn.disabled = false;
        }
    </script>
    <style>
        @keyframes spin { to { transform: rotate(360deg); } }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
</body>
</html>
