<?php
// ============================================================
// GENERADORES DE REPORTES MSP (Wrapper CRÍTICO V4.0)
// ============================================================
// Autor: Gemini Agent
// Fecha: 2026-01-14
// Descripción: Motor unificado para generar todos los formatos MSP con diseño oficial.

require_once __DIR__ . "/../config/Conexion.php";

// IMPORTANTE: Incluir el generador especializado de receta si existe
if (file_exists(__DIR__ . "/generar_pdf_receta.php")) {
    require_once __DIR__ . "/generar_pdf_receta.php";
}
if (file_exists(__DIR__ . "/generar_pdf_msp_033.php")) {
    require_once __DIR__ . "/generar_pdf_msp_033.php";
}
if (file_exists(__DIR__ . "/generar_pdf_msp_051.php")) {
    require_once __DIR__ . "/generar_pdf_msp_051.php";
}
if (file_exists(__DIR__ . "/generar_pdf_femo_hcu.php")) {
    require_once __DIR__ . "/generar_pdf_femo_hcu.php";
}

/**
 * Carga segura de TCPDF
 */
function cargarTCPDF()
{
    if (class_exists('TCPDF'))
        return true;

    $baseDir = dirname(__DIR__);
    $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
    $parentDir = dirname($baseDir);
    
    // Intentar encontrar la librería en orden de probabilidad
    $posibles = [
        $baseDir . '/public/tcpdf/tcpdf.php',
        $baseDir . '/tcpdf/tcpdf.php',
        $parentDir . '/tcpdf/tcpdf.php', // Un nivel arriba del sistema
        $docRoot . '/tcpdf/tcpdf.php',
        $docRoot . '/../tcpdf/tcpdf.php', // Fuera de public_html
        '/home/' . get_current_user() . '/public_html/tcpdf/tcpdf.php'
    ];

    foreach ($posibles as $ruta) {
        if (file_exists($ruta)) {
            require_once($ruta);
            return true;
        }
    }

    // Búsqueda más profunda en public/*/ (ej: public/plugins/tcpdf/tcpdf.php)
    $busqueda = glob($baseDir . '/public/*/tcpdf/tcpdf.php');
    if (!empty($busqueda)) {
        require_once($busqueda[0]);
        return true;
    }
    
    $busqueda2 = glob($baseDir . '/public/plugins/*/tcpdf.php');
    if (!empty($busqueda2)) {
        require_once($busqueda2[0]);
        return true;
    }

    throw new Exception("Librería TCPDF no encontrada. Por favor, asegúrese de que la carpeta 'tcpdf' esté subida en la raíz de su hosting o dentro de la carpeta 'public'.");
}

/**
 * WRAPPER PRINCIPAL: Redirige al generador específico según el tipo
 */
function generarPDFMspWrapper($idatencion, $tipo_formato, $id_atencion_formato, $datos_json)
{
    // Normalizar a mayúsculas
    $tipo_formato = strtoupper($tipo_formato);

    // 1. RECETA MÉDICA - NO GENERAR PDF HASTA QUE SE FIRME
    // El PDF solo se genera al firmar digitalmente (firmar_receta.php)
    // Esto evita el PDF temporal feo vertical que aparece en el historial
    if ($tipo_formato == 'RECETA') {
        // NO generar PDF aquí - solo al firmar
        return null;
    }

    // MAPEO DE FORMATOS A FUNCIONES
    switch ($tipo_formato) {
        case 'MSP_001':
            return generarPDFMsp001($idatencion, $datos_json);
        case 'MSP_002':
            return generarPDFMsp002($idatencion, $datos_json);
        case 'MSP_003':
            return generarPDFMsp003($idatencion, $datos_json);
        case 'MSP_008':
            return generarPDFMsp008($idatencion, $datos_json);
        case 'MSP_006':
            return generarPDFMsp006($idatencion, $datos_json);
        case 'MSP_012':
            return generarPDFMsp012($idatencion, $datos_json);
        case 'MSP_010':
            return generarPDFMsp010($idatencion, $datos_json);
        case 'MSP_024':
            return generarPDFMsp024($idatencion, $datos_json);
        case 'MSP_005':
            return generarPDFMsp005($idatencion, $datos_json);
        case 'MSP_007':
            return generarPDFMsp007($idatencion, $datos_json);
        case 'ANEXO_1':
            return generarPDFAnexo1($idatencion, $datos_json);
        case 'ANEXO_2':
            return generarPDFAnexo2($idatencion, $datos_json);
        case 'PEDIATRIA':
            return generarPDFPediatria($idatencion, $datos_json);
        case 'NEFROLOGIA':
            return generarPDFNefrologia($idatencion, $datos_json);
        case 'NEUROPEDIATRIA':
            return generarPDFNeuropediatria($idatencion, $datos_json);
        case 'NEUROPEDIATRIA_PEDIDOS':
            return generarPDFNeuropediatriaPedidos($idatencion, $datos_json);
        case 'NEUROPEDIATRIA_EXAMENES':
            return generarPDFNeuropediatriaExamenes($idatencion, $datos_json);
        case 'MSP_033_ODONTO':
            return generarPDFMsp033($idatencion, $datos_json);
        case 'ODONTOPEDIATRIA':
            require_once __DIR__ . '/generar_pdf_odontopediatria.php';
            return generarPDFOdontopediatria($idatencion, $datos_json);
        case 'PERIODONTOGRAMA':
            require_once __DIR__ . '/generar_pdf_periodontograma.php';
            return generarPDFPeriodontograma($idatencion, $datos_json);
        case 'CIRUGIA':
            require_once __DIR__ . '/generar_pdf_cirugia.php';
            return generarPDFCirugia($idatencion, $datos_json);
        case 'ARMONIZACION':
            require_once __DIR__ . '/generar_pdf_armonizacion.php';
            return generarPDFArmonizacion($idatencion, $datos_json);
        case 'MSP_051':
            require_once __DIR__ . '/generar_pdf_msp_051.php';
            return generarPDFMsp051($idatencion, $datos_json);
        case 'HC_MED_FAMILIAR':
            require_once "generar_pdf_hc_medicina_familiar.php";
            return generarPDFHcMedFamiliar($idatencion, $datos_json);
        case 'HC_MED_FUNCIONAL':
            require_once "generar_pdf_hc_med_funcional.php";
            return generarPDFHcMedFuncional($idatencion, $datos_json);
        case 'HISTORIA_ORTODONCIA':
            require_once __DIR__ . '/generar_pdf_ortodoncia.php';
            return generarPDFOrtodoncia($idatencion, $datos_json);
        case 'HISTORIA_ENDODONCIA':
            require_once __DIR__ . '/generar_pdf_endodoncia.php';
            return generarPDFEndodoncia($idatencion, $datos_json);
        case 'NUTRICION':
            return generarPDFNutricion($idatencion, $datos_json);
        case 'GERIATRIA':
            return generarPDFGeriatria($idatencion, $datos_json);
        case 'PSICOLOGIA':
            return generarPDFPsicologia($idatencion, $datos_json);
        case 'CONFIDENCIALIDAD':
            require_once __DIR__ . '/generar_pdf_confidencialidad.php';
            return generarPDFConfidencialidad($idatencion, $datos_json);
        case 'FISIOTERAPIA':
            return generarPDFFisioterapia($idatencion, $datos_json);
        case 'VALORACION_RAPIDA_FT':
            return generarPDFValoracionRapidaFT($idatencion, $datos_json);
        case 'FEMO_2025':
            require_once __DIR__ . '/generar_pdf_femo.php';
            return generarPDFFemo2025($idatencion, $datos_json);
        case 'FEMO_LEGAL':
            require_once __DIR__ . '/generar_pdf_femo_legal.php';
            return generarPDFFemoLegal($idatencion, $datos_json);
        case 'HCU_077':
            return generarPDFHcu077($idatencion, $datos_json);
        case 'HCU_078':
            return generarPDFHcu078($idatencion, $datos_json);
        case 'HCU_079':
            return generarPDFHcu079($idatencion, $datos_json);
        case 'HCU_080':
            return generarPDFHcu080($idatencion, $datos_json);
        case 'HCU_081':
            return generarPDFHcu081($idatencion, $datos_json);
        case 'HCU_083':
            return generarPDFHcu083($idatencion, $datos_json);
        default:
            return generarPDFGenerico($idatencion, $datos_json, $tipo_formato);
    }
}

// ============================================================
// HELPERS Y ESTILOS COMUNES
// ============================================================

function obtenerDatosPaciente($idatencion)
{
    // Asegurar conexión fresca
    if (!function_exists('ejecutarConsultaSimpleFila'))
        require_once __DIR__ . "/../config/Conexion.php";

    $sql = "SELECT a.fecha, p.apaterno, p.amaterno, p.nombre, p.tipo_documento, p.num_documento, 
            p.fecha_nacimiento, p.sexo, p.tipo_sangre, p.direccion, p.telefono,
            (SELECT concat(apaterno,' ',amaterno,' ',nombre) FROM persona WHERE idpersona=a.idempleado) as especialista,
            (SELECT especialidad FROM usuario WHERE idusuario=a.idempleado) as especialidad,
            (SELECT CASE WHEN razon_social = 'TURAZONSOCIAL' THEN '' ELSE razon_social END FROM configuracion LIMIT 1) as institucion
            FROM atencion a 
            INNER JOIN persona p ON a.idpersona = p.idpersona 
            WHERE a.idatencion = '$idatencion'";
    $reg = ejecutarConsultaSimpleFila($sql);

    if (!$reg)
        return ['apaterno' => '', 'nombre' => '', 'num_documento' => '', 'sexo' => '', 'fecha_nacimiento' => '', 'fecha' => date('Y-m-d')];

    // Calcular Edad
    $edadStr = "0 años";
    if (!empty($reg['fecha_nacimiento'])) {
        $dob = new DateTime($reg['fecha_nacimiento']);
        $now = new DateTime();
        $diff = $now->diff($dob);
        $edadStr = $diff->y . "a " . $diff->m . "m";
    }
    $reg['edad_completa'] = $edadStr;
    return $reg;
}

function getMspStyle()
{
    return '
    <style>
        table { width: 100%; border-collapse: collapse; font-family: helvetica; font-size: 8pt; }
        td, th { border: 1px solid #555; padding: 4px; vertical-align: middle; }
        .no-border { border: none; }
        .header-title { font-size: 14pt; font-weight: bold; color: #005662; }
        .section-title { background-color: #E0E0E0; font-weight: bold; font-size: 9pt; padding: 5px; color: #000; text-align: left; }
        .label { background-color: #F5F5F5; font-weight: bold; width: 25%; color: #333; }
        .value { width: 25%; }
        .value-wide { width: 75%; }
        .check-box { font-family: zapfdingbats; font-size: 10pt; }
        .text-center { text-align: center; }
        .text-right { text-align: right; }
        .text-bold { font-weight: bold; }
        .blue-text { color: #005662; }
        .red-text { color: #D32F2F; }
        .small { font-size: 7pt; }
    </style>';
}

function obtenerDiagnosticosFormat($idatencion)
{
    // Si no está declarada la función ejecutarConsulta, requerir Conexion
    if (!function_exists('ejecutarConsulta'))
        require_once __DIR__ . "/../config/Conexion.php";

    // Obtener idresultado asociado a la atencion (el más reciente para evitar conflictos)
    $sqlRes = "SELECT idresultado FROM resultado WHERE idatencion='$idatencion' ORDER BY idresultado DESC LIMIT 1";
    $res = ejecutarConsultaSimpleFila($sqlRes);
    $idresultado = $res ? $res['idresultado'] : 0;

    if (!$idresultado)
        return '<tr><td colspan="3">No hay diagnósticos registrados</td></tr>';

    $sql = "SELECT d.codigo, d.enfermedad, dd.tipo 
            FROM detalle_diagnostico dd 
            INNER JOIN diagnostico d ON dd.iddiagnostico = d.iddiagnostico
            WHERE dd.idresultado='$idresultado'";
    $rspta = ejecutarConsulta($sql);

    $html = '';
    while ($reg = $rspta->fetch_object()) {
        $tipo = ($reg->tipo == 'P' || $reg->tipo == 'PRESUNTIVO') ? 'Presuntivo' : 'Definitivo';
        $html .= '<tr>
            <td width="15%">' . $reg->codigo . '</td>
            <td width="65%">' . $reg->enfermedad . '</td>
            <td width="20%">' . $tipo . '</td>
        </tr>';
    }

    if (empty($html))
        return '<tr><td colspan="3">Sin diagnósticos</td></tr>';

    return $html;
}

function salvarPDF($pdf, $prefix, $idatencion)
{
    $baseDir = str_replace('\\', '/', dirname(__DIR__));
    $dirSeguro = $baseDir . '/files/pdf_msp/';

    // 1. Verificar si el directorio existe
    if (!file_exists($dirSeguro)) {
        if (!mkdir($dirSeguro, 0777, true)) {
            throw new Exception("No se pudo crear el directorio de destino: $dirSeguro. Verifique permisos del servidor.");
        }
    }

    // 2. Verificar si es escribible
    if (!is_writable($dirSeguro)) {
        throw new Exception("El directorio $dirSeguro no tiene permisos de escritura (chmod 775/777).");
    }

    $nombre = $prefix . '_' . $idatencion . '_' . time() . '.pdf';
    $rutaAbsoluta = $dirSeguro . $nombre;

    // Limpiar buffer
    if (ob_get_length())
        ob_clean();

    // 3. Intentar guardar
    try {
        $pdf->Output($rutaAbsoluta, 'F');
    } catch (Exception $e) {
        throw new Exception("Error interno de TCPDF al escribir el archivo: " . $e->getMessage());
    }

    // 4. Verificar creación física
    if (file_exists($rutaAbsoluta)) {
        error_log("✅ PDF GUARDADO EXITOSAMENTE: $rutaAbsoluta");
        return 'files/pdf_msp/' . $nombre;
    } else {
        throw new Exception("Falla crítica: El archivo se procesó pero no existe en $rutaAbsoluta. Posible restricción de cuota de disco o seguridad del hosting.");
    }
}

// ============================================================
// HELPERS COMUNES MSP (patrón maestro reutilizable)
// ============================================================

/** Devuelve valor del JSON escapado, o '—' si vacío. */
function _mspVal($d, $k, $alt = '—')
{
    $v = $d[$k] ?? '';
    $v = is_array($v) ? implode(', ', $v) : (string)$v;
    $v = trim($v);
    return $v === '' ? $alt : htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
}

/** Devuelve valor multilínea escapado con nl2br. */
function _mspValnl($d, $k, $alt = '—')
{
    $v = $d[$k] ?? '';
    $v = trim((string)$v);
    return $v === '' ? $alt : nl2br(htmlspecialchars($v, ENT_QUOTES, 'UTF-8'));
}

/** Obtiene datos del emisor desde sri_emisor → configuracion → usuario+persona. Cero hardcodeo. */
function _mspObtenerEmisor()
{
    $em = [
        'institucion' => '', 'unidad' => '',
        'razon_social' => '', 'ruc' => '', 'direccion' => '',
        'telefono' => '', 'email' => '',
        'profesional' => '', 'cargo' => '', 'especialidad' => '', 'senescyt' => '',
    ];
    $idusu = isset($_SESSION['idusuario']) ? intval($_SESSION['idusuario']) : 0;
    if ($idusu > 0) {
        $rse = ejecutarConsultaSimpleFila(
            "SELECT ruc, razon_social, nombre_comercial, direccion_establecimiento
             FROM sri_emisor WHERE idusuario='$idusu' LIMIT 1"
        );
        if ($rse) {
            $em['ruc']          = $rse['ruc'] ?? '';
            $em['razon_social'] = $rse['razon_social'] ?? '';
            $em['institucion']  = $rse['nombre_comercial'] ?: $rse['razon_social'] ?? '';
            $em['unidad']       = $rse['razon_social'] ?? '';
            $em['direccion']    = $rse['direccion_establecimiento'] ?? '';
        }
    }
    $cfg = ejecutarConsultaSimpleFila(
        "SELECT CASE WHEN razon_social='TURAZONSOCIAL' THEN '' ELSE razon_social END AS razon_social,
                ruc, email, telefono, direccion, responsable
         FROM configuracion LIMIT 1"
    );
    if ($cfg) {
        if (empty($em['institucion']))  $em['institucion']  = $cfg['razon_social'] ?? '';
        if (empty($em['unidad']))       $em['unidad']       = $cfg['responsable'] ?? '';
        if (empty($em['razon_social'])) $em['razon_social'] = $cfg['razon_social'] ?? '';
        if (empty($em['ruc']))          $em['ruc']          = $cfg['ruc'] ?? '';
        if (empty($em['direccion']))    $em['direccion']    = $cfg['direccion'] ?? '';
        if (empty($em['telefono']))     $em['telefono']     = $cfg['telefono'] ?? '';
        if (empty($em['email']))        $em['email']        = $cfg['email'] ?? '';
    }
    if ($idusu > 0) {
        $rprof = ejecutarConsultaSimpleFila(
            "SELECT CONCAT_WS(' ', pe.apaterno, pe.amaterno, pe.nombre) AS nombre,
                    u.cargo, u.especialidad, u.registro_senescyt
             FROM usuario u INNER JOIN persona pe ON pe.idpersona = u.idusuario
             WHERE u.idusuario='$idusu' LIMIT 1"
        );
        if ($rprof) {
            $em['profesional'] = trim($rprof['nombre'] ?? '');
            $em['cargo']       = $rprof['cargo'] ?? '';
            $em['especialidad']= $rprof['especialidad'] ?? '';
            $em['senescyt']    = $rprof['registro_senescyt'] ?? '';
        }
    }
    return $em;
}

/** Contenido textual del QR de firma electrónica simulada. */
function _mspQrContent($idatencion, $formatoLabel, $emisor, $timestamp)
{
    return "FIRMA ELECTRONICA SIMULADA\n"
         . "ATENCION: #{$idatencion}\n"
         . "FORMATO: {$formatoLabel}\n"
         . "PROFESIONAL: " . ($emisor['profesional'] ?: 'N/D') . "\n"
         . ($emisor['senescyt'] ? "MSP: {$emisor['senescyt']}\n" : '')
         . "FECHA: {$timestamp}\n"
         . "INSTITUCION: " . ($emisor['institucion'] ?: 'N/D');
}

/** Bloque <style> con paleta MSP oficial. */
function _mspEstiloOficial()
{
    return '
    <style>
        table { width:100%; border-collapse:collapse; font-family:helvetica; font-size:8pt; margin:0; padding:0; }
        td, th { border:1px solid #555; padding:3px; vertical-align:middle; }
        .no-border { border:none !important; }
        .section-band { background-color:#CCCCFF; color:#000; font-weight:bold; font-size:9.5pt; padding:5px; }
        .section-num { font-size:11pt; font-weight:bold; padding-right:6px; }
        .subhead { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:3px; text-align:center; }
        .subhead-left { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:4px 8px; text-align:left; }
        .item-num { background-color:#99CCFF; font-size:8pt; padding:3px; text-align:center; font-weight:bold; }
        .item-label { background-color:#99CCFF; font-size:7.5pt; padding:3px 4px; }
        .cp-sp { background-color:#FFFF99; text-align:center; font-size:8pt; font-weight:bold; padding:3px; }
        .red-text { color:#FF0000; font-weight:bold; }
        .small { font-size:7pt; color:#444; }
        .text-center { text-align:center; }
        .text-right { text-align:right; }
        .data-cell { font-size:8.5pt; padding:5px; }
    </style>';
}

/** Cabecera con razón social, RUC, dirección, teléfono, email — todo dinámico. */
function _mspCabeceraEmisor($emisor)
{
    $cabTitulo = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $linea2 = htmlspecialchars($emisor['direccion'])
            . ($emisor['telefono'] ? '  ·  Tel. ' . htmlspecialchars($emisor['telefono']) : '')
            . ($emisor['email']    ? '  ·  ' . htmlspecialchars($emisor['email']) : '');
    if (trim($linea2) === '') $linea2 = '&nbsp;';
    return '
    <table cellpadding="0" cellspacing="0">
        <tr><td class="no-border" style="font-size:10pt; font-weight:bold;">'
        . ($cabTitulo ? htmlspecialchars(strtoupper($cabTitulo)) : '&nbsp;')
        . ($emisor['ruc'] ? '  &nbsp;·&nbsp;  RUC ' . htmlspecialchars($emisor['ruc']) : '')
        . '</td></tr>
        <tr><td class="no-border small">' . $linea2 . '</td></tr>
    </table><br>';
}

/** Fila de identificación del paciente con paleta verde menta. */
function _mspIdentificacionPaciente($emisor, $p)
{
    $apellidos = trim(($p['apaterno'] ?? '') . ' ' . ($p['amaterno'] ?? ''));
    return '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="16%" class="subhead">INSTITUCIÓN DEL SISTEMA</td>
            <td width="16%" class="subhead">UNIDAD OPERATIVA</td>
            <td width="14%" class="subhead">NOMBRE</td>
            <td width="18%" class="subhead">APELLIDOS</td>
            <td width="8%"  class="subhead">SEXO (H-M)</td>
            <td width="8%"  class="subhead">EDAD</td>
            <td width="20%" class="subhead">Nº HISTORIA CLÍNICA</td>
        </tr>
        <tr class="text-center" style="font-size:8.5pt;">
            <td>' . htmlspecialchars($emisor['institucion'] ?: '—') . '</td>
            <td>' . htmlspecialchars($emisor['unidad'] ?: '—') . '</td>
            <td>' . htmlspecialchars($p['nombre'] ?? '—') . '</td>
            <td>' . htmlspecialchars($apellidos ?: '—') . '</td>
            <td>' . htmlspecialchars($p['sexo'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['edad_completa'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['num_documento'] ?? '—') . '</td>
        </tr>
    </table><br>';
}

/** Renderiza el pie del profesional con QR de firma electrónica + línea HCU-form. */
function _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, $codigoForm, $tituloForm)
{
    $profesional = trim($emisor['profesional']
        . ($emisor['especialidad'] ? '  ·  ' . $emisor['especialidad'] : '')
        . ($emisor['senescyt'] ? '  ·  MSP ' . $emisor['senescyt'] : ''));

    $pageW    = $pdf->getPageWidth();
    $margins  = $pdf->getMargins();
    $usefulW  = $pageW - $margins['left'] - $margins['right'];
    $y_pie    = $pdf->GetY();

    $pieHtml = $estilo . '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="14%" class="subhead">FECHA</td>
            <td width="12%" class="subhead">HORA</td>
            <td width="40%" class="subhead">NOMBRE DEL PROFESIONAL</td>
            <td width="22%" class="subhead">FIRMA ELECTRÓNICA</td>
            <td width="12%" class="subhead">Nº HOJA</td>
        </tr>
        <tr style="font-size:8.5pt; height:20mm;">
            <td class="text-center">' . date('Y-m-d') . '</td>
            <td class="text-center">' . date('H:i') . '</td>
            <td class="text-center">' . htmlspecialchars($profesional ?: '—') . '</td>
            <td>&nbsp;</td>
            <td class="text-center">001</td>
        </tr>
    </table>';
    $pdf->writeHTML($pieHtml, true, false, true, false, '');
    $y_pie_end = $pdf->GetY();

    $x_firma = $margins['left'] + $usefulW * 0.66;
    $w_firma = $usefulW * 0.22;
    $y_firma_row = $y_pie + 7;
    $h_firma_row = $y_pie_end - $y_firma_row - 1;

    $qr_size = min($h_firma_row - 1, $w_firma * 0.45, 16);
    $qr_x = $x_firma + 1;
    $qr_y = $y_firma_row + max(0, ($h_firma_row - $qr_size) / 2);

    $pdf->write2DBarcode(
        $qrContent, 'QRCODE,M',
        $qr_x, $qr_y, $qr_size, $qr_size,
        [
            'border'    => false,
            'padding'   => 0,
            'fgcolor'   => [0, 0, 0],
            'bgcolor'   => [255, 255, 255],
            'module_width'  => 1,
            'module_height' => 1,
        ],
        'N'
    );

    $tx_x = $qr_x + $qr_size + 1.5;
    $tx_y = $qr_y;
    $tx_w = $w_firma - $qr_size - 3;

    $pdf->SetTextColor(0, 86, 98);
    $pdf->SetFont('helvetica', 'B', 5);
    $pdf->SetXY($tx_x, $tx_y);
    $pdf->Cell($tx_w, 2.5, 'FIRMADO ELECTRÓNICAMENTE', 0, 1, 'L');

    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', 'B', 5.5);
    $pdf->SetXY($tx_x, $tx_y + 2.5);
    $pdf->MultiCell($tx_w, 2.5, $emisor['profesional'] ?: '—', 0, 'L', false, 0, '', '', true, 0, false, true, 5, 'T');

    $offset_y = $tx_y + 2.5 + 2.7;
    if (!empty($emisor['senescyt'])) {
        $pdf->SetFont('helvetica', '', 5);
        $pdf->SetXY($tx_x, $offset_y);
        $pdf->Cell($tx_w, 2.3, 'MSP ' . $emisor['senescyt'], 0, 1, 'L');
        $offset_y += 2.5;
    }
    $pdf->SetFont('helvetica', '', 4.8);
    $pdf->SetTextColor(60, 60, 60);
    $pdf->SetXY($tx_x, $offset_y);
    $pdf->Cell($tx_w, 2.3, $qrTimestamp, 0, 1, 'L');

    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->SetY($y_pie_end + 2);

    $lineaHcu = $estilo . '
    <table cellpadding="2" cellspacing="0"><tr>
        <td width="50%" class="no-border" style="font-size:8pt;"><b>SNS-MSP / HCU-form.' . $codigoForm . ' / 2008</b></td>
        <td width="50%" class="no-border text-right" style="font-size:9pt;"><b>' . htmlspecialchars($tituloForm) . '</b></td>
    </tr></table>';
    $pdf->writeHTML($lineaHcu, true, false, true, false, '');
}

/**
 * Pie con QR simple para PDFs no-HTML (que usan TCPDF nativo Cell/Line).
 * Dibuja una banda inferior con FECHA · HORA · PROFESIONAL · QR de firma.
 */
function _pdfPieFirmaQRSimple($pdf, $emisor, $idatencion, $formatoLabel)
{
    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, $formatoLabel, $emisor, $qrTimestamp);

    $pdf->Ln(4);
    $yPie = $pdf->GetY();
    if ($yPie > 250) { $pdf->AddPage(); $yPie = $pdf->GetY(); }

    $pdf->SetFillColor(204, 255, 204);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetXY(10, $yPie);
    $pdf->Cell(30, 6, 'FECHA', 1, 0, 'C', 1);
    $pdf->Cell(20, 6, 'HORA', 1, 0, 'C', 1);
    $pdf->Cell(90, 6, 'NOMBRE DEL PROFESIONAL', 1, 0, 'C', 1);
    $pdf->Cell(50, 6, 'FIRMA ELECTRÓNICA', 1, 1, 'C', 1);

    $yDatos = $pdf->GetY();
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(30, 20, date('Y-m-d'), 1, 0, 'C');
    $pdf->Cell(20, 20, date('H:i'), 1, 0, 'C');
    $profStr = trim(($emisor['profesional'] ?: '—')
        . ($emisor['especialidad'] ? '  ·  ' . $emisor['especialidad'] : '')
        . ($emisor['senescyt'] ? '  ·  MSP ' . $emisor['senescyt'] : ''));
    $pdf->Cell(90, 20, $profStr, 1, 0, 'C');
    $pdf->Cell(50, 20, '', 1, 1, 'C');

    $pdf->write2DBarcode(
        $qrContent, 'QRCODE,M',
        142, $yDatos + 1, 18, 18,
        ['border'=>false, 'padding'=>0, 'fgcolor'=>[0,0,0], 'bgcolor'=>[255,255,255]],
        'N'
    );

    $pdf->SetTextColor(0, 86, 98);
    $pdf->SetFont('helvetica', 'B', 5);
    $pdf->SetXY(162, $yDatos + 2);
    $pdf->Cell(28, 2.5, 'FIRMADO ELECTRÓNICAMENTE', 0, 1, 'L');
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', 'B', 5.5);
    $pdf->SetXY(162, $yDatos + 5);
    $pdf->MultiCell(28, 2.5, $emisor['profesional'] ?: '—', 0, 'L', false, 0, '', '', true, 0, false, true, 5, 'T');
    if (!empty($emisor['senescyt'])) {
        $pdf->SetFont('helvetica', '', 5);
        $pdf->SetXY(162, $yDatos + 10);
        $pdf->Cell(28, 2.3, 'MSP ' . $emisor['senescyt'], 0, 1, 'L');
    }
    $pdf->SetFont('helvetica', '', 4.8);
    $pdf->SetTextColor(60, 60, 60);
    $pdf->SetXY(162, $yDatos + 13);
    $pdf->Cell(28, 2.3, $qrTimestamp, 0, 1, 'L');
    $pdf->SetTextColor(0, 0, 0);
}

// ============================================================
// IMPLEMENTACIONES ESPECÍFICAS
// ============================================================

// --- MSP 008: EMERGENCIA ---
function generarPDFMsp008($idatencion, $json)
{
    if (!cargarTCPDF())
        return null;

    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('EMERGENCIA (008)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-008 Emergencia', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // Color del badge de triaje según prioridad
    $triajeColor = '#999';
    $triajeMap = ['ROJO'=>'#D32F2F','NARANJA'=>'#F57C00','AMARILLO'=>'#FBC02D','VERDE'=>'#388E3C','AZUL'=>'#1976D2'];
    $clasif = strtoupper($d['clasificacion_triaje'] ?? '');
    if (isset($triajeMap[$clasif])) $triajeColor = $triajeMap[$clasif];

    // 1. INGRESO Y TRIAJE
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">1</span>INGRESO Y TRIAJE</td></tr>
        <tr>
            <td width="22%" class="subhead-left">FECHA / HORA INGRESO</td>
            <td width="28%" class="data-cell">' . $val('fecha_ingreso') . ' &nbsp; ' . $val('hora_ingreso', '') . '</td>
            <td width="22%" class="subhead-left">MEDIO DE LLEGADA</td>
            <td width="28%" class="data-cell">' . $val('medio_llegada') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">ACOMPAÑANTE</td>
            <td class="data-cell">' . $val('acompañante') . '</td>
            <td class="subhead-left">PRIORIDAD TRIAJE</td>
            <td class="data-cell" style="background:' . $triajeColor . '; color:#fff; font-weight:bold; text-align:center;">' . htmlspecialchars($clasif ?: '—') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">SÍNTOMAS PRINCIPALES</td>
            <td colspan="3" class="data-cell">' . $val('sintomas_principales') . '</td>
        </tr>
    </table><br>';

    // 2. MOTIVO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">2</span>MOTIVO DE CONSULTA Y ENFERMEDAD ACTUAL</td></tr>
        <tr><td colspan="2" class="data-cell" style="height:70px;">' . $valnl('motivo_consulta_emergencia') . '</td></tr>
        <tr>
            <td width="30%" class="subhead-left">TIEMPO DE EVOLUCIÓN</td>
            <td width="70%" class="data-cell">' . $val('tiempo_evolucion') . '</td>
        </tr>
    </table><br>';

    // 3. SIGNOS VITALES + GLASGOW (lado a lado)
    $html .= '
    <table cellspacing="0">
        <tr>
            <td width="50%" class="section-band"><span class="section-num">3</span>SIGNOS VITALES EN EMERGENCIA</td>
            <td width="50%" class="section-band"><span class="section-num">4</span>ESCALA DE GLASGOW</td>
        </tr>
    </table>
    <table cellspacing="0">
        <tr>
            <td width="25%" class="subhead-left">P. ARTERIAL (mmHg)</td>
            <td width="25%" class="data-cell">' . $val('pa_emergencia') . '</td>
            <td width="25%" class="subhead-left">OCULAR (1-4)</td>
            <td width="25%" class="data-cell text-center">' . $val('glasgow_ocular') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">F. CARDÍACA (lpm)</td>
            <td class="data-cell">' . $val('fc_emergencia') . '</td>
            <td class="subhead-left">VERBAL (1-5)</td>
            <td class="data-cell text-center">' . $val('glasgow_verbal') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">F. RESPIRATORIA (rpm)</td>
            <td class="data-cell">' . $val('fr_emergencia') . '</td>
            <td class="subhead-left">MOTOR (1-6)</td>
            <td class="data-cell text-center">' . $val('glasgow_motor') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">TEMPERATURA (°C)</td>
            <td class="data-cell">' . $val('temp_emergencia') . '</td>
            <td class="subhead-left" style="font-size:9pt;">TOTAL GLASGOW</td>
            <td class="data-cell text-center" style="font-size:11pt; font-weight:bold;">' . $val('glasgow_total') . ' / 15</td>
        </tr>
        <tr>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td>
            <td class="data-cell">' . $val('sat_o2_emergencia') . '</td>
            <td class="subhead-left">&nbsp;</td>
            <td class="data-cell">&nbsp;</td>
        </tr>
    </table><br>';

    // 5. DIAGNÓSTICO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">5</span>DIAGNÓSTICO
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    // 6. ATENCIÓN Y PROCEDIMIENTOS
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">6</span>ATENCIÓN, PROCEDIMIENTOS Y TRATAMIENTO</td></tr>
        <tr><td class="subhead-left">PROCEDIMIENTOS REALIZADOS</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('procedimientos_emergencia') . '</td></tr>
        <tr><td class="subhead-left">TRATAMIENTO SUMINISTRADO</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('tratamiento_emergencia') . '</td></tr>
    </table><br>';

    // 7. DESTINO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">7</span>DESTINO</td></tr>
        <tr>
            <td width="25%" class="subhead-left">DESTINO FINAL</td>
            <td width="75%" class="data-cell" style="font-weight:bold;">' . $val('destino') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">OBSERVACIONES</td>
            <td class="data-cell">' . $val('observaciones_destino') . '</td>
        </tr>
    </table><br>';

    $pdf->writeHTML($html, true, false, true, false, '');

    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '008', 'EMERGENCIA');

    return salvarPDF($pdf, 'msp008', $idatencion);
}

// --- MSP 001: ADMISIÓN Y ALTA-EGRESO ---
function generarPDFMsp001($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('ADMISIÓN Y ALTA-EGRESO (001)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-001 Admisión y Alta-Egreso', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // ============================================================
    // PÁGINA 1 (ANVERSO): ADMISIÓN
    // ============================================================
    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. DATOS DE ADMISIÓN
    $tipoAdm = strtoupper($d['tipo_admision'] ?? '—');
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">1</span>ADMISIÓN</td></tr>
        <tr>
            <td width="25%" class="subhead-left">TIPO DE ADMISIÓN</td>
            <td width="25%" class="data-cell" style="font-weight:bold;">' . $tipoAdm . '</td>
            <td width="25%" class="subhead-left">ESTABLECIMIENTO DE ORIGEN</td>
            <td width="25%" class="data-cell">' . $val('establecimiento_origen') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">Nº HISTORIA CLÍNICA</td>
            <td class="data-cell">' . $val('numero_historia_clinica', $p['num_documento'] ?? '—') . '</td>
            <td class="subhead-left">FECHA / HORA ADMISIÓN</td>
            <td class="data-cell">' . date('Y-m-d H:i') . '</td>
        </tr>
    </table><br>';

    // 2. DATOS SOCIODEMOGRÁFICOS
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="6" class="section-band"><span class="section-num">2</span>DATOS SOCIODEMOGRÁFICOS</td></tr>
        <tr>
            <td width="17%" class="subhead-left">GRUPO ÉTNICO</td>
            <td width="16%" class="data-cell">' . $val('grupo_etnico') . '</td>
            <td width="17%" class="subhead-left">NACIONALIDAD / PUEBLO</td>
            <td width="16%" class="data-cell">' . $val('pueblo_nacionalidad') . '</td>
            <td width="17%" class="subhead-left">NIVEL DE INSTRUCCIÓN</td>
            <td width="17%" class="data-cell">' . $val('nivel_instruccion') . '</td>
        </tr>
        <tr>
            <td colspan="2" class="subhead-left">OCUPACIÓN ACTUAL</td>
            <td colspan="2" class="data-cell">' . $val('ocupacion_actual') . '</td>
            <td colspan="2" class="subhead-left">EMPRESA / LUGAR DE TRABAJO</td>
        </tr>
        <tr>
            <td colspan="6" class="data-cell">' . $val('empresa_trabajo') . '</td>
        </tr>
    </table><br>';

    // 3. MOTIVO DE CONSULTA
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>MOTIVO DE CONSULTA</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('motivo_consulta') . '</td></tr>
    </table><br>';

    // 4. DETALLES CLÍNICOS (Antecedentes / Enfermedad actual)
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">4</span>DETALLES CLÍNICOS</td></tr>
        <tr>
            <td width="50%" class="subhead-left">ANTECEDENTES PERSONALES Y FAMILIARES</td>
            <td width="50%" class="subhead-left">ENFERMEDAD ACTUAL</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:90px;">' . $valnl('antecedentes') . '</td>
            <td class="data-cell" style="height:90px;">' . $valnl('enfermedad_actual') . '</td>
        </tr>
    </table><br>';

    // 5. SIGNOS VITALES
    $fechaMed = !empty($d['fecha_medicion']) ? htmlspecialchars($d['fecha_medicion']) : date('Y-m-d H:i');
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">5</span>SIGNOS VITALES Y ANTROPOMETRÍA</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA / HORA</td><td width="25%" class="data-cell">' . $fechaMed . '</td>
            <td width="25%" class="subhead-left">TEMPERATURA (°C)</td><td width="25%" class="data-cell">' . $val('temperatura') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PRESIÓN ARTERIAL</td><td class="data-cell">' . $val('presion_arterial') . '</td>
            <td class="subhead-left">F. CARDÍACA (lpm)</td><td class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">F. RESPIRATORIA (rpm)</td><td class="data-cell">' . $val('frecuencia_respiratoria') . '</td>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td><td class="data-cell">' . $val('saturacion') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
            <td class="subhead-left">TALLA (cm) · IMC</td><td class="data-cell">' . $val('talla') . '   ·   ' . $val('imc') . '</td>
        </tr>
    </table><br>';

    // 6. DIAGNÓSTICO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">6</span>DIAGNÓSTICO
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '001', 'ADMISIÓN');

    // ============================================================
    // PÁGINA 2 (REVERSO): ALTA-EGRESO
    // ============================================================
    $pdf->AddPage();
    $condEgr = strtoupper($d['condicion_egreso'] ?? '—');
    $colorEgr = ($condEgr === 'FALLECIDO') ? '#D32F2F' : (($condEgr === 'REFERIDO') ? '#F57C00' : '#388E3C');

    $html2 = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 7. ALTA / EGRESO
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">7</span>ALTA / EGRESO</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA EGRESO</td>
            <td width="25%" class="data-cell">' . $val('fecha_egreso') . '</td>
            <td width="25%" class="subhead-left">HORA EGRESO</td>
            <td width="25%" class="data-cell">' . $val('hora_egreso') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">DÍAS DE ESTANCIA</td>
            <td class="data-cell">' . $val('dias_estancia') . '</td>
            <td class="subhead-left">CONDICIÓN DE EGRESO</td>
            <td class="data-cell" style="font-weight:bold; color:' . $colorEgr . ';">' . $condEgr . '</td>
        </tr>
        <tr>
            <td colspan="4" class="subhead-left">DESTINO / OBSERVACIONES DE EGRESO</td>
        </tr>
        <tr>
            <td colspan="4" class="data-cell" style="height:70px;">' . $valnl('destino_egreso') . '</td>
        </tr>
    </table><br>';

    // 8. PLAN DE TRATAMIENTO
    $html2 .= '
    <table cellspacing="0">
        <tr><td class="section-band">
            <span class="section-num">8</span><span class="red-text">PLAN</span> DE TRATAMIENTO
        </td></tr>
        <tr><td class="data-cell" style="height:120px;">' . $valnl('plan') . '</td></tr>
    </table>';

    $pdf->writeHTML($html2, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '001', 'ALTA – EGRESO');

    return salvarPDF($pdf, 'msp001', $idatencion);
}

// --- MSP 012: IMAGENOLOGÍA ---
function generarPDFMsp012($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('SOLICITUD DE IMAGENOLOGÍA (012)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-012 Imagenología', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $puedeMov = !empty($d['puede_movilizarse']) ? 'SÍ' : 'NO';

    // DATOS DE SOLICITUD
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">·</span>DATOS DE LA SOLICITUD</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA DE SOLICITUD</td>
            <td width="25%" class="data-cell">' . $val('fecha_solicitud') . '</td>
            <td width="25%" class="subhead-left">¿PACIENTE PUEDE MOVILIZARSE?</td>
            <td width="25%" class="data-cell text-center"><b>' . $puedeMov . '</b></td>
        </tr>
    </table><br>';

    // 1. TIPO DE ESTUDIO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">1</span>TIPO DE ESTUDIO SOLICITADO</td></tr>
        <tr>
            <td width="30%" class="subhead-left">ESTUDIOS SELECCIONADOS</td>
            <td width="70%" class="data-cell">' . $val('tipo_estudio') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">REGIÓN ANATÓMICA / ESPECIFICACIONES</td>
            <td class="data-cell">' . $val('region_anatomica') . '</td>
        </tr>
    </table><br>';

    // 2. MOTIVO Y DATOS CLÍNICOS
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>MOTIVO Y DATOS CLÍNICOS</td></tr>
        <tr><td class="subhead-left">MOTIVO DE SOLICITUD</td></tr>
        <tr><td class="data-cell" style="height:80px;">' . $valnl('motivo_solicitud') . '</td></tr>
        <tr><td class="subhead-left">DATOS CLÍNICOS RELEVANTES (antecedentes, hallazgos físicos)</td></tr>
        <tr><td class="data-cell" style="height:80px;">' . $valnl('datos_clinicos_relevantes') . '</td></tr>
    </table><br>';

    // DIAGNÓSTICO PRESUNTIVO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">3</span>DIAGNÓSTICO PRESUNTIVO (CIE-10)
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '012A', 'IMAGENOLOGÍA – SOLICITUD');

    return salvarPDF($pdf, 'msp012', $idatencion);
}

// --- MSP 010: LABORATORIO ---
function generarPDFMsp010($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('SOLICITUD DE LABORATORIO CLÍNICO (010)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-010 Laboratorio Clínico', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $prioridad = strtoupper($d['prioridad'] ?? 'RUTINA');
    $colorPri = ($prioridad === 'EMERGENCIA') ? '#D32F2F' : (($prioridad === 'URGENTE') ? '#F57C00' : '#1976D2');
    $muestras = !empty($d['muestras_tomadas']) ? 'SÍ - Tomadas en consultorio' : 'NO';

    // DATOS DE LA SOLICITUD
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">·</span>DATOS DE LA SOLICITUD</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA DE SOLICITUD</td>
            <td width="25%" class="data-cell">' . $val('fecha_solicitud') . '</td>
            <td width="25%" class="subhead-left">HORA DE SOLICITUD</td>
            <td width="25%" class="data-cell">' . $val('hora_solicitud') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PRIORIDAD</td>
            <td class="data-cell" style="font-weight:bold; color:' . $colorPri . ';">' . $prioridad . '</td>
            <td class="subhead-left">¿MUESTRAS TOMADAS?</td>
            <td class="data-cell">' . $muestras . '</td>
        </tr>
        <tr>
            <td class="subhead-left">DIAGNÓSTICO PRESUNTIVO</td>
            <td colspan="3" class="data-cell">' . $val('diagnostico_presuntivo') . '</td>
        </tr>
    </table><br>';

    // EXÁMENES SOLICITADOS
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">1</span>HEMATOLOGÍA Y COAGULACIÓN</td></tr>
        <tr><td class="data-cell" style="height:45px;">' . $valnl('hematologia', 'Ninguno solicitado') . '</td></tr>
    </table><br>
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>QUÍMICA SANGUÍNEA</td></tr>
        <tr><td class="data-cell" style="height:45px;">' . $valnl('quimica_sanguinea', 'Ninguno solicitado') . '</td></tr>
    </table><br>
    <table cellspacing="0">
        <tr>
            <td width="50%" class="section-band"><span class="section-num">3</span>UROANÁLISIS</td>
            <td width="50%" class="section-band"><span class="section-num">4</span>COPROLÓGICO</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:45px;">' . $valnl('uroanalisis', 'Ninguno solicitado') . '</td>
            <td class="data-cell" style="height:45px;">' . $valnl('coprologico', 'Ninguno solicitado') . '</td>
        </tr>
    </table><br>
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">5</span>OTROS EXÁMENES (Inmunología, Hormonas, Microbiología, etc.)</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('otros_examenes', 'Ninguno solicitado') . '</td></tr>
    </table><br>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '010A', 'LABORATORIO CLÍNICO – SOLICITUD');

    return salvarPDF($pdf, 'msp010', $idatencion);
}

// --- MSP 006: EPICRISIS ---
function generarPDFMsp006($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('EPICRISIS (006)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-006 Epicrisis', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // Datos de hospitalización
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">·</span>HOSPITALIZACIÓN</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA DE INGRESO</td>
            <td width="25%" class="data-cell">' . htmlspecialchars($p['fecha'] ?? '—') . '</td>
            <td width="25%" class="subhead-left">FECHA DE ALTA</td>
            <td width="25%" class="data-cell">' . $val('fecha_egreso') . '</td>
        </tr>
    </table><br>';

    // 1. RESUMEN DEL CUADRO CLÍNICO
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">1</span>RESUMEN DEL CUADRO CLÍNICO</td></tr>
        <tr><td class="subhead-left">MOTIVO DE INGRESO Y ENFERMEDAD ACTUAL</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('motivo_ingreso_resumen') . '</td></tr>
        <tr><td class="subhead-left">EVOLUCIÓN Y COMPLICACIONES DURANTE LA HOSPITALIZACIÓN</td></tr>
        <tr><td class="data-cell" style="height:75px;">' . $valnl('resumen_evolucion') . '</td></tr>
    </table><br>';

    // 2. HALLAZGOS / PROCEDIMIENTOS (lado a lado)
    $html .= '
    <table cellspacing="0">
        <tr>
            <td width="50%" class="section-band"><span class="section-num">2</span>HALLAZGOS DE EXÁMENES</td>
            <td width="50%" class="section-band"><span class="section-num">3</span>PROCEDIMIENTOS REALIZADOS</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:60px;">' . $valnl('examenes_realizados') . '</td>
            <td class="data-cell" style="height:60px;">' . $valnl('procedimientos_realizados') . '</td>
        </tr>
    </table><br>';

    // 4. DIAGNÓSTICOS DE EGRESO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">4</span>DIAGNÓSTICOS DE EGRESO (CIE-10)
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    // 5. CONDICIONES DE EGRESO
    $condicion = strtoupper($d['condicion_egreso'] ?? 'MEJORADO');
    $colorCond = ($condicion === 'FALLECIDO') ? '#D32F2F' : (($condicion === 'AGRAVADO') ? '#F57C00' : '#388E3C');
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">5</span>CONDICIONES DE EGRESO Y PRONÓSTICO</td></tr>
        <tr>
            <td width="25%" class="subhead-left">CONDICIÓN AL ALTA</td>
            <td width="25%" class="data-cell" style="font-weight:bold; color:' . $colorCond . ';">' . $condicion . '</td>
            <td width="25%" class="subhead-left">PRONÓSTICO</td>
            <td width="25%" class="data-cell">' . $val('pronostico') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">SIGNOS DE ALARMA</td>
            <td colspan="3" class="data-cell"><span class="red-text">' . $val('signos_alarma') . '</span></td>
        </tr>
    </table><br>';

    // 6. PLAN DE MANEJO AL ALTA
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">6</span><span class="red-text">PLAN</span> DE MANEJO AL ALTA</td></tr>
        <tr><td class="subhead-left">TRATAMIENTO FARMACOLÓGICO</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('tratamiento_egreso') . '</td></tr>
        <tr><td class="subhead-left">RECOMENDACIONES GENERALES</td></tr>
        <tr><td class="data-cell" style="height:50px;">' . $valnl('recomendaciones_generales') . '</td></tr>
        <tr><td class="subhead-left">PRÓXIMA CITA / CONTROL</td></tr>
        <tr><td class="data-cell" style="height:30px;">' . $valnl('citas_control') . '</td></tr>
    </table><br>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '006', 'EPICRISIS');

    return salvarPDF($pdf, 'msp006', $idatencion);
}

// --- MSP 024: CONSENTIMIENTO INFORMADO COMPLETO ---
function generarPDFMsp024($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('AUTORIZACIONES Y CONSENTIMIENTO INFORMADO (024)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-024 Autorización y Consentimiento', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // Datos derivados
    $nombrePaciente = trim(($p['apaterno'] ?? '') . ' ' . ($p['amaterno'] ?? '') . ' ' . ($p['nombre'] ?? ''));
    $tieneProced   = !empty(trim($d['tipo_procedimiento'] ?? ''));

    // ============================================================
    // PÁGINA 1 (ANVERSO): AUTORIZACIÓN, EXONERACIÓN Y RETIRO
    // ============================================================
    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. AUTORIZACIÓN PARA CIRUGÍA, TRATAMIENTO CLÍNICO O PROCEDIMIENTO DIAGNÓSTICO
    $proc = $tieneProced ? htmlspecialchars($d['tipo_procedimiento']) : '_______________________________________';
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">1</span>AUTORIZACIÓN PARA CIRUGÍA, TRATAMIENTO CLÍNICO O PROCEDIMIENTO DIAGNÓSTICO
        </td></tr>
        <tr><td colspan="4" class="data-cell" style="font-size:8pt; text-align:justify;">
            Yo, <b>' . htmlspecialchars($nombrePaciente ?: '_______________________________________') . '</b>,
            con documento de identidad <b>' . htmlspecialchars($p['num_documento'] ?? '___________') . '</b>,
            en pleno uso de mis facultades mentales, AUTORIZO al equipo médico de
            <b>' . htmlspecialchars($emisor['institucion'] ?: '_______________') . '</b>
            para que realice en mi persona / en mi representado/a el procedimiento:
            <b>' . $proc . '</b>.
            Declaro haber sido informado/a de manera clara y comprensible sobre dicho procedimiento, sus riesgos, beneficios y alternativas.
        </td></tr>
        <tr>
            <td width="40%" class="subhead-left">NOMBRE Y APELLIDO DEL PACIENTE</td>
            <td width="20%" class="subhead-left">DOC. IDENTIDAD</td>
            <td width="25%" class="subhead-left">NOMBRE Y APELLIDO REPRESENTANTE</td>
            <td width="15%" class="subhead-left">PARENTESCO</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell">' . htmlspecialchars($nombrePaciente ?: '—') . '</td>
            <td class="data-cell">' . htmlspecialchars($p['num_documento'] ?? '—') . '</td>
            <td class="data-cell">' . $val('representante_legal') . '</td>
            <td class="data-cell">' . $val('parentesco_representante') . '</td>
        </tr>
    </table><br>';

    // 2. EXONERACIÓN POR ABORTO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">2</span>EXONERACIÓN DE RESPONSABILIDAD POR ABORTO
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify; height:30px;">
            Declaro que asumo la responsabilidad total de mi decisión de no aceptar el tratamiento médico recomendado para la situación de aborto en curso, eximiendo al personal de salud de toda responsabilidad por las consecuencias derivadas.
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">NOMBRE Y FIRMA DEL PACIENTE / REPRESENTANTE</td>
            <td width="40%" class="subhead-left">DOC. IDENTIDAD</td>
        </tr>
        <tr style="font-size:8.5pt;"><td class="data-cell" style="height:18px;">&nbsp;</td><td class="data-cell">&nbsp;</td></tr>
    </table><br>';

    // 3. EXONERACIÓN POR INASISTENCIA AL TRATAMIENTO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">3</span>EXONERACIÓN DE RESPONSABILIDAD POR INASISTENCIA AL TRATAMIENTO MÉDICO
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify; height:30px;">
            Declaro que asumo la responsabilidad por la decisión de no asistir al tratamiento médico indicado o de abandonarlo voluntariamente, eximiendo al personal de salud de toda responsabilidad por las consecuencias derivadas.
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">NOMBRE Y FIRMA DEL PACIENTE / REPRESENTANTE</td>
            <td width="40%" class="subhead-left">DOC. IDENTIDAD</td>
        </tr>
        <tr style="font-size:8.5pt;"><td class="data-cell" style="height:18px;">&nbsp;</td><td class="data-cell">&nbsp;</td></tr>
    </table><br>';

    // 4. RETIRO DE MENOR DE EDAD O PERSONA INCAPACITADA
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">4</span>RETIRO DE MENOR DE EDAD O PERSONA INCAPACITADA
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify; height:30px;">
            Como representante legal, asumo la responsabilidad total del retiro del menor de edad / persona incapacitada en contra del criterio médico, eximiendo al personal de salud de toda responsabilidad por las consecuencias.
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">NOMBRE Y FIRMA DEL REPRESENTANTE LEGAL</td>
            <td width="40%" class="subhead-left">DOC. IDENTIDAD</td>
        </tr>
        <tr style="font-size:8.5pt;"><td class="data-cell" style="height:18px;">&nbsp;</td><td class="data-cell">&nbsp;</td></tr>
    </table><br>';

    // 5. AUTORIZACIÓN DE EXTRACCIÓN DE ÓRGANOS / TRASPLANTE
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">5</span>AUTORIZACIÓN DE EXTRACCIÓN DE ÓRGANOS PARA DONACIÓN Y/O TRASPLANTE
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify; height:30px;">
            Autorizo la extracción de los órganos especificados a continuación, con fines de donación y/o trasplante, de acuerdo con la Ley Orgánica de Donación y Trasplante de Órganos, Tejidos y Células del Ecuador.
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">ÓRGANOS / TEJIDOS A EXTRAER</td>
            <td width="40%" class="subhead-left">FIRMA Y DOC. IDENTIDAD</td>
        </tr>
        <tr style="font-size:8.5pt;"><td class="data-cell" style="height:18px;">&nbsp;</td><td class="data-cell">&nbsp;</td></tr>
    </table><br>';

    // 6. AUTORIZACIÓN PARA NECROPSIA
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">6</span>AUTORIZACIÓN PARA NECROPSIA
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify; height:30px;">
            Como representante legal del fallecido/a, autorizo la realización de la necropsia (autopsia) con fines diagnósticos, científicos y/o médico-legales, según corresponda.
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">NOMBRE Y FIRMA DEL REPRESENTANTE LEGAL</td>
            <td width="40%" class="subhead-left">DOC. IDENTIDAD Y PARENTESCO</td>
        </tr>
        <tr style="font-size:8.5pt;"><td class="data-cell" style="height:18px;">&nbsp;</td><td class="data-cell">&nbsp;</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '024', 'AUTORIZACIÓN, EXONERACIÓN Y RETIRO');

    // ============================================================
    // PÁGINA 2 (REVERSO): CONSENTIMIENTO INFORMADO
    // ============================================================
    $pdf->AddPage();
    $html2 = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. INFORMACIÓN DEL PROFESIONAL TRATANTE
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">1</span>INFORMACIÓN ENTREGADA POR EL PROFESIONAL TRATANTE SOBRE EL TRATAMIENTO
        </td></tr>
        <tr>
            <td width="50%" class="subhead-left">PROPÓSITO</td>
            <td width="50%" class="subhead-left">TERAPIA Y PROCEDIMIENTOS PROPUESTOS</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:45px;">' . $valnl('descripcion_procedimiento') . '</td>
            <td class="data-cell" style="height:45px;">' . $valnl('alternativas') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">RESULTADOS ESPERADOS</td>
            <td class="subhead-left">RIESGOS DE COMPLICACIONES CLÍNICAS</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:45px;">' . $valnl('beneficios') . '</td>
            <td class="data-cell" style="height:45px;">' . $valnl('riesgos') . '</td>
        </tr>
        <tr><td colspan="2" class="subhead-left" style="font-size:7pt;">NOMBRE Y FIRMA DEL PROFESIONAL TRATANTE</td></tr>
        <tr><td colspan="2" class="data-cell" style="height:14px;">' . htmlspecialchars($emisor['profesional'] ?: '—')
            . ($emisor['senescyt'] ? '  ·  MSP ' . htmlspecialchars($emisor['senescyt']) : '') . '</td></tr>
    </table><br>';

    // 2. INFORMACIÓN DEL CIRUJANO
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">2</span>INFORMACIÓN ENTREGADA POR EL CIRUJANO SOBRE LA INTERVENCIÓN QUIRÚRGICA
        </td></tr>
        <tr>
            <td width="50%" class="subhead-left">PROPÓSITO</td>
            <td width="50%" class="subhead-left">INTERVENCIONES QUIRÚRGICAS PROPUESTAS</td>
        </tr>
        <tr><td class="data-cell" style="height:35px;">&nbsp;</td><td class="data-cell" style="height:35px;">&nbsp;</td></tr>
        <tr>
            <td class="subhead-left">RESULTADOS ESPERADOS</td>
            <td class="subhead-left">RIESGOS DE COMPLICACIONES QUIRÚRGICAS</td>
        </tr>
        <tr><td class="data-cell" style="height:35px;">&nbsp;</td><td class="data-cell" style="height:35px;">&nbsp;</td></tr>
        <tr><td colspan="2" class="subhead-left" style="font-size:7pt;">NOMBRE Y FIRMA DEL CIRUJANO</td></tr>
        <tr><td colspan="2" class="data-cell" style="height:14px;">&nbsp;</td></tr>
    </table><br>';

    // 3. INFORMACIÓN DEL ANESTESIÓLOGO
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">3</span>INFORMACIÓN ENTREGADA POR EL ANESTESIÓLOGO SOBRE LA ANESTESIA
        </td></tr>
        <tr>
            <td width="50%" class="subhead-left">PROPÓSITO</td>
            <td width="50%" class="subhead-left">ANESTESIA PROPUESTA</td>
        </tr>
        <tr><td class="data-cell" style="height:30px;">&nbsp;</td><td class="data-cell" style="height:30px;">&nbsp;</td></tr>
        <tr>
            <td class="subhead-left">RESULTADOS ESPERADOS</td>
            <td class="subhead-left">RIESGOS DE COMPLICACIONES ANESTÉSICAS</td>
        </tr>
        <tr><td class="data-cell" style="height:30px;">&nbsp;</td><td class="data-cell" style="height:30px;">&nbsp;</td></tr>
        <tr><td colspan="2" class="subhead-left" style="font-size:7pt;">NOMBRE Y FIRMA DEL ANESTESIÓLOGO</td></tr>
        <tr><td colspan="2" class="data-cell" style="height:14px;">&nbsp;</td></tr>
    </table><br>';

    // 4. CONSENTIMIENTO INFORMADO DEL PACIENTE
    $aceptado = !empty($d['paciente_acepta']);
    $marcaSi = $aceptado ? '<span style="font-family:zapfdingbats;">4</span>' : '<span style="font-family:zapfdingbats;">o</span>';
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">4</span>CONSENTIMIENTO INFORMADO DEL PACIENTE
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="font-size:8pt; text-align:justify;">
            Yo, <b>' . htmlspecialchars($nombrePaciente ?: '_______________') . '</b>,
            con documento de identidad <b>' . htmlspecialchars($p['num_documento'] ?? '___________') . '</b>, declaro que:
            <br><br>
            1. He recibido información clara y comprensible sobre el procedimiento propuesto.<br>
            2. He sido informado/a sobre los riesgos, beneficios y alternativas del mismo.<br>
            3. He tenido la oportunidad de formular todas las preguntas pertinentes y han sido respondidas satisfactoriamente.<br>
            4. Entiendo que la medicina no es una ciencia exacta y que no se me ha garantizado el resultado del procedimiento.<br>
            5. Autorizo al personal de salud a realizar los procedimientos adicionales que se consideren necesarios durante el acto médico, si una situación imprevista lo amerita.<br>
            6. Entiendo que puedo revocar este consentimiento por escrito en cualquier momento previo a la realización del procedimiento.<br>
            7. Autorizo el uso de la información clínica con fines docentes o de investigación, manteniendo la confidencialidad de mi identidad.<br>
            8. <b>' . $marcaSi . ' DOY MI CONSENTIMIENTO LIBRE Y VOLUNTARIO PARA LA REALIZACIÓN DEL PROCEDIMIENTO.</b>
        </td></tr>
        <tr>
            <td width="60%" class="subhead-left">NOMBRE Y FIRMA DEL PACIENTE</td>
            <td width="40%" class="subhead-left">FECHA Y HORA</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell" style="height:18px;">' . htmlspecialchars($nombrePaciente ?: '—') . '</td>
            <td class="data-cell">' . $val('fecha_consentimiento', date('Y-m-d')) . '  ·  ' . $val('hora_consentimiento', date('H:i')) . '</td>
        </tr>
    </table><br>';

    // 5. CONSENTIMIENTO DEL REPRESENTANTE LEGAL
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="3" class="section-band">
            <span class="section-num">5</span>CONSENTIMIENTO INFORMADO DEL REPRESENTANTE LEGAL
        </td></tr>
        <tr><td colspan="3" class="data-cell" style="font-size:8pt; text-align:justify;">
            En caso de que el paciente sea menor de edad o esté incapacitado/a para otorgar el consentimiento, el representante legal abajo firmante declara haber recibido la información necesaria y autoriza el procedimiento en las mismas condiciones descritas en el numeral 4.
        </td></tr>
        <tr>
            <td width="45%" class="subhead-left">NOMBRE DEL REPRESENTANTE LEGAL</td>
            <td width="25%" class="subhead-left">DOC. IDENTIDAD</td>
            <td width="30%" class="subhead-left">PARENTESCO</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell" style="height:16px;">' . $val('representante_legal') . '</td>
            <td class="data-cell">' . $val('documento_representante') . '</td>
            <td class="data-cell">' . $val('parentesco_representante') . '</td>
        </tr>
        <tr>
            <td colspan="3" class="subhead-left" style="font-size:7pt;">FIRMA DEL REPRESENTANTE LEGAL</td>
        </tr>
        <tr><td colspan="3" class="data-cell" style="height:16px;">&nbsp;</td></tr>
    </table><br>';

    // TESTIGOS
    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">·</span>TESTIGOS</td></tr>
        <tr>
            <td width="50%" class="subhead-left">TESTIGO 1 (NOMBRE, CÉDULA, FIRMA)</td>
            <td width="50%" class="subhead-left">TESTIGO 2 (NOMBRE, CÉDULA, FIRMA)</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell" style="height:22px;">' . $val('firma_testigo1') . '</td>
            <td class="data-cell" style="height:22px;">' . $val('firma_testigo2') . '</td>
        </tr>
    </table>';

    $pdf->writeHTML($html2, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '024', 'CONSENTIMIENTO INFORMADO');

    return salvarPDF($pdf, 'msp024', $idatencion);
}

// --- MSP 005: EVOLUCIÓN ---
function generarPDFMsp005($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('EVOLUCIÓN Y PRESCRIPCIONES (005)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-005 Evolución y Prescripciones', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // Cargar notas de bitácora si existen
    $notas = [];
    if (function_exists('ejecutarConsulta')) {
        $sqlN = "SELECT fecha_evolucion, hora_evolucion, nota
                 FROM bitacora_evolucion WHERE idatencion = '$idatencion'
                 ORDER BY fecha_evolucion ASC, hora_evolucion ASC";
        $rs = @ejecutarConsulta($sqlN);
        if ($rs) while ($r = $rs->fetch_assoc()) $notas[] = $r;
    }

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // Datos de evolución
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">·</span>DATOS DE LA EVOLUCIÓN</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA EVOLUCIÓN</td>
            <td width="25%" class="data-cell">' . $val('fecha_evolucion', date('Y-m-d')) . '</td>
            <td width="25%" class="subhead-left">HORA</td>
            <td width="25%" class="data-cell">' . $val('hora_evolucion', date('H:i')) . '</td>
        </tr>
        <tr>
            <td class="subhead-left">TIPO DE NOTA</td>
            <td colspan="3" class="data-cell">' . $val('tipo_nota_evolucion') . '</td>
        </tr>
    </table><br>';

    // Signos vitales
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">1</span>SIGNOS VITALES Y ANTROPOMETRÍA</td></tr>
        <tr>
            <td width="25%" class="subhead-left">PRESIÓN ARTERIAL</td><td width="25%" class="data-cell">' . $val('presion_arterial') . '</td>
            <td width="25%" class="subhead-left">F. CARDÍACA</td><td width="25%" class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">F. RESPIRATORIA</td><td class="data-cell">' . $val('frecuencia_respiratoria') . '</td>
            <td class="subhead-left">TEMPERATURA (°C)</td><td class="data-cell">' . $val('temperatura') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td><td class="data-cell">' . $val('saturacion') . '</td>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
        </tr>
    </table><br>';

    // Evolución SOAP a 2 columnas (Evolución | Prescripciones)
    $html .= '
    <table cellspacing="0">
        <tr>
            <td width="55%" class="section-band"><span class="section-num">2</span>EVOLUCIÓN (S · O · A · P)</td>
            <td width="45%" class="section-band"><span class="section-num">3</span><span class="red-text">PLAN</span> Y PRESCRIPCIONES</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:200px;">
                <b style="color:#005662;">SUBJETIVO:</b><br>' . $valnl('evolucion_subjetiva') . '<br><br>
                <b style="color:#005662;">OBJETIVO:</b><br>' . $valnl('evolucion_objetiva') . '<br><br>
                <b style="color:#005662;">ANÁLISIS:</b><br>' . $valnl('evolucion_analisis') . '<br><br>
                <b style="color:#005662;">PLAN:</b><br>' . $valnl('evolucion_plan') . '
            </td>
            <td class="data-cell" style="height:200px;">' . $valnl('nota_evolucion') . '</td>
        </tr>
    </table><br>';

    // Notas anteriores de bitácora si existen
    if (count($notas) > 0) {
        $html .= '
        <table cellspacing="0">
            <tr><td class="section-band"><span class="section-num">4</span>NOTAS DE EVOLUCIÓN ANTERIORES</td></tr>';
        foreach ($notas as $n) {
            $html .= '<tr><td class="data-cell"><b>' . htmlspecialchars($n['fecha_evolucion'])
                  . ' ' . htmlspecialchars(substr($n['hora_evolucion'], 0, 5)) . ':</b> '
                  . nl2br(htmlspecialchars($n['nota'])) . '</td></tr>';
        }
        $html .= '</table><br>';
    }

    // Diagnósticos
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">5</span>DIAGNÓSTICOS (CIE-10)
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '005', 'EVOLUCIÓN Y PRESCRIPCIONES');

    return salvarPDF($pdf, 'msp005', $idatencion);
}

// --- MSP 007: INTERCONSULTA ---
function generarPDFMsp007($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('INTERCONSULTA (007)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'MSP-007 Interconsulta', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // ============================================================
    // PÁGINA 1 (ANVERSO): SOLICITUD
    // ============================================================
    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">A</span>SOLICITUD DE INTERCONSULTA
        </td></tr>
        <tr>
            <td width="25%" class="subhead-left">SERVICIO SOLICITANTE</td>
            <td width="25%" class="data-cell">' . $val('servicio_solicitante') . '</td>
            <td width="25%" class="subhead-left">FECHA SOLICITUD</td>
            <td width="25%" class="data-cell">' . $val('fecha_solicitud') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">HORA SOLICITUD</td>
            <td colspan="3" class="data-cell">' . $val('hora_solicitud') . '</td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">1</span>MOTIVO DE INTERCONSULTA</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('motivo_interconsulta') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>RESUMEN DEL CUADRO CLÍNICO</td></tr>
        <tr><td class="data-cell" style="height:100px;">' . $valnl('resumen_clinico') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>PREGUNTA ESPECÍFICA PARA EL ESPECIALISTA</td></tr>
        <tr><td class="data-cell" style="height:50px;">' . $valnl('pregunta_especifica') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">·</span>DIAGNÓSTICO DE PRESUNCIÓN (CIE-10)
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '007', 'INTERCONSULTA – SOLICITUD');

    // ============================================================
    // PÁGINA 2 (REVERSO): INFORME DEL ESPECIALISTA
    // ============================================================
    $pdf->AddPage();
    $estado = strtoupper($d['estado'] ?? 'PENDIENTE');
    $colorEst = ($estado === 'RESPONDIDA') ? '#388E3C' : (($estado === 'CANCELADA') ? '#D32F2F' : '#F57C00');
    $seguimiento = !empty($d['requiere_seguimiento']) ? 'SÍ' : 'NO';

    $html2 = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $html2 .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">B</span>INFORME DE INTERCONSULTA (RESPUESTA DEL ESPECIALISTA)
        </td></tr>
        <tr>
            <td width="25%" class="subhead-left">SERVICIO QUE RESPONDE</td>
            <td width="25%" class="data-cell">' . $val('servicio_respondiente') . '</td>
            <td width="25%" class="subhead-left">FECHA DE RESPUESTA</td>
            <td width="25%" class="data-cell">' . $val('fecha_respuesta') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">ESTADO</td>
            <td colspan="3" class="data-cell" style="font-weight:bold; color:' . $colorEst . ';">' . $estado . '</td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">4</span>HALLAZGOS / CUADRO CLÍNICO</td></tr>
        <tr><td class="data-cell" style="height:100px;">' . $valnl('hallazgos') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">5</span>CONCLUSIONES DIAGNÓSTICAS</td></tr>
        <tr><td class="data-cell" style="height:70px;">' . $valnl('diagnostico_especialista') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">6</span><span class="red-text">PLAN</span> TERAPÉUTICO Y RECOMENDACIONES
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="height:90px;">' . $valnl('recomendaciones') . '</td></tr>
        <tr>
            <td width="40%" class="subhead-left">REQUIERE SEGUIMIENTO ESPECIALIZADO</td>
            <td width="60%" class="data-cell" style="font-weight:bold; color:' . ($seguimiento === 'SÍ' ? '#D32F2F' : '#388E3C') . ';">' . $seguimiento . '</td>
        </tr>
    </table>';

    $pdf->writeHTML($html2, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, '007', 'INTERCONSULTA – INFORME');

    return salvarPDF($pdf, 'msp007', $idatencion);
}

// --- MSP 002: CONSULTA EXTERNA ---
function generarPDFMsp002($idatencion, $json)
{
    if (!cargarTCPDF())
        return null;

    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];

    // Helper: mostrar valor o guion si vacío, ya escapado
    $val = function ($k, $alt = '—') use ($d) {
        $v = $d[$k] ?? '';
        $v = is_array($v) ? implode(', ', $v) : (string)$v;
        $v = trim($v);
        return $v === '' ? $alt : htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
    };
    $valnl = function ($k, $alt = '—') use ($d) {
        $v = $d[$k] ?? '';
        $v = trim((string)$v);
        return $v === '' ? $alt : nl2br(htmlspecialchars($v, ENT_QUOTES, 'UTF-8'));
    };

    // ---------- Emisor dinámico (cero hardcodeo, multi-tenant) ----------
    $emisor = [
        'institucion'  => '', 'unidad' => '',
        'razon_social' => '', 'ruc' => '', 'direccion' => '',
        'telefono' => '', 'email' => '',
        'profesional' => '', 'cargo' => '', 'especialidad' => '', 'senescyt' => '',
    ];
    $idusu = isset($_SESSION['idusuario']) ? intval($_SESSION['idusuario']) : 0;
    if ($idusu > 0) {
        $rse = ejecutarConsultaSimpleFila(
            "SELECT ruc, razon_social, nombre_comercial, direccion_establecimiento
             FROM sri_emisor WHERE idusuario='$idusu' LIMIT 1"
        );
        if ($rse) {
            $emisor['ruc']          = $rse['ruc'] ?? '';
            $emisor['razon_social'] = $rse['razon_social'] ?? '';
            $emisor['institucion']  = $rse['nombre_comercial'] ?: $rse['razon_social'] ?? '';
            $emisor['unidad']       = $rse['razon_social'] ?? '';
            $emisor['direccion']    = $rse['direccion_establecimiento'] ?? '';
        }
    }
    // Fallback configuración (descartando placeholder)
    $cfg = ejecutarConsultaSimpleFila(
        "SELECT CASE WHEN razon_social='TURAZONSOCIAL' THEN '' ELSE razon_social END AS razon_social,
                ruc, email, telefono, direccion, responsable
         FROM configuracion LIMIT 1"
    );
    if ($cfg) {
        if (empty($emisor['institucion']))  $emisor['institucion']  = $cfg['razon_social'] ?? '';
        if (empty($emisor['unidad']))       $emisor['unidad']       = $cfg['responsable'] ?? '';
        if (empty($emisor['razon_social'])) $emisor['razon_social'] = $cfg['razon_social'] ?? '';
        if (empty($emisor['ruc']))          $emisor['ruc']          = $cfg['ruc'] ?? '';
        if (empty($emisor['direccion']))    $emisor['direccion']    = $cfg['direccion'] ?? '';
        if (empty($emisor['telefono']))     $emisor['telefono']     = $cfg['telefono'] ?? '';
        if (empty($emisor['email']))        $emisor['email']        = $cfg['email'] ?? '';
    }
    if ($idusu > 0) {
        $rprof = ejecutarConsultaSimpleFila(
            "SELECT CONCAT_WS(' ', pe.apaterno, pe.amaterno, pe.nombre) AS nombre,
                    u.cargo, u.especialidad, u.registro_senescyt
             FROM usuario u INNER JOIN persona pe ON pe.idpersona = u.idusuario
             WHERE u.idusuario='$idusu' LIMIT 1"
        );
        if ($rprof) {
            $emisor['profesional'] = trim($rprof['nombre'] ?? '');
            $emisor['cargo']       = $rprof['cargo'] ?? '';
            $emisor['especialidad']= $rprof['especialidad'] ?? '';
            $emisor['senescyt']    = $rprof['registro_senescyt'] ?? '';
        }
    }

    // ---------- PDF ----------
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: ($emisor['razon_social'] ?: 'Profesional médico'));
    $pdf->SetTitle('CONSULTA EXTERNA - ANAMNESIS Y EXAMEN FÍSICO (002)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    // ---------- Contenido del QR (firma electrónica simulada, común a todos los formatos HC) ----------
    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = "FIRMA ELECTRONICA SIMULADA\n"
               . "ATENCION: #{$idatencion}\n"
               . "FORMATO: MSP-002 Consulta Externa\n"
               . "PROFESIONAL: " . ($emisor['profesional'] ?: 'N/D') . "\n"
               . ($emisor['senescyt'] ? "MSP: {$emisor['senescyt']}\n" : '')
               . "FECHA: {$qrTimestamp}\n"
               . "INSTITUCION: " . ($emisor['institucion'] ?: 'N/D');

    // ---------- Estilos paleta MSP oficial ----------
    $estilo = '
    <style>
        table { width:100%; border-collapse:collapse; font-family:helvetica; font-size:8pt; margin:0; padding:0; }
        td, th { border:1px solid #555; padding:3px; vertical-align:middle; }
        .no-border { border:none !important; }
        .section-band { background-color:#CCCCFF; color:#000; font-weight:bold; font-size:9.5pt; padding:5px; }
        .section-num { font-size:11pt; font-weight:bold; padding-right:6px; }
        .subhead { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:3px; text-align:center; }
        .subhead-left { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:4px 8px; text-align:left; }
        .item-num { background-color:#99CCFF; font-size:8pt; padding:3px; text-align:center; font-weight:bold; }
        .item-label { background-color:#99CCFF; font-size:7.5pt; padding:3px 4px; }
        .cp-sp { background-color:#FFFF99; text-align:center; font-size:8pt; font-weight:bold; padding:3px; }
        .red-text { color:#FF0000; font-weight:bold; }
        .small { font-size:7pt; color:#444; }
        .text-center { text-align:center; }
        .text-right { text-align:right; }
        .data-cell { font-size:8.5pt; padding:5px; }
    </style>';

    // ---------- Cabecera del establecimiento (sin logo MSP, todo dinámico) ----------
    $cabTitulo = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $html = $estilo . '
    <table cellpadding="0" cellspacing="0">
        <tr>
            <td class="no-border" style="font-size:10pt; font-weight:bold;">'
              . ($cabTitulo ? htmlspecialchars(strtoupper($cabTitulo)) : '&nbsp;')
              . ($emisor['ruc'] ? '  &nbsp;·&nbsp;  RUC ' . htmlspecialchars($emisor['ruc']) : '') .
            '</td>
        </tr>
        <tr>
            <td class="no-border small">'
              . htmlspecialchars($emisor['direccion'])
              . ($emisor['telefono'] ? '  ·  Tel. ' . htmlspecialchars($emisor['telefono']) : '')
              . ($emisor['email']    ? '  ·  ' . htmlspecialchars($emisor['email']) : '')
              . (trim($emisor['direccion'].$emisor['telefono'].$emisor['email']) === '' ? '&nbsp;' : '') .
            '</td>
        </tr>
    </table><br>';

    // Fila identificación paciente (verde menta) — 7 columnas que suman 100, sin "MSP" hardcoded
    $apellidos = trim(($p['apaterno'] ?? '') . ' ' . ($p['amaterno'] ?? ''));
    $html .= '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="16%" class="subhead">INSTITUCIÓN DEL SISTEMA</td>
            <td width="16%" class="subhead">UNIDAD OPERATIVA</td>
            <td width="14%" class="subhead">NOMBRE</td>
            <td width="18%" class="subhead">APELLIDOS</td>
            <td width="8%"  class="subhead">SEXO (H-M)</td>
            <td width="8%"  class="subhead">EDAD</td>
            <td width="20%" class="subhead">Nº HISTORIA CLÍNICA</td>
        </tr>
        <tr class="text-center" style="font-size:8.5pt;">
            <td>' . htmlspecialchars($emisor['institucion'] ?: '—') . '</td>
            <td>' . htmlspecialchars($emisor['unidad'] ?: '—') . '</td>
            <td>' . htmlspecialchars($p['nombre'] ?? '—') . '</td>
            <td>' . htmlspecialchars($apellidos ?: '—') . '</td>
            <td>' . htmlspecialchars($p['sexo'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['edad_completa'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['num_documento'] ?? '—') . '</td>
        </tr>
    </table><br>';

    // 1. MOTIVO DE CONSULTA
    $html .= '
    <table cellspacing="0"><tr><td class="section-band"><span class="section-num">1</span>MOTIVO DE CONSULTA</td></tr>
           <tr><td class="data-cell" style="height:50px;">' . $valnl('motivo_consulta') . '</td></tr>
    </table><br>';

    // 2. ANTECEDENTES PERSONALES
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="3" class="section-band">
            <span class="section-num">2</span>ANTECEDENTES PERSONALES
            <span class="red-text small">  ·  DATOS CLÍNICO-QUIRÚRGICOS RELEVANTES Y GINECO-OBSTÉTRICOS</span>
        </td></tr>
        <tr><td colspan="3" class="data-cell" style="height:55px;">' . $valnl('antecedentes_personales', $valnl('antecedentes')) . '</td></tr>
        <tr>
            <td width="33%" class="subhead-left">ALERGIAS</td>
            <td width="34%" class="subhead-left">INTERVENCIONES QUIRÚRGICAS</td>
            <td width="33%" class="subhead-left">VACUNAS COMPLETAS</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell"><span class="red-text">' . $val('alergia', 'Ninguna') . '</span></td>
            <td class="data-cell">' . $val('intervenciones_quirurgicas') . '</td>
            <td class="data-cell text-center">' . $val('vacunas_completas') . '</td>
        </tr>
    </table><br>';

    // 3. ANTECEDENTES FAMILIARES — grid 12 cols: 4 ítems × (4+17+4)=25% = 100%
    $itemsFam = [
        ['ant_fam_cardiopatia','CARDIOPATIA'],
        ['ant_fam_diabetes','DIABETES'],
        ['ant_fam_enf_vascular','ENF. C. VASCULAR'],
        ['ant_fam_hipertension','HIPERTENSIÓN'],
        ['ant_fam_cancer','CÁNCER'],
        ['ant_fam_tuberculosis','TUBERCULOSIS'],
        ['ant_fam_enf_mental','ENF. MENTAL'],
        ['ant_fam_enf_infecciosa','ENF. INFECCIOSA'],
        ['ant_fam_malformacion','MALFORMACIÓN'],
        ['ant_fam_otro','OTRO'],
    ];
    $algunoMarcado = false;
    foreach ($itemsFam as $it) {
        if (!empty($d[$it[0]]) && $d[$it[0]] !== '0') { $algunoMarcado = true; break; }
    }
    $html .= '<table cellspacing="0">
        <tr><td colspan="12" class="section-band"><span class="section-num">3</span>ANTECEDENTES FAMILIARES
            <span class="small">  ·  Marcar X en cada antecedente presente</span></td></tr>';
    for ($f = 0; $f < 2; $f++) {
        $html .= '<tr>';
        for ($c = 0; $c < 4; $c++) {
            $i = $f * 4 + $c;
            $it = $itemsFam[$i];
            $marca = !empty($d[$it[0]]) && $d[$it[0]] !== '0' ? 'X' : '';
            $html .= '<td width="4%" class="item-num">' . ($i + 1) . '</td>'
                  .  '<td width="17%" class="item-label">' . $it[1] . '</td>'
                  .  '<td width="4%" class="cp-sp">' . $marca . '</td>';
        }
        $html .= '</tr>';
    }
    $m9  = !empty($d['ant_fam_malformacion']) && $d['ant_fam_malformacion'] !== '0' ? 'X' : '';
    $m10 = !empty($d['ant_fam_otro']) && $d['ant_fam_otro'] !== '0' ? 'X' : '';
    $html .= '<tr>
        <td width="4%" class="item-num">9</td>
        <td width="17%" class="item-label">MALFORMACIÓN</td>
        <td width="4%" class="cp-sp">' . $m9 . '</td>
        <td width="4%" class="item-num">10</td>
        <td width="17%" class="item-label">OTRO</td>
        <td width="4%" class="cp-sp">' . $m10 . '</td>
        <td colspan="6" class="data-cell text-center" style="font-weight:bold;">'
        . ($algunoMarcado ? '&nbsp;' : '<span class="red-text">SIN ANTECEDENTES FAMILIARES</span>')
        . '</td>
    </tr>';
    $html .= '<tr><td colspan="12" class="subhead-left">OBSERVACIONES</td></tr>
              <tr><td colspan="12" class="data-cell" style="height:35px;">'
              . $valnl('antecedentes_familiares_obs') . '</td></tr>
    </table><br>';

    // 4. ENFERMEDAD O PROBLEMA ACTUAL
    $html .= '<table cellspacing="0">
        <tr><td class="section-band">
            <span class="section-num">4</span>ENFERMEDAD O PROBLEMA ACTUAL
            <span class="small">  ·  CRONOLOGÍA, LOCALIZACIÓN, CARACTERÍSTICAS, INTENSIDAD, CAUSA APARENTE, FACTORES, SÍNTOMAS ASOCIADOS, MEDICAMENTOS, EVOLUCIÓN</span>
        </td></tr>
        <tr><td class="data-cell" style="height:90px;">' . $valnl('enfermedad_actual') . '</td></tr>
    </table><br>';

    // 5. REVISIÓN ÓRGANOS Y SISTEMAS
    // Grid: 5 ítems por fila × (3 num + 11 label + 3 CP + 3 SP) = 20% → 5×20 = 100. Total cols = 4 × 5 = 20
    // Cabecera con 5 grupos (ÓRGANO + CP + SP repetidos)
    $itemsRev = [
        ['rev_sentidos','ÓRGANOS SENTIDOS'],
        ['rev_respiratorio','RESPIRATORIO'],
        ['rev_cardio_vascular','CARDIO-VASC.'],
        ['rev_digestivo','DIGESTIVO'],
        ['rev_genital','GENITAL'],
        ['rev_urinario','URINARIO'],
        ['rev_musculo_esqueletico','MÚSCULO ESQ.'],
        ['rev_endocrino','ENDOCRINO'],
        ['rev_hemo_linfatico','HEMO LINF.'],
        ['rev_nervioso','NERVIOSO'],
    ];
    $html .= '<table cellspacing="0">
        <tr><td colspan="20" class="section-band">
            <span class="section-num">5</span>REVISIÓN ACTUAL DE ÓRGANOS Y SISTEMAS
            <span class="small">  ·  CP = Con Patología (marcar X y describir abajo)   ·   SP = Sin Patología (marcar X)</span>
        </td></tr>';
    // Cabecera repetida 5 veces (5 grupos de 4 cols = 20)
    $html .= '<tr>';
    for ($g = 0; $g < 5; $g++) {
        $html .= '<td colspan="2" class="subhead" style="font-size:7pt;">ÓRGANO / SISTEMA</td>'
              .  '<td class="subhead" style="font-size:7.5pt;">CP</td>'
              .  '<td class="subhead" style="font-size:7.5pt;">SP</td>';
    }
    $html .= '</tr>';
    // 2 filas de 5 ítems cada una
    for ($f = 0; $f < 2; $f++) {
        $html .= '<tr>';
        for ($c = 0; $c < 5; $c++) {
            $i = $f * 5 + $c;
            $it = $itemsRev[$i];
            $valor = strtoupper($d[$it[0]] ?? '');
            $cp = ($valor === 'CP') ? 'X' : '';
            $sp = ($valor === 'SP') ? 'X' : '';
            $html .= '<td width="3%" class="item-num">' . ($i + 1) . '</td>'
                  .  '<td width="11%" class="item-label">' . $it[1] . '</td>'
                  .  '<td width="3%" class="cp-sp">' . $cp . '</td>'
                  .  '<td width="3%" class="cp-sp">' . $sp . '</td>';
        }
        $html .= '</tr>';
    }
    $html .= '<tr><td colspan="20" class="subhead-left">OBSERVACIONES (describir hallazgos de los ítems marcados con CP)</td></tr>
              <tr><td colspan="20" class="data-cell" style="height:35px;">' . $valnl('rev_sistemas_obs') . '</td></tr>
    </table><br>';

    // 6. SIGNOS VITALES — tabla 4 cols
    $fechaMed = !empty($d['fecha_medicion']) ? htmlspecialchars($d['fecha_medicion']) : date('Y-m-d H:i');
    $html .= '<table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">6</span>SIGNOS VITALES Y ANTROPOMETRÍA</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA / HORA DE MEDICIÓN</td><td width="25%" class="data-cell">' . $fechaMed . '</td>
            <td width="25%" class="subhead-left">TEMPERATURA (°C)</td><td width="25%" class="data-cell">' . $val('temperatura') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PRESIÓN ARTERIAL (mmHg)</td><td class="data-cell">' . $val('presion_arterial') . '</td>
            <td class="subhead-left">FRECUENCIA CARDÍACA (lpm)</td><td class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">FRECUENCIA RESPIRATORIA (rpm)</td><td class="data-cell">' . $val('frecuencia_respiratoria') . '</td>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td><td class="data-cell">' . $val('saturacion') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
            <td class="subhead-left">TALLA (cm)</td><td class="data-cell">' . $val('talla') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">IMC (kg/m²)</td><td class="data-cell">' . $val('imc') . '</td>
            <td class="subhead-left">&nbsp;</td><td class="data-cell">&nbsp;</td>
        </tr>
    </table><br>';

    // 7. EXAMEN FÍSICO REGIONAL
    // Grid: 3 ítems por fila × (5 num + 21 label + 3.5 CP + 3.5 SP) = 33% → 3×33 = 99% (cerrado a 100)
    $itemsEF = [
        ['ef_cabeza','CABEZA'],
        ['ef_cuello','CUELLO'],
        ['ef_torax','TÓRAX'],
        ['ef_abdomen','ABDOMEN'],
        ['ef_pelvis','PELVIS'],
        ['ef_extremidades','EXTREMIDADES'],
    ];
    $html .= '<table cellspacing="0">
        <tr><td colspan="12" class="section-band">
            <span class="section-num">7</span>EXAMEN FÍSICO REGIONAL
            <span class="small">  ·  CP = Con Patología   ·   SP = Sin Patología</span>
        </td></tr>';
    // Cabecera repetida 3 veces (3 grupos de 4 cols = 12)
    $html .= '<tr>';
    for ($g = 0; $g < 3; $g++) {
        $html .= '<td colspan="2" class="subhead">REGIÓN ANATÓMICA</td>'
              .  '<td class="subhead">CP</td>'
              .  '<td class="subhead">SP</td>';
    }
    $html .= '</tr>';
    for ($f = 0; $f < 2; $f++) {
        $html .= '<tr>';
        for ($c = 0; $c < 3; $c++) {
            $i = $f * 3 + $c;
            $it = $itemsEF[$i];
            $valor = strtoupper($d[$it[0]] ?? '');
            $cp = ($valor === 'CP') ? 'X' : '';
            $sp = ($valor === 'SP') ? 'X' : '';
            $html .= '<td width="5%" class="item-num">' . ($i + 1) . '</td>'
                  .  '<td width="21%" class="item-label">' . $it[1] . '</td>'
                  .  '<td width="3%" class="cp-sp">' . $cp . '</td>'
                  .  '<td width="4%" class="cp-sp">' . $sp . '</td>';
        }
        $html .= '</tr>';
    }
    $html .= '<tr><td colspan="12" class="subhead-left">OBSERVACIONES (describir hallazgos de los ítems marcados con CP)</td></tr>
              <tr><td colspan="12" class="data-cell" style="height:50px;">' . $valnl('examen_fisico') . '</td></tr>
    </table><br>';

    // 8. DIAGNÓSTICO
    $html .= '<table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">8</span>DIAGNÓSTICO
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    // 9. PLAN DE TRATAMIENTO — PLAN en rojo
    $html .= '<table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">9</span><span class="red-text">PLAN</span> DE TRATAMIENTO
            <span class="small">  ·  DIAGNÓSTICO, TERAPÉUTICO Y EDUCACIONAL</span>
        </td></tr>
        <tr><td colspan="2" class="data-cell" style="height:90px;">' . $valnl('tratamiento') . '</td></tr>
        <tr>
            <td width="30%" class="subhead-left">PRÓXIMA CITA</td>
            <td width="70%" class="data-cell">' . $val('proxima_cita') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">SIGNOS DE ALARMA</td>
            <td class="data-cell"><span class="red-text">' . $val('signnose_de_alarma') . '</span></td>
        </tr>
    </table><br>';

    // Renderizar HTML del cuerpo (todo hasta la sección 9 inclusive)
    $pdf->writeHTML($html, true, false, true, false, '');

    // ---------- Pie del profesional con QR de firma (coordenadas absolutas) ----------
    $profesional = trim($emisor['profesional']
        . ($emisor['especialidad'] ? '  ·  ' . $emisor['especialidad'] : '')
        . ($emisor['senescyt'] ? '  ·  MSP ' . $emisor['senescyt'] : ''));

    $pageW    = $pdf->getPageWidth();
    $margins  = $pdf->getMargins();
    $usefulW  = $pageW - $margins['left'] - $margins['right'];
    $y_pie    = $pdf->GetY();

    // Tabla del pie con altura fija para acomodar el QR
    $pieHtml = $estilo . '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="14%" class="subhead">FECHA</td>
            <td width="12%" class="subhead">HORA</td>
            <td width="40%" class="subhead">NOMBRE DEL PROFESIONAL</td>
            <td width="22%" class="subhead">FIRMA ELECTRÓNICA</td>
            <td width="12%" class="subhead">Nº HOJA</td>
        </tr>
        <tr style="font-size:8.5pt; height:20mm;">
            <td class="text-center">' . date('Y-m-d') . '</td>
            <td class="text-center">' . date('H:i') . '</td>
            <td class="text-center">' . htmlspecialchars($profesional ?: '—') . '</td>
            <td>&nbsp;</td>
            <td class="text-center">001</td>
        </tr>
    </table>';
    $pdf->writeHTML($pieHtml, true, false, true, false, '');
    $y_pie_end = $pdf->GetY();

    // Calcular posición de la celda FIRMA (4ª columna)
    // FIRMA empieza en 14+12+40 = 66% del ancho útil; ancho = 22%
    $x_firma = $margins['left'] + $usefulW * 0.66;
    $w_firma = $usefulW * 0.22;
    // La fila de datos empieza ~7mm después del inicio del pie (alto del header verde)
    $y_firma_row = $y_pie + 7;
    $h_firma_row = $y_pie_end - $y_firma_row - 1;

    // QR cuadrado, lo más grande que entre en la celda
    $qr_size = min($h_firma_row - 1, $w_firma * 0.45, 16);
    $qr_x = $x_firma + 1;
    $qr_y = $y_firma_row + max(0, ($h_firma_row - $qr_size) / 2);

    $pdf->write2DBarcode(
        $qrContent,
        'QRCODE,M',
        $qr_x, $qr_y, $qr_size, $qr_size,
        [
            'border'    => false,
            'padding'   => 0,
            'fgcolor'   => [0, 0, 0],
            'bgcolor'   => [255, 255, 255],
            'module_width'  => 1,
            'module_height' => 1,
        ],
        'N'
    );

    // Texto al lado del QR (FIRMADO ELECTRÓNICAMENTE · Nombre · MSP · Fecha)
    $tx_x = $qr_x + $qr_size + 1.5;
    $tx_y = $qr_y;
    $tx_w = $w_firma - $qr_size - 3;

    $pdf->SetTextColor(0, 86, 98);
    $pdf->SetFont('helvetica', 'B', 5);
    $pdf->SetXY($tx_x, $tx_y);
    $pdf->Cell($tx_w, 2.5, 'FIRMADO ELECTRÓNICAMENTE', 0, 1, 'L');

    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', 'B', 5.5);
    $pdf->SetXY($tx_x, $tx_y + 2.5);
    $pdf->MultiCell($tx_w, 2.5, $emisor['profesional'] ?: '—', 0, 'L', false, 0, '', '', true, 0, false, true, 5, 'T');

    $offset_y = $tx_y + 2.5 + 2.7;
    if (!empty($emisor['senescyt'])) {
        $pdf->SetFont('helvetica', '', 5);
        $pdf->SetXY($tx_x, $offset_y);
        $pdf->Cell($tx_w, 2.3, 'MSP ' . $emisor['senescyt'], 0, 1, 'L');
        $offset_y += 2.5;
    }
    $pdf->SetFont('helvetica', '', 4.8);
    $pdf->SetTextColor(60, 60, 60);
    $pdf->SetXY($tx_x, $offset_y);
    $pdf->Cell($tx_w, 2.3, $qrTimestamp, 0, 1, 'L');

    // Restaurar estilo de texto por defecto
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', '', 8);

    // Reposicionar cursor debajo del pie del profesional
    $pdf->SetY($y_pie_end + 2);

    // Línea final HCU-form
    $lineaHcu = $estilo . '
    <table cellpadding="2" cellspacing="0"><tr>
        <td width="50%" class="no-border" style="font-size:8pt;"><b>SNS-MSP / HCU-form.002 / 2008</b></td>
        <td width="50%" class="no-border text-right" style="font-size:9pt;"><b>CONSULTA EXTERNA – ANAMNESIS Y EXAMEN FÍSICO</b></td>
    </tr></table>';
    $pdf->writeHTML($lineaHcu, true, false, true, false, '');

    return salvarPDF($pdf, 'msp002', $idatencion);
}

function generarPDFMsp003($idatencion, $json)
{
    if (!cargarTCPDF())
        return null;

    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];

    $val = function ($k, $alt = '—') use ($d) {
        $v = $d[$k] ?? '';
        $v = is_array($v) ? implode(', ', $v) : (string)$v;
        $v = trim($v);
        return $v === '' ? $alt : htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
    };
    $valnl = function ($k, $alt = '—') use ($d) {
        $v = $d[$k] ?? '';
        $v = trim((string)$v);
        return $v === '' ? $alt : nl2br(htmlspecialchars($v, ENT_QUOTES, 'UTF-8'));
    };

    // ---------- Emisor dinámico (cero hardcodeo, multi-tenant) ----------
    $emisor = [
        'institucion'  => '', 'unidad' => '',
        'razon_social' => '', 'ruc' => '', 'direccion' => '',
        'telefono' => '', 'email' => '',
        'profesional' => '', 'cargo' => '', 'especialidad' => '', 'senescyt' => '',
    ];
    $idusu = isset($_SESSION['idusuario']) ? intval($_SESSION['idusuario']) : 0;
    if ($idusu > 0) {
        $rse = ejecutarConsultaSimpleFila(
            "SELECT ruc, razon_social, nombre_comercial, direccion_establecimiento
             FROM sri_emisor WHERE idusuario='$idusu' LIMIT 1"
        );
        if ($rse) {
            $emisor['ruc']          = $rse['ruc'] ?? '';
            $emisor['razon_social'] = $rse['razon_social'] ?? '';
            $emisor['institucion']  = $rse['nombre_comercial'] ?: $rse['razon_social'] ?? '';
            $emisor['unidad']       = $rse['razon_social'] ?? '';
            $emisor['direccion']    = $rse['direccion_establecimiento'] ?? '';
        }
    }
    $cfg = ejecutarConsultaSimpleFila(
        "SELECT CASE WHEN razon_social='TURAZONSOCIAL' THEN '' ELSE razon_social END AS razon_social,
                ruc, email, telefono, direccion, responsable
         FROM configuracion LIMIT 1"
    );
    if ($cfg) {
        if (empty($emisor['institucion']))  $emisor['institucion']  = $cfg['razon_social'] ?? '';
        if (empty($emisor['unidad']))       $emisor['unidad']       = $cfg['responsable'] ?? '';
        if (empty($emisor['razon_social'])) $emisor['razon_social'] = $cfg['razon_social'] ?? '';
        if (empty($emisor['ruc']))          $emisor['ruc']          = $cfg['ruc'] ?? '';
        if (empty($emisor['direccion']))    $emisor['direccion']    = $cfg['direccion'] ?? '';
        if (empty($emisor['telefono']))     $emisor['telefono']     = $cfg['telefono'] ?? '';
        if (empty($emisor['email']))        $emisor['email']        = $cfg['email'] ?? '';
    }
    if ($idusu > 0) {
        $rprof = ejecutarConsultaSimpleFila(
            "SELECT CONCAT_WS(' ', pe.apaterno, pe.amaterno, pe.nombre) AS nombre,
                    u.cargo, u.especialidad, u.registro_senescyt
             FROM usuario u INNER JOIN persona pe ON pe.idpersona = u.idusuario
             WHERE u.idusuario='$idusu' LIMIT 1"
        );
        if ($rprof) {
            $emisor['profesional'] = trim($rprof['nombre'] ?? '');
            $emisor['cargo']       = $rprof['cargo'] ?? '';
            $emisor['especialidad']= $rprof['especialidad'] ?? '';
            $emisor['senescyt']    = $rprof['registro_senescyt'] ?? '';
        }
    }

    // ---------- PDF ----------
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: ($emisor['razon_social'] ?: 'Profesional médico'));
    $pdf->SetTitle('ANAMNESIS Y EXAMEN FÍSICO (003)');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    // ---------- Contenido del QR de firma electrónica simulada ----------
    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = "FIRMA ELECTRONICA SIMULADA\n"
               . "ATENCION: #{$idatencion}\n"
               . "FORMATO: MSP-003 Anamnesis y Examen Físico\n"
               . "PROFESIONAL: " . ($emisor['profesional'] ?: 'N/D') . "\n"
               . ($emisor['senescyt'] ? "MSP: {$emisor['senescyt']}\n" : '')
               . "FECHA: {$qrTimestamp}\n"
               . "INSTITUCION: " . ($emisor['institucion'] ?: 'N/D');

    // ---------- Estilos paleta MSP oficial ----------
    $estilo = '
    <style>
        table { width:100%; border-collapse:collapse; font-family:helvetica; font-size:8pt; margin:0; padding:0; }
        td, th { border:1px solid #555; padding:3px; vertical-align:middle; }
        .no-border { border:none !important; }
        .section-band { background-color:#CCCCFF; color:#000; font-weight:bold; font-size:9.5pt; padding:5px; }
        .section-num { font-size:11pt; font-weight:bold; padding-right:6px; }
        .subhead { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:3px; text-align:center; }
        .subhead-left { background-color:#CCFFCC; font-weight:bold; font-size:8pt; padding:4px 8px; text-align:left; }
        .item-num { background-color:#99CCFF; font-size:8pt; padding:3px; text-align:center; font-weight:bold; }
        .item-label { background-color:#99CCFF; font-size:7.5pt; padding:3px 4px; }
        .cp-sp { background-color:#FFFF99; text-align:center; font-size:8pt; font-weight:bold; padding:3px; }
        .red-text { color:#FF0000; font-weight:bold; }
        .small { font-size:7pt; color:#444; }
        .text-center { text-align:center; }
        .text-right { text-align:right; }
        .data-cell { font-size:8.5pt; padding:5px; }
    </style>';

    // ---------- Cabecera del establecimiento (todo dinámico) ----------
    $cabTitulo = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $html = $estilo . '
    <table cellpadding="0" cellspacing="0">
        <tr>
            <td class="no-border" style="font-size:10pt; font-weight:bold;">'
              . ($cabTitulo ? htmlspecialchars(strtoupper($cabTitulo)) : '&nbsp;')
              . ($emisor['ruc'] ? '  &nbsp;·&nbsp;  RUC ' . htmlspecialchars($emisor['ruc']) : '') .
            '</td>
        </tr>
        <tr>
            <td class="no-border small">'
              . htmlspecialchars($emisor['direccion'])
              . ($emisor['telefono'] ? '  ·  Tel. ' . htmlspecialchars($emisor['telefono']) : '')
              . ($emisor['email']    ? '  ·  ' . htmlspecialchars($emisor['email']) : '')
              . (trim($emisor['direccion'].$emisor['telefono'].$emisor['email']) === '' ? '&nbsp;' : '') .
            '</td>
        </tr>
    </table><br>';

    // Fila identificación paciente (verde menta) — sin "MSP" hardcoded
    $apellidos = trim(($p['apaterno'] ?? '') . ' ' . ($p['amaterno'] ?? ''));
    $html .= '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="16%" class="subhead">INSTITUCIÓN DEL SISTEMA</td>
            <td width="16%" class="subhead">UNIDAD OPERATIVA</td>
            <td width="14%" class="subhead">NOMBRE</td>
            <td width="18%" class="subhead">APELLIDOS</td>
            <td width="8%"  class="subhead">SEXO (H-M)</td>
            <td width="8%"  class="subhead">T. SANGRE</td>
            <td width="20%" class="subhead">Nº HISTORIA CLÍNICA</td>
        </tr>
        <tr class="text-center" style="font-size:8.5pt;">
            <td>' . htmlspecialchars($emisor['institucion'] ?: '—') . '</td>
            <td>' . htmlspecialchars($emisor['unidad'] ?: '—') . '</td>
            <td>' . htmlspecialchars($p['nombre'] ?? '—') . '</td>
            <td>' . htmlspecialchars($apellidos ?: '—') . '</td>
            <td>' . htmlspecialchars($p['sexo'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['tipo_sangre'] ?? '—') . '</td>
            <td>' . htmlspecialchars($p['num_documento'] ?? '—') . '</td>
        </tr>
    </table><br>';

    // BLOQUE DATOS DE INGRESO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="6" class="section-band"><span class="section-num">·</span>DATOS DE INGRESO HOSPITALARIO</td></tr>
        <tr>
            <td width="14%" class="subhead-left">FECHA INGRESO</td>
            <td width="19%" class="data-cell">' . $val('fecha_ingreso') . '</td>
            <td width="14%" class="subhead-left">HORA INGRESO</td>
            <td width="19%" class="data-cell">' . $val('hora_ingreso') . '</td>
            <td width="14%" class="subhead-left">SERVICIO</td>
            <td width="20%" class="data-cell">' . $val('servicio_ingreso') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">SALA</td>
            <td class="data-cell">' . $val('sala') . '</td>
            <td class="subhead-left">CAMA</td>
            <td class="data-cell">' . $val('cama') . '</td>
            <td class="subhead-left">EDAD</td>
            <td class="data-cell">' . htmlspecialchars($p['edad_completa'] ?? '—') . '</td>
        </tr>
    </table><br>';

    // 1. MOTIVO DE INGRESO
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band">
            <span class="section-num">1</span>MOTIVO DE INGRESO
            <span class="small">  ·  ANOTAR LA CAUSA DEL PROBLEMA EN LA VERSIÓN DEL INFORMANTE</span>
        </td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('motivo_consulta') . '</td></tr>
    </table><br>';

    // 2. ANTECEDENTES PERSONALES Y FAMILIARES (2 columnas)
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band">
            <span class="section-num">2</span>ANTECEDENTES PERSONALES Y FAMILIARES
        </td></tr>
        <tr>
            <td width="50%" class="subhead-left">ANTECEDENTES PATOLÓGICOS PERSONALES (APP)</td>
            <td width="50%" class="subhead-left">ANTECEDENTES FAMILIARES (APF)</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:80px;">' . $valnl('antecedentes_personales') . '</td>
            <td class="data-cell" style="height:80px;">' . $valnl('antecedentes_familiares') . '</td>
        </tr>
        <tr>
            <td colspan="2" class="subhead-left">ALERGIAS / REACCIONES ADVERSAS</td>
        </tr>
        <tr>
            <td colspan="2" class="data-cell"><span class="red-text">' . $val('alergias', 'Ninguna referida') . '</span></td>
        </tr>
    </table><br>';

    // 3. ENFERMEDAD ACTUAL
    $html .= '<table cellspacing="0">
        <tr><td class="section-band">
            <span class="section-num">3</span>ENFERMEDAD O PROBLEMA ACTUAL
            <span class="small">  ·  CRONOLOGÍA, LOCALIZACIÓN, CARACTERÍSTICAS, INTENSIDAD, FACTORES, SÍNTOMAS ASOCIADOS, EVOLUCIÓN, MEDICAMENTOS</span>
        </td></tr>
        <tr><td class="data-cell" style="height:110px;">' . $valnl('enfermedad_actual') . '</td></tr>
    </table><br>';

    // 4. REVISIÓN ÓRGANOS Y SISTEMAS (9 ítems del formulario MSP-003, grid 3x3)
    $itemsRev = [
        ['rev_sentidos','ÓRGANOS SENT.'],
        ['rev_respiratorio','RESPIRATORIO'],
        ['rev_cardio_vascular','CARDIO-VASCULAR'],
        ['rev_digestivo','DIGESTIVO'],
        ['rev_genito_urinario','GENITO-URINARIO'],
        ['rev_musculo_esqueletico','MÚSCULO ESQ.'],
        ['rev_endocrino','ENDOCRINO'],
        ['rev_nervioso','NERVIOSO'],
        ['rev_hemo_linfatico','HEMO LINFÁTICO'],
    ];
    $html .= '<table cellspacing="0">
        <tr><td colspan="12" class="section-band">
            <span class="section-num">4</span>REVISIÓN ACTUAL DE ÓRGANOS Y SISTEMAS
            <span class="small">  ·  CP = Con Patología (marcar X y describir abajo)   ·   SP = Sin Patología (marcar X)</span>
        </td></tr>';
    // Cabecera repetida 3 veces (3 grupos × 4 cols = 12)
    $html .= '<tr>';
    for ($g = 0; $g < 3; $g++) {
        $html .= '<td colspan="2" class="subhead">ÓRGANO / SISTEMA</td>'
              .  '<td class="subhead">CP</td>'
              .  '<td class="subhead">SP</td>';
    }
    $html .= '</tr>';
    // 3 filas de 3 ítems c/u
    for ($f = 0; $f < 3; $f++) {
        $html .= '<tr>';
        for ($c = 0; $c < 3; $c++) {
            $i = $f * 3 + $c;
            $it = $itemsRev[$i];
            $valor = strtoupper(trim($d[$it[0]] ?? ''));
            $cp = ($valor === 'CP') ? 'X' : '';
            $sp = ($valor === 'SP') ? 'X' : '';
            $html .= '<td width="5%" class="item-num">' . ($i + 1) . '</td>'
                  .  '<td width="20%" class="item-label">' . $it[1] . '</td>'
                  .  '<td width="4%" class="cp-sp">' . $cp . '</td>'
                  .  '<td width="4%" class="cp-sp">' . $sp . '</td>';
        }
        $html .= '</tr>';
    }
    $html .= '<tr><td colspan="12" class="subhead-left">OBSERVACIONES (describir hallazgos de los ítems marcados con CP)</td></tr>
              <tr><td colspan="12" class="data-cell" style="height:35px;">' . $valnl('rev_sistemas_obs') . '</td></tr>
    </table><br>';

    // 5. SIGNOS VITALES Y ANTROPOMETRÍA
    $fechaMed = !empty($d['fecha_medicion']) ? htmlspecialchars($d['fecha_medicion']) : date('Y-m-d H:i');
    $html .= '<table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">5</span>SIGNOS VITALES Y ANTROPOMETRÍA</td></tr>
        <tr>
            <td width="25%" class="subhead-left">FECHA / HORA DE MEDICIÓN</td><td width="25%" class="data-cell">' . $fechaMed . '</td>
            <td width="25%" class="subhead-left">TEMPERATURA (°C)</td><td width="25%" class="data-cell">' . $val('temperatura') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PRESIÓN ARTERIAL (mmHg)</td><td class="data-cell">' . $val('presion_arterial') . '</td>
            <td class="subhead-left">FRECUENCIA CARDÍACA (lpm)</td><td class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">FRECUENCIA RESPIRATORIA (rpm)</td><td class="data-cell">' . $val('frecuencia_respiratoria') . '</td>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td><td class="data-cell">' . $val('saturacion') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
            <td class="subhead-left">TALLA (cm)</td><td class="data-cell">' . $val('talla') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">IMC (kg/m²)</td><td class="data-cell">' . $val('imc') . '</td>
            <td class="subhead-left">&nbsp;</td><td class="data-cell">&nbsp;</td>
        </tr>
    </table><br>';

    // 6. EXAMEN FÍSICO REGIONAL (5 textareas)
    $html .= '<table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">6</span>EXAMEN FÍSICO REGIONAL</td></tr>
        <tr>
            <td width="22%" class="subhead-left">CABEZA Y CUELLO</td>
            <td width="78%" class="data-cell" style="height:30px;">' . $valnl('ef_cabeza_cuello') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">TÓRAX</td>
            <td class="data-cell" style="height:30px;">' . $valnl('ef_torax') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">ABDOMEN</td>
            <td class="data-cell" style="height:30px;">' . $valnl('ef_abdomen') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PELVIS / GENITOURINARIO</td>
            <td class="data-cell" style="height:30px;">' . $valnl('ef_pelvis') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">EXTREMIDADES</td>
            <td class="data-cell" style="height:30px;">' . $valnl('ef_extremidades') . '</td>
        </tr>
    </table><br>';

    // 7. DIAGNÓSTICO
    $html .= '<table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">7</span>DIAGNÓSTICO
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    // 8. PLAN DE TRATAMIENTO INICIAL — PLAN en rojo
    $html .= '<table cellspacing="0">
        <tr><td class="section-band">
            <span class="section-num">8</span><span class="red-text">PLAN</span> DE TRATAMIENTO INICIAL
            <span class="small">  ·  INDICACIONES Y PLAN TERAPÉUTICO</span>
        </td></tr>
        <tr><td class="data-cell" style="height:110px;">' . $valnl('plan_tratamiento') . '</td></tr>
    </table><br>';

    // Render del cuerpo
    $pdf->writeHTML($html, true, false, true, false, '');

    // ---------- Pie del profesional con QR de firma (coordenadas absolutas) ----------
    $profesional = trim($emisor['profesional']
        . ($emisor['especialidad'] ? '  ·  ' . $emisor['especialidad'] : '')
        . ($emisor['senescyt'] ? '  ·  MSP ' . $emisor['senescyt'] : ''));

    $pageW    = $pdf->getPageWidth();
    $margins  = $pdf->getMargins();
    $usefulW  = $pageW - $margins['left'] - $margins['right'];
    $y_pie    = $pdf->GetY();

    $pieHtml = $estilo . '
    <table cellpadding="3" cellspacing="0">
        <tr>
            <td width="14%" class="subhead">FECHA</td>
            <td width="12%" class="subhead">HORA</td>
            <td width="40%" class="subhead">NOMBRE DEL PROFESIONAL</td>
            <td width="22%" class="subhead">FIRMA ELECTRÓNICA</td>
            <td width="12%" class="subhead">Nº HOJA</td>
        </tr>
        <tr style="font-size:8.5pt; height:20mm;">
            <td class="text-center">' . date('Y-m-d') . '</td>
            <td class="text-center">' . date('H:i') . '</td>
            <td class="text-center">' . htmlspecialchars($profesional ?: '—') . '</td>
            <td>&nbsp;</td>
            <td class="text-center">001</td>
        </tr>
    </table>';
    $pdf->writeHTML($pieHtml, true, false, true, false, '');
    $y_pie_end = $pdf->GetY();

    $x_firma = $margins['left'] + $usefulW * 0.66;
    $w_firma = $usefulW * 0.22;
    $y_firma_row = $y_pie + 7;
    $h_firma_row = $y_pie_end - $y_firma_row - 1;

    $qr_size = min($h_firma_row - 1, $w_firma * 0.45, 16);
    $qr_x = $x_firma + 1;
    $qr_y = $y_firma_row + max(0, ($h_firma_row - $qr_size) / 2);

    $pdf->write2DBarcode(
        $qrContent, 'QRCODE,M',
        $qr_x, $qr_y, $qr_size, $qr_size,
        [
            'border'    => false,
            'padding'   => 0,
            'fgcolor'   => [0, 0, 0],
            'bgcolor'   => [255, 255, 255],
            'module_width'  => 1,
            'module_height' => 1,
        ],
        'N'
    );

    $tx_x = $qr_x + $qr_size + 1.5;
    $tx_y = $qr_y;
    $tx_w = $w_firma - $qr_size - 3;

    $pdf->SetTextColor(0, 86, 98);
    $pdf->SetFont('helvetica', 'B', 5);
    $pdf->SetXY($tx_x, $tx_y);
    $pdf->Cell($tx_w, 2.5, 'FIRMADO ELECTRÓNICAMENTE', 0, 1, 'L');

    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', 'B', 5.5);
    $pdf->SetXY($tx_x, $tx_y + 2.5);
    $pdf->MultiCell($tx_w, 2.5, $emisor['profesional'] ?: '—', 0, 'L', false, 0, '', '', true, 0, false, true, 5, 'T');

    $offset_y = $tx_y + 2.5 + 2.7;
    if (!empty($emisor['senescyt'])) {
        $pdf->SetFont('helvetica', '', 5);
        $pdf->SetXY($tx_x, $offset_y);
        $pdf->Cell($tx_w, 2.3, 'MSP ' . $emisor['senescyt'], 0, 1, 'L');
        $offset_y += 2.5;
    }
    $pdf->SetFont('helvetica', '', 4.8);
    $pdf->SetTextColor(60, 60, 60);
    $pdf->SetXY($tx_x, $offset_y);
    $pdf->Cell($tx_w, 2.3, $qrTimestamp, 0, 1, 'L');

    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetFont('helvetica', '', 8);

    $pdf->SetY($y_pie_end + 2);

    // Línea final HCU-form
    $lineaHcu = $estilo . '
    <table cellpadding="2" cellspacing="0"><tr>
        <td width="50%" class="no-border" style="font-size:8pt;"><b>SNS-MSP / HCU-form.003 / 2008</b></td>
        <td width="50%" class="no-border text-right" style="font-size:9pt;"><b>ANAMNESIS Y EXAMEN FÍSICO</b></td>
    </tr></table>';
    $pdf->writeHTML($lineaHcu, true, false, true, false, '');

    return salvarPDF($pdf, 'msp003', $idatencion);
}

// --- PEDIATRÍA: HISTORIA CLÍNICA PEDIÁTRICA ---
function generarPDFPediatria($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('HISTORIA CLÍNICA PEDIÁTRICA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'PEDIATRÍA - Historia Clínica', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // Calcular edad detallada
    $edadDisplay = $p['edad_completa'] ?? '—';
    $edadMeses = 0;
    if (!empty($p['fecha_nacimiento'])) {
        $dob = new DateTime($p['fecha_nacimiento']);
        $now = new DateTime();
        $diff = $now->diff($dob);
        $edadDisplay = $diff->y . "a " . $diff->m . "m " . $diff->d . "d";
        $edadMeses = ($diff->y * 12) + $diff->m + ($diff->d / 30.4375);
    }

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. ANTROPOMETRÍA Y SIGNOS VITALES
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">1</span>ANTROPOMETRÍA Y SIGNOS VITALES</td></tr>
        <tr>
            <td width="25%" class="subhead-left">EDAD ACTUAL</td>
            <td width="25%" class="data-cell">' . htmlspecialchars($edadDisplay) . '</td>
            <td width="25%" class="subhead-left">IMC (kg/m²)</td>
            <td width="25%" class="data-cell">' . $val('imc') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
            <td class="subhead-left">TALLA (cm)</td><td class="data-cell">' . $val('talla') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PERÍMETRO CEFÁLICO (cm)</td><td class="data-cell">' . $val('perimetro_cefalico') . '</td>
            <td class="subhead-left">PERÍMETRO ABDOMINAL (cm)</td><td class="data-cell">' . $val('perimetro_abdominal') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">TEMPERATURA (°C)</td><td class="data-cell">' . $val('temperatura') . '</td>
            <td class="subhead-left">F. RESPIRATORIA</td><td class="data-cell">' . $val('frecuencia_respiratoria') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">F. CARDÍACA</td><td class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
            <td class="subhead-left">SATURACIÓN O₂ (%)</td><td class="data-cell">' . $val('saturacion') . '</td>
        </tr>
    </table><br>';

    // 2. MOTIVO / ENFERMEDAD ACTUAL
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>MOTIVO DE CONSULTA</td></tr>
        <tr><td class="data-cell" style="height:35px;">' . $valnl('motivo_consulta') . '</td></tr>
    </table><br>
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>ENFERMEDAD ACTUAL</td></tr>
        <tr><td class="data-cell" style="height:50px;">' . $valnl('tiempo_enfermedad') . '</td></tr>
    </table><br>';

    // 4. ANTECEDENTES
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="3" class="section-band"><span class="section-num">4</span>ANTECEDENTES PEDIÁTRICOS (Perinatales · Patológicos · Familiares)</td></tr>
        <tr><td colspan="3" class="data-cell" style="height:55px;">' . $valnl('antecedentes') . '</td></tr>
        <tr>
            <td width="33%" class="subhead-left">VACUNAS COMPLETAS</td>
            <td width="34%" class="subhead-left">ALERGIAS</td>
            <td width="33%" class="subhead-left">DESARROLLO PSICOMOTOR</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell text-center">' . $val('vacunas_completas') . '</td>
            <td class="data-cell"><span class="red-text">' . $val('alergia', 'Ninguna') . '</span></td>
            <td class="data-cell">' . $val('intervenciones_quirurgicas') . '</td>
        </tr>
    </table><br>';

    // 5. EXAMEN FÍSICO
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">5</span>EXAMEN FÍSICO</td></tr>
        <tr><td class="data-cell" style="height:80px;">' . $valnl('examen_fisico') . '</td></tr>
    </table><br>';

    // 6. DIAGNÓSTICO
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">6</span>DIAGNÓSTICO (CIE-10)
            <span class="small">  ·  PRE = PRESUNTIVO   ·   DEF = DEFINITIVO</span>
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>';

    // 7. PLAN
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">7</span><span class="red-text">PLAN</span> Y TRATAMIENTO</td></tr>
        <tr><td class="data-cell" style="height:70px;">' . $valnl('tratamiento') . '</td></tr>
        <tr><td class="subhead-left">PRÓXIMA CITA</td></tr>
        <tr><td class="data-cell">' . $val('proxima_cita', 'A demanda') . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');

    // ============================================================
    // PÁGINA 2: GRÁFICOS DE CURVAS OMS (dibujados con TCPDF nativo)
    // ============================================================
    _pediatriaDibujarCurvasOMS($pdf, $p, $d, $edadMeses);

    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'PED', 'HISTORIA CLÍNICA PEDIÁTRICA');

    return salvarPDF($pdf, 'pediatria', $idatencion);
}

/**
 * Dibuja en el PDF las curvas OMS de crecimiento del paciente.
 * Usa TCPDF nativo (sin imágenes externas) — líneas para SD y un punto para el paciente.
 */
function _pediatriaDibujarCurvasOMS($pdf, $paciente, $datos, $edadMeses)
{
    if (!function_exists('ejecutarConsulta')) return;
    $sexo = (strtoupper($paciente['sexo'] ?? '') === 'F') ? 2 : 1;
    $idpersona = isset($paciente['idpersona']) ? intval($paciente['idpersona']) : 0;

    $pdf->AddPage();

    // Cabecera de la sección de curvas
    $pdf->SetFont('helvetica', 'B', 11);
    $pdf->SetFillColor(204, 204, 255); // violeta MSP
    $pdf->SetTextColor(0, 0, 0);
    $pdf->Cell(0, 8, 'CURVAS DE CRECIMIENTO OMS (0-5 años)', 1, 1, 'L', 1);
    $pdf->Ln(2);

    // Historial del paciente (puntos pasados)
    $historial = [];
    if ($idpersona > 0) {
        $sqlH = "SELECT a.idatencion, t.peso, t.talla, t.imc, a.fecha,
                        TIMESTAMPDIFF(MONTH, p.fecha_nacimiento, a.fecha) AS edad_meses
                 FROM triaje t
                 INNER JOIN atencion a ON t.idatencion = a.idatencion
                 INNER JOIN persona p ON a.idpersona = p.idpersona
                 WHERE a.idpersona = '$idpersona' AND (t.peso > 0 OR t.talla > 0)
                 ORDER BY a.fecha ASC";
        $rs = @ejecutarConsulta($sqlH);
        if ($rs) {
            while ($r = $rs->fetch_assoc()) {
                $historial[] = [
                    'edad_meses' => (float)$r['edad_meses'],
                    'peso'  => (float)$r['peso'],
                    'talla' => (float)$r['talla'],
                    'imc'   => (float)$r['imc'],
                ];
            }
        }
    }
    // Punto actual desde el formulario
    $pesoAct  = isset($datos['peso']) ? (float)$datos['peso'] : 0;
    $tallaAct = isset($datos['talla']) ? (float)$datos['talla'] : 0;
    $imcAct   = isset($datos['imc']) ? (float)$datos['imc'] : 0;
    $pcAct    = isset($datos['perimetro_cefalico']) ? (float)$datos['perimetro_cefalico'] : 0;

    // 4 curvas en cuadrícula 2x2: Peso/Edad, Talla/Edad, IMC/Edad, P.Cefálico/Edad
    $curvas = [
        ['oms_pde', 'Peso / Edad',        'Edad (meses)', 'Peso (kg)', 'peso',                $pesoAct],
        ['oms_tde', 'Talla / Edad',       'Edad (meses)', 'Talla (cm)', 'talla',              $tallaAct],
        ['oms_imc', 'IMC / Edad',         'Edad (meses)', 'IMC (kg/m²)', 'imc',               $imcAct],
        ['oms_pce', 'P. Cefálico / Edad', 'Edad (meses)', 'P. Cefálico (cm)', 'perimetro_cefalico', $pcAct],
    ];

    // Layout 2x2: cada gráfico ≈ 95x70 mm
    $startX = 10;
    $startY = $pdf->GetY();
    $w = 95; $h = 70; $gap = 5;

    foreach ($curvas as $i => $c) {
        list($tabla, $titulo, $xLabel, $yLabel, $dataKey, $valorActual) = $c;
        $col = $i % 2;
        $row = intval($i / 2);
        $x = $startX + $col * ($w + $gap);
        $y = $startY + $row * ($h + $gap);

        _pediatriaDibujarCurva(
            $pdf, $tabla, $sexo, $historial, $valorActual, $edadMeses, $dataKey,
            $x, $y, $w, $h, $titulo, $xLabel, $yLabel
        );
    }

    // Quinta curva (Peso/Talla) en página adicional si hay espacio o nueva fila
    $pdf->SetY($startY + 2 * ($h + $gap) + 5);
    _pediatriaDibujarCurvaPesoTalla($pdf, $sexo, $historial, $pesoAct, $tallaAct, $startX, $pdf->GetY(), $w * 2 + $gap, $h, 'Peso / Talla');

    $pdf->Ln(5);
}

/**
 * Dibuja UNA curva OMS específica con líneas SD y punto del paciente.
 */
function _pediatriaDibujarCurva($pdf, $tabla, $sexo, $historial, $valorActual, $edadActual,
    $dataKey, $x, $y, $w, $h, $titulo, $xLabel, $yLabel)
{
    // Marco + título
    $pdf->SetDrawColor(80, 80, 80);
    $pdf->SetLineWidth(0.2);
    $pdf->Rect($x, $y, $w, $h);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetXY($x + 2, $y + 1);
    $pdf->Cell($w - 4, 5, $titulo, 0, 0, 'L');

    // Obtener datos OMS
    $sql = "SELECT mes, sd3neg, sd2neg, sd0, sd2, sd3 FROM $tabla WHERE sexo='$sexo' ORDER BY mes ASC";
    $rs = @ejecutarConsulta($sql);
    $omsRows = [];
    if ($rs) {
        while ($r = $rs->fetch_assoc()) $omsRows[] = $r;
    }

    if (count($omsRows) === 0) {
        $pdf->SetFont('helvetica', 'I', 7);
        $pdf->SetXY($x + 2, $y + ($h / 2));
        $pdf->Cell($w - 4, 4, 'Sin datos OMS en BD para esta curva.', 0, 0, 'C');
        return;
    }

    // Área interna de plot (con márgenes para ejes)
    $padL = 10; $padR = 3; $padT = 6; $padB = 8;
    $plotX = $x + $padL;
    $plotY = $y + $padT;
    $plotW = $w - $padL - $padR;
    $plotH = $h - $padT - $padB;

    // Calcular rangos
    $maxX = 0; $minY = INF; $maxY = -INF;
    foreach ($omsRows as $r) {
        $mes = (float)$r['mes'];
        if ($mes > $maxX) $maxX = $mes;
        foreach (['sd3neg','sd2neg','sd0','sd2','sd3'] as $k) {
            $v = (float)$r[$k];
            if ($v > 0 && $v < $minY) $minY = $v;
            if ($v > $maxY) $maxY = $v;
        }
    }
    // Limitar a 60 meses por defecto para mejor visualización en PDF
    if ($maxX > 60) $maxX = 60;
    if ($minY === INF) { $minY = 0; $maxY = 100; }
    $rangeY = max(1, $maxY - $minY);

    $mapX = function ($v) use ($plotX, $plotW, $maxX) {
        return $plotX + ($v / max(1, $maxX)) * $plotW;
    };
    $mapY = function ($v) use ($plotY, $plotH, $minY, $rangeY) {
        return $plotY + $plotH - (($v - $minY) / $rangeY) * $plotH;
    };

    // Ejes
    $pdf->SetDrawColor(150, 150, 150);
    $pdf->SetLineWidth(0.1);
    $pdf->Line($plotX, $plotY, $plotX, $plotY + $plotH);                // Y
    $pdf->Line($plotX, $plotY + $plotH, $plotX + $plotW, $plotY + $plotH); // X

    // Etiquetas ejes
    $pdf->SetFont('helvetica', '', 5);
    $pdf->SetTextColor(100, 100, 100);
    $pdf->SetXY($plotX, $y + $h - $padB + 1);
    $pdf->Cell($plotW, 3, $xLabel, 0, 0, 'C');
    // Etiqueta Y vertical (rotada simulada como texto rotado)
    $pdf->StartTransform();
    $pdf->Rotate(90, $x + 2, $plotY + $plotH / 2);
    $pdf->SetXY($x + 2, $plotY + $plotH / 2);
    $pdf->Cell(20, 3, $yLabel, 0, 0, 'C');
    $pdf->StopTransform();

    // Dibujar curvas SD (de afuera hacia adentro)
    $bandas = [
        ['sd3', '#e74c3c', 0.2],
        ['sd2', '#e67e22', 0.2],
        ['sd0', '#27ae60', 0.4],
        ['sd2neg', '#e67e22', 0.2],
        ['sd3neg', '#e74c3c', 0.2],
    ];
    foreach ($bandas as $b) {
        list($key, $color, $lw) = $b;
        $rgb = sscanf($color, "#%02x%02x%02x");
        $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
        $pdf->SetLineWidth($lw);
        $prevX = null; $prevY = null;
        foreach ($omsRows as $r) {
            $mes = (float)$r['mes'];
            if ($mes > $maxX) break;
            $val = isset($r[$key]) ? (float)$r[$key] : 0;
            if ($val <= 0) { $prevX = null; continue; }
            $px = $mapX($mes);
            $py = $mapY($val);
            if ($prevX !== null) $pdf->Line($prevX, $prevY, $px, $py);
            $prevX = $px; $prevY = $py;
        }
    }

    // Marcar grid de meses (cada 12)
    $pdf->SetDrawColor(220, 220, 220);
    $pdf->SetLineWidth(0.05);
    $pdf->SetFont('helvetica', '', 4.5);
    $pdf->SetTextColor(120, 120, 120);
    for ($m = 0; $m <= $maxX; $m += 12) {
        $px = $mapX($m);
        $pdf->Line($px, $plotY, $px, $plotY + $plotH);
        $pdf->SetXY($px - 4, $plotY + $plotH + 0.5);
        $pdf->Cell(8, 2, (string)$m, 0, 0, 'C');
    }

    // Puntos del paciente (historial)
    $pdf->SetDrawColor(52, 152, 219);
    $pdf->SetFillColor(52, 152, 219);
    foreach ($historial as $h_) {
        $em = (float)$h_['edad_meses'];
        $vv = isset($h_[$dataKey]) ? (float)$h_[$dataKey] : 0;
        if ($vv <= 0 || $em > $maxX) continue;
        $px = $mapX($em);
        $py = $mapY($vv);
        $pdf->Circle($px, $py, 0.7, 0, 360, 'DF');
    }

    // Punto ACTUAL (destacado)
    if ($valorActual > 0 && $edadActual >= 0 && $edadActual <= $maxX) {
        $pdf->SetDrawColor(231, 76, 60);
        $pdf->SetFillColor(231, 76, 60);
        $px = $mapX($edadActual);
        $py = $mapY($valorActual);
        $pdf->Circle($px, $py, 1.2, 0, 360, 'DF');
    }

    // Restablecer estilos
    $pdf->SetDrawColor(0, 0, 0);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetLineWidth(0.2);
}

/**
 * Dibuja la curva Peso/Talla: eje X = talla (cm), eje Y = peso (kg).
 */
function _pediatriaDibujarCurvaPesoTalla($pdf, $sexo, $historial, $pesoAct, $tallaAct, $x, $y, $w, $h, $titulo)
{
    $pdf->SetDrawColor(80, 80, 80);
    $pdf->SetLineWidth(0.2);
    $pdf->Rect($x, $y, $w, $h);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetXY($x + 2, $y + 1);
    $pdf->Cell($w - 4, 5, $titulo, 0, 0, 'L');

    // Crear tabla si no existe
    @ejecutarConsulta("CREATE TABLE IF NOT EXISTS `oms_pt` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `sexo` int(1) NOT NULL,
        `talla_cm` decimal(5,1) NOT NULL,
        `sd3neg` decimal(5,2), `sd2neg` decimal(5,2), `sd1neg` decimal(5,2),
        `sd0` decimal(5,2), `sd1` decimal(5,2), `sd2` decimal(5,2), `sd3` decimal(5,2),
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

    $sql = "SELECT talla_cm, sd3neg, sd2neg, sd0, sd2, sd3 FROM oms_pt WHERE sexo='$sexo' ORDER BY talla_cm ASC";
    $rs = @ejecutarConsulta($sql);
    $omsRows = [];
    if ($rs) {
        while ($r = $rs->fetch_assoc()) $omsRows[] = $r;
    }

    if (count($omsRows) === 0) {
        $pdf->SetFont('helvetica', 'I', 7);
        $pdf->SetTextColor(120, 120, 120);
        $pdf->SetXY($x + 2, $y + ($h / 2) - 3);
        $pdf->MultiCell($w - 4, 4,
            "Tabla OMS peso/talla (oms_pt) sin datos.\nImporta los percentiles oficiales OMS para activar esta curva.\n\nPunto actual del paciente: Talla " . $tallaAct . " cm  ·  Peso " . $pesoAct . " kg",
            0, 'C', 0, 1, '', '', true, 0, false, true, $h - 6, 'T');
        return;
    }

    // Igual que la otra curva, pero con eje X = talla
    $padL = 10; $padR = 3; $padT = 6; $padB = 8;
    $plotX = $x + $padL;
    $plotY = $y + $padT;
    $plotW = $w - $padL - $padR;
    $plotH = $h - $padT - $padB;

    $minX = INF; $maxX = 0; $minY = INF; $maxY = -INF;
    foreach ($omsRows as $r) {
        $t = (float)$r['talla_cm'];
        if ($t < $minX) $minX = $t;
        if ($t > $maxX) $maxX = $t;
        foreach (['sd3neg','sd2neg','sd0','sd2','sd3'] as $k) {
            $v = (float)$r[$k];
            if ($v > 0 && $v < $minY) $minY = $v;
            if ($v > $maxY) $maxY = $v;
        }
    }
    $rangeX = max(1, $maxX - $minX);
    $rangeY = max(1, $maxY - $minY);

    $mapX = function ($v) use ($plotX, $plotW, $minX, $rangeX) { return $plotX + (($v - $minX) / $rangeX) * $plotW; };
    $mapY = function ($v) use ($plotY, $plotH, $minY, $rangeY) { return $plotY + $plotH - (($v - $minY) / $rangeY) * $plotH; };

    $pdf->SetDrawColor(150, 150, 150);
    $pdf->SetLineWidth(0.1);
    $pdf->Line($plotX, $plotY, $plotX, $plotY + $plotH);
    $pdf->Line($plotX, $plotY + $plotH, $plotX + $plotW, $plotY + $plotH);
    $pdf->SetFont('helvetica', '', 5);
    $pdf->SetTextColor(100, 100, 100);
    $pdf->SetXY($plotX, $y + $h - $padB + 1);
    $pdf->Cell($plotW, 3, 'Talla (cm)', 0, 0, 'C');

    $bandas = [
        ['sd3', '#e74c3c', 0.2],
        ['sd2', '#e67e22', 0.2],
        ['sd0', '#27ae60', 0.4],
        ['sd2neg', '#e67e22', 0.2],
        ['sd3neg', '#e74c3c', 0.2],
    ];
    foreach ($bandas as $b) {
        list($key, $color, $lw) = $b;
        $rgb = sscanf($color, "#%02x%02x%02x");
        $pdf->SetDrawColor($rgb[0], $rgb[1], $rgb[2]);
        $pdf->SetLineWidth($lw);
        $prevX = null; $prevY = null;
        foreach ($omsRows as $r) {
            $t = (float)$r['talla_cm'];
            $val = isset($r[$key]) ? (float)$r[$key] : 0;
            if ($val <= 0) { $prevX = null; continue; }
            $px = $mapX($t);
            $py = $mapY($val);
            if ($prevX !== null) $pdf->Line($prevX, $prevY, $px, $py);
            $prevX = $px; $prevY = $py;
        }
    }

    // Historial
    $pdf->SetDrawColor(52, 152, 219);
    $pdf->SetFillColor(52, 152, 219);
    foreach ($historial as $h_) {
        $t = (float)$h_['talla'];
        $pe = (float)$h_['peso'];
        if ($pe <= 0 || $t < $minX || $t > $maxX) continue;
        $px = $mapX($t);
        $py = $mapY($pe);
        $pdf->Circle($px, $py, 0.7, 0, 360, 'DF');
    }

    // Actual
    if ($pesoAct > 0 && $tallaAct >= $minX && $tallaAct <= $maxX) {
        $pdf->SetDrawColor(231, 76, 60);
        $pdf->SetFillColor(231, 76, 60);
        $px = $mapX($tallaAct);
        $py = $mapY($pesoAct);
        $pdf->Circle($px, $py, 1.2, 0, 360, 'DF');
    }
    $pdf->SetDrawColor(0, 0, 0);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->SetLineWidth(0.2);
}

// --- NEUROPEDIATRIA: HISTORIA CLÍNICA NEUROLÓGICA ---
function generarPDFNeuropediatria($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $diagnosticosHtml = obtenerDiagnosticosFormat($idatencion);
    $emisor = _mspObtenerEmisor();

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('HISTORIA CLÍNICA NEUROPEDIÁTRICA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'NEUROPEDIATRÍA · Historia Clínica', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p) . '
    <table cellspacing="0">
        <tr><td class="section-band" style="text-align:center; font-size:11pt;">HISTORIA CLÍNICA NEUROPEDIÁTRICA</td></tr>
    </table><br>

    <!-- DATOS DE FILIACIÓN -->
    <table cellpadding="2">
        <tr><td colspan="4" class="section-title">DATOS DE FILIACIÓN</td></tr>
        <tr>
            <td class="label">Fecha:</td> <td>' . ($d['fecha_consulta'] ?? date('Y-m-d')) . '</td>
            <td class="label">Cédula:</td> <td>' . ($d['cedula_paciente'] ?? $p['num_documento']) . '</td>
        </tr>
        <tr>
            <td class="label">Nombres:</td> <td colspan="3">' . ($d['nombres_completos'] ?? $p['apaterno'] . ' ' . $p['nombre']) . '</td>
        </tr>
        <tr>
            <td class="label">Edad/Sexo:</td> <td>' . ($d['edad_paciente'] ?? $p['edad_completa']) . ' / ' . ($d['sexo_paciente'] ?? $p['sexo']) . '</td>
            <td class="label">F. Nacimiento:</td> <td>' . ($d['fecha_nacimiento'] ?? $p['fecha_nacimiento']) . '</td>
        </tr>
        <tr>
            <td class="label">Procedencia:</td> <td>' . ($d['procedencia'] ?? '') . '</td>
            <td class="label">Residencia:</td> <td>' . ($d['residencia'] ?? $p['direccion']) . '</td>
        </tr>
        <tr>
            <td class="label">Acompañante:</td> <td>' . ($d['nombre_acompanante'] ?? '') . '</td>
            <td class="label">Teléfono:</td> <td>' . ($d['telefono'] ?? $p['telefono']) . '</td>
        </tr>
        <tr>
            <td class="label">Parentesco:</td> <td colspan="3">' . ($d['parentesco_acompanante'] ?? '') . '</td>
        </tr>
    </table><br>

    <!-- MOTIVO DE CONSULTA -->
    <table cellpadding="2">
        <tr><td class="section-title">MOTIVO DE CONSULTA</td></tr>
        <tr><td height="25">' . nl2br($d['motivo_consulta'] ?? '') . '</td></tr>
    </table><br>

    <!-- ENFERMEDAD ACTUAL -->
    <table cellpadding="2">
        <tr><td class="section-title">ENFERMEDAD ACTUAL</td></tr>
        <tr><td height="25">' . nl2br($d['enfermedad_actual'] ?? '') . '</td></tr>
    </table><br>

    <!-- ANTECEDENTES PERINATOLÓGICOS -->
    <table cellpadding="2">
        <tr><td colspan="4" class="section-title">ANTECEDENTES PERINATOLÓGICOS</td></tr>
        <tr><td colspan="4" class="text-bold" style="background-color: #f9f9f9;">Prenatales</td></tr>
        <tr>
            <td width="50%">Embarazo controlado: ' . ($d['embarazo_controlado'] ?? 'NO') . '</td>
            <td width="50%">N° controles: ' . ($d['numero_controles'] ?? '') . '</td>
        </tr>
        <tr>
            <td>Serologías negativas: ' . ($d['serologias'] ?? 'NO') . '</td>
            <td>Ecografías normales: ' . ($d['ecografias_normales'] ?? 'NO') . '</td>
        </tr>
        <tr><td colspan="4" class="text-bold" style="background-color: #f9f9f9;">Natales</td></tr>
        <tr>
            <td>Edad Gestacional: ' . ($d['edad_gestacional'] ?? '') . ' sem</td>
            <td>Peso: ' . ($d['peso_nacer'] ?? '') . ' kg</td>
        </tr>
        <tr>
            <td>APGAR: ' . ($d['apgar_nacer'] ?? '') . '</td>
            <td>Tipo parto: ' . ($d['tipo_parto'] ?? '') . '</td>
        </tr>
        <tr>
            <td colspan="2">Complicaciones neurológicas: ' . ($d['complicaciones_neurologicas'] ?? 'NO') . '</td>
        </tr>
    </table><br>

    <!-- PAUTAS DEL NEURODESARROLLO -->
    <table cellpadding="2">
        <tr><td colspan="4" class="section-title">PAUTAS DEL NEURODESARROLLO</td></tr>
        <tr>
            <td width="25%" class="text-bold label">Motor Grueso</td>
            <td width="25%" class="text-bold label">Motor Fino</td>
            <td width="25%" class="text-bold label">Lenguaje</td>
            <td width="25%" class="text-bold label">Psicosocial</td>
        </tr>
        <tr valign="top">
            <td>
                Sostén cefálico: ' . ($d['motor_sosten_cefalico'] ?? '') . '<br>
                Sedestación: ' . ($d['motor_sedestacion'] ?? '') . '<br>
                Gateo: ' . ($d['motor_gateo'] ?? '') . '<br>
                Marcha: ' . ($d['motor_marcha'] ?? '') . '
            </td>
            <td>
                Pinza digital: ' . ($d['fino_pinza_digital'] ?? '') . '<br>
                Mano predominante: ' . ($d['fino_mano_predominante'] ?? '') . '
            </td>
            <td>
                Monosílabos: ' . ($d['lenguaje_monosilabos'] ?? '') . '<br>
                Primeras palabras: ' . ($d['lenguaje_primeras_palabras'] ?? '') . '
            </td>
            <td>
                Sonrisa social: ' . ($d['psico_sonrisa_social'] ?? '') . '<br>
                Mira a los ojos: ' . ($d['psico_mira_ojos'] ?? '') . '<br>
                Comparte: ' . ($d['psico_comparte'] ?? '') . '
            </td>
        </tr>
    </table><br>

    <!-- ESCOLARIDAD -->
    <table cellpadding="2">
        <tr><td class="section-title">ESCOLARIDAD</td></tr>
        <tr><td height="20">' . nl2br($d['escolaridad'] ?? '') . '</td></tr>
    </table><br>

    <!-- ANTECEDENTES FAMILIARES -->
    <table cellpadding="2">
        <tr><td colspan="4" class="section-title">ANTECEDENTES FAMILIARES</td></tr>
        <tr>
            <td colspan="2">Consanguinidad: ' . ($d['consanguinidad'] ?? 'NO') . '</td>
            <td colspan="2">Trastornos neurodesarrollo: ' . ($d['trastornos_neurodesarrollo_fam'] ?? 'NO') . '</td>
        </tr>
        <tr>
            <td colspan="4">Enf. neurológicas familiares: ' . ($d['enfermedades_neurologicas_fam'] ?? '') . '</td>
        </tr>
    </table><br>

    <!-- EXAMEN FÍSICO / NEUROLÓGICO -->
    <table cellpadding="2">
        <tr><td colspan="4" class="section-title">EXAMEN FÍSICO / NEUROLÓGICO</td></tr>
        <tr><td colspan="4" class="text-bold" style="background-color: #f9f9f9;">Signos Vitales</td></tr>
        <tr>
            <td>FC: ' . ($d['fc_neuro'] ?? '') . '</td>
            <td>FR: ' . ($d['fr_neuro'] ?? '') . '</td>
            <td>T: ' . ($d['temp_neuro'] ?? '') . '°C</td>
            <td>Peso: ' . ($d['peso_neuro'] ?? '') . ' kg</td>
        </tr>
        <tr>
            <td>Talla: ' . ($d['talla_neuro'] ?? '') . ' cm</td>
            <td>PC: ' . ($d['pc_neuro'] ?? '') . ' cm</td>
            <td colspan="2">IMC: ' . ($d['imc_neuro'] ?? '') . '</td>
        </tr>
        <tr><td colspan="4" class="text-bold" style="background-color: #f9f9f9;">Examen Neurológico</td></tr>
        <tr>
            <td colspan="2">Conciencia: ' . ($d['conciencia'] ?? '') . '</td>
            <td colspan="2">Pares craneales: ' . ($d['pares_craneales_normales'] ?? 'SÍ') . '</td>
        </tr>
        <tr>
            <td colspan="2">Fuerza muscular: ' . ($d['fuerza_muscular'] ?? 'Conservada') . '</td>
            <td colspan="2">Tono muscular: ' . ($d['tono_muscular'] ?? 'Conservado') . '</td>
        </tr>
        <tr>
            <td colspan="2">Reflejos: ' . ($d['reflejos_estiramiento'] ?? 'Normales') . '</td>
            <td colspan="2">Marcha: ' . ($d['marcha_eval'] ?? 'Normal') . '</td>
        </tr>
        <tr>
            <td colspan="4">Observaciones: ' . nl2br($d['observaciones_examen_esp'] ?? '') . '</td>
        </tr>
    </table><br>

    <!-- IMPRESIÓN DIAGNÓSTICA -->
    <table cellpadding="2">
        <tr><td colspan="3" class="section-title">IMPRESIÓN DIAGNÓSTICA (CIE-10)</td></tr>
        <tr>
            <td class="text-bold" width="15%">CIE</td>
            <td class="text-bold" width="65%">Diagnóstico</td>
            <td class="text-bold" width="20%">Tipo</td>
        </tr>
        ' . $diagnosticosHtml . '
    </table><br>

    <!-- PLAN -->
    <table cellpadding="2">
        <tr><td class="section-title">PLAN DIAGNÓSTICO, TERAPÉUTICO Y PRÓXIMO CONTROL</td></tr>
        <tr><td height="40">' . nl2br($d['plan_tratamiento'] ?? '') . '</td></tr>
    </table><br>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'NPED', 'HISTORIA CLÍNICA NEUROPEDIÁTRICA');
    return salvarPDF($pdf, 'neuropediatria', $idatencion);
}

// --- NEUROPEDIATRIA: PEDIDOS / EXÁMENES ---
function generarPDFNeuropediatriaPedidos($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('NEUROPEDIATRÍA · Solicitud de Exámenes y Terapias');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'NEUROPEDIATRÍA · Solicitud de Exámenes', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $chk = function ($name) use ($d) {
        return (isset($d[$name]) && $d[$name] == '1') ? '<span style="font-family:zapfdingbats; font-size: 12pt;">4</span>' : '<span style="font-family:zapfdingbats; font-size: 12pt;">o</span>';
    };

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p) . '
    <table cellspacing="0">
        <tr><td class="section-band" style="text-align:center; font-size:11pt;">NEUROPEDIATRÍA · SOLICITUD DE EXÁMENES Y TERAPIAS</td></tr>
    </table><br>
    <table cellpadding="3" border="0" style="background-color: #f5f5f5;">
        <tr>
            <td width="15%" class="text-bold">FECHA:</td>
            <td width="35%">' . ($d['fecha_pedido'] ?? date('Y-m-d')) . '</td>
            <td width="15%" class="text-bold">CÉDULA:</td>
            <td width="35%">' . ($d['cedula_paciente'] ?? $p['num_documento']) . '</td>
        </tr>
        <tr>
            <td class="text-bold">PACIENTE:</td>
            <td colspan="3">' . ($d['nombres_completos'] ?? $p['apaterno'] . ' ' . $p['nombre']) . '</td>
        </tr>
        <tr>
            <td class="text-bold">EDAD:</td>
            <td>' . ($d['edad_paciente'] ?? $p['edad_completa']) . '</td>
            <td class="text-bold">TELÉFONO:</td>
            <td>' . ($d['telefono'] ?? $p['telefono']) . '</td>
        </tr>
    </table><br><br>
    <table cellpadding="2">
        <tr><td class="section-title">MOTIVO DE ESTUDIO</td></tr>
        <tr><td height="40">' . nl2br($d['motivo_estudio'] ?? '') . '</td></tr>
    </table><br>
    <table cellpadding="2">
        <tr><td class="section-title">SE SOLICITA:</td></tr>
    </table>
    <table cellpadding="4" border="0">
        <tr>
            <td width="5%">' . $chk('check_control_neuro') . '</td>
            <td width="30%"><b>Control Neuropediátrico:</b></td>
            <td width="65%" style="border-bottom: 1px solid #ccc;">' . ($d['desc_control_neuro'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_eval_neurodesarrollo') . '</td>
            <td><b>Eval. Neurodesarrollo:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_eval_neurodesarrollo'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_eval_fono') . '</td>
            <td><b>Eval. Fonoaudiológica:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_eval_fono'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_eval_neuropsico') . '</td>
            <td><b>Eval. Neuropsicológica:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_eval_neuropsico'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_eval_psico_clinica') . '</td>
            <td><b>Eval. Psicológica Clínica:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_eval_psico_clinica'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_eval_psicoped') . '</td>
            <td><b>Eval. Psicopedagógica:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_eval_psicoped'] ?? '') . '</td>
        </tr>
        <tr>
            <td>' . $chk('check_perfil_ocup') . '</td>
            <td><b>Perfil Ocupacional/Sensorial:</b></td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['desc_perfil_ocup'] ?? '') . '</td>
        </tr>
    </table><br><hr><br>
    <table cellpadding="4" border="0">
        <tr>
            <td width="5%">' . $chk('check_est_temprana') . '</td>
            <td width="45%"><b>Estimulación Temprana</b></td>
            <td width="5%">' . $chk('check_interv_psico') . '</td>
            <td width="45%"><b>Intervención Psicopedagógica</b></td>
        </tr>
        <tr>
            <td>' . $chk('check_terapia_len') . '</td>
            <td><b>Terapia del Lenguaje</b></td>
            <td>' . $chk('check_psicoterapia') . '</td>
            <td><b>Psicoterapia</b></td>
        </tr>
        <tr>
            <td>' . $chk('check_terapia_fis') . '</td>
            <td><b>Terapia Física</b></td>
            <td>' . $chk('check_psico_clinica_ter') . '</td>
            <td><b>Psicología Clínica</b></td>
        </tr>
        <tr>
            <td>' . $chk('check_terapia_ocu') . '</td>
            <td><b>Terapia Ocupacional</b></td>
            <td>' . $chk('check_rehab_neuro') . '</td>
            <td><b>Rehabilitación Neuropsicológica</b></td>
        </tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'NPED-PED', 'NEUROPEDIATRÍA · SOLICITUD DE EXÁMENES Y TERAPIAS');
    return salvarPDF($pdf, 'neuropediatria_pedidos', $idatencion);
}

// --- NEUROPEDIATRIA: SOLICITUD DE EXÁMENES ---
function generarPDFNeuropediatriaExamenes($idatencion, $json)
{
    try {
        if (!cargarTCPDF()) return null;
        $d = json_decode($json, true) ?? [];
        $p = obtenerDatosPaciente($idatencion);
        $emisor = _mspObtenerEmisor();

        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
        $pdf->SetCreator('Sistema Médico HC');
        $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
        $pdf->SetTitle('NEUROPEDIATRÍA · Solicitud de Exámenes');
        $pdf->SetMargins(10, 8, 10);
        $pdf->SetAutoPageBreak(TRUE, 12);
        $pdf->AddPage();

        $qrTimestamp = date('Y-m-d H:i:s');
        $qrContent = _mspQrContent($idatencion, 'NEUROPEDIATRÍA · Solicitud de Exámenes', $emisor, $qrTimestamp);
        $style = _mspEstiloOficial();

        $pdf->writeHTML($style . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p) . '
        <table cellspacing="0">
            <tr><td class="section-band" style="text-align:center; font-size:11pt;">NEUROPEDIATRÍA · SOLICITUD DE EXÁMENES</td></tr>
        </table>', true, false, true, false, '');
        $chk = function ($name) use ($d) {
            $icon = (isset($d[$name]) && $d[$name] == '1') ? '3' : 'q';
            return '<span style="font-family:zapfdingbats; font-size:14pt;">' . $icon . '</span>';
        };

        $html = $style . '
    <hr>
    <table cellpadding="3" border="0">
        <tr>
            <td width="15%" class="label">FECHA:</td>
            <td width="35%" style="border-bottom: 1px solid #ccc;">' . ($d['fecha_pedido'] ?? date('Y-m-d')) . '</td>
            <td width="15%" class="label">EDAD:</td>
            <td width="35%" style="border-bottom: 1px solid #ccc;">' . ($d['edad_paciente'] ?? $p['edad_completa']) . '</td>
        </tr>
        <tr>
            <td class="label">CEDULA:</td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['cedula_paciente'] ?? $p['num_documento']) . '</td>
            <td class="label">TELEFONO:</td>
            <td style="border-bottom: 1px solid #ccc;">' . ($d['telefono'] ?? $p['telefono']) . '</td>
        </tr>
        <tr>
            <td class="label">PACIENTE:</td>
            <td colspan="3" style="border-bottom: 1px solid #ccc;">' . ($d['nombres_completos'] ?? ($p['apaterno'] . ' ' . $p['nombre'])) . '</td>
        </tr>
        <tr>
            <td class="label">RESIDENCIA:</td>
            <td colspan="3" style="border-bottom: 1px solid #ccc;">' . ($d['direccion_paciente'] ?? $p['direccion']) . '</td>
        </tr>
    </table><br><br>
    <div class="section-title">SE SOLICITA:</div><br>
    <table cellpadding="4" border="0">
        <tr><td width="5%">' . $chk('check_eeg_digital') . '</td><td width="95%">Electroencefalograma digital</td></tr>
        <tr><td>' . $chk('check_eeg_prolongado') . '</td><td>Electroencefalograma prolongado</td></tr>
        <tr><td>' . $chk('check_video_eeg') . '</td><td>Video-EEG</td></tr>
        <tr><td>' . $chk('check_potenciales_visuales_flash') . '</td><td>Potenciales Evocados visuales con flash</td></tr>
        <tr><td>' . $chk('check_potenciales_visuales_pattern') . '</td><td>Potenciales Evocados visuales con pattern</td></tr>
        <tr><td>' . $chk('check_potenciales_somato_sup') . '</td><td>Potenciales Evocados somatosensoriales (miembros superiores)</td></tr>
        <tr><td>' . $chk('check_potenciales_somato_inf') . '</td><td>Potenciales Evocados somatosensoriales (miembros inferiores)</td></tr>
    </table><br><br>
    <div class="section-title">OBSERVACIONES:</div><br>
    <table cellpadding="4" border="0">
        <tr><td width="5%">1.</td><td width="30%"><b>Acostarse a las:</b></td><td width="65%" style="border-bottom: 1px solid #ccc;">' . ($d['obs_acostarse_hora'] ?? '') . '</td></tr>
        <tr><td>2.</td><td><b>Despierto a las:</b></td><td style="border-bottom: 1px solid #ccc;">' . ($d['obs_despertar_hora'] ?? '') . '</td></tr>
        <tr><td>3.</td><td><b>Ayuno desde las:</b></td><td style="border-bottom: 1px solid #ccc;">' . ($d['obs_ayuno_hora'] ?? '') . '</td></tr>
        <tr><td>4.</td><td colspan="2">Cabello seco y limpio</td></tr>
        <tr><td>5.</td><td colspan="2">No usar gel, acondicionador, rinse</td></tr>
        <tr><td>6.</td><td colspan="2">Acudir con el pelo suelto y sin aretes</td></tr>
        <tr><td>7.</td><td colspan="2">Traer colcha al estudio</td></tr>
    </table><br><br><br>
';

        $pdf->writeHTML($html, true, false, true, false, '');
        _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $style, 'NPED-EX', 'NEUROPEDIATRÍA · SOLICITUD DE EXÁMENES');
        return salvarPDF($pdf, 'neuropediatria_examenes', $idatencion);
    } catch (Exception $e) { return null; }
}

// --- GENÉRICO (Fallback) ---
function generarPDFGenerico($idatencion, $json, $tipo)
{
    if (!cargarTCPDF()) return null;
    $d = json_decode($json, true) ?? [];
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetMargins(15, 15, 15);
    $pdf->AddPage();
    $html = getMspStyle() . '<h1>Formato ' . $tipo . '</h1><hr><table cellpadding="5">';
    foreach ($d as $k => $v) {
        if (is_string($v) && !empty($v)) {
            $html .= '<tr><td width="30%" class="label">' . strtoupper(str_replace('_', ' ', $k)) . ':</td><td width="70%">' . $v . '</td></tr>';
        }
    }
    $html .= '</table>';
    $pdf->writeHTML($html, true, false, true, false, '');
    return salvarPDF($pdf, strtolower($tipo), $idatencion);
}

// --- NEFROLOGIA: HISTORIA CLÍNICA NEFROLÓGICA ---
function generarPDFNefrologia($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('HISTORIA CLÍNICA NEFROLÓGICA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'NEFROLOGÍA · Historia Clínica', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $tipoCons = $d['nefro_tipo_consulta'] ?? [];
    if (!is_array($tipoCons)) $tipoCons = [$tipoCons];
    $cExt = in_array('CONSULTA_EXTERNA', $tipoCons) ? 'X' : '';
    $cInt = in_array('INTERCONSULTA', $tipoCons) ? 'X' : '';

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $html .= '
    <table cellspacing="0">
        <tr><td colspan="4" class="section-band" style="text-align:center;">HISTORIA CLÍNICA NEFROLÓGICA</td></tr>
        <tr>
            <td width="20%" class="subhead-left">TIPO DE CONSULTA</td>
            <td width="5%" class="cp-sp">' . $cExt . '</td><td width="25%" class="item-label">CONSULTA EXTERNA</td>
            <td width="5%" class="cp-sp">' . $cInt . '</td>
        </tr>
        <tr>
            <td colspan="2" class="cp-sp"></td>
            <td class="item-label">INTERCONSULTA</td>
            <td></td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">1</span>MOTIVO DE CONSULTA</td></tr>
        <tr><td class="data-cell" style="height:35px;">' . $valnl('nefro_motivo_consulta', $valnl('motivo_consulta')) . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>ENFERMEDAD ACTUAL</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('nefro_enfermedad_actual') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">3</span>ANTECEDENTES PERSONALES Y FAMILIARES</td></tr>
        <tr>
            <td width="50%" class="subhead-left">COMORBILIDADES (HTA, DM, ERC, otras)</td>
            <td width="50%" class="subhead-left">ANTECEDENTES FAMILIARES</td>
        </tr>
        <tr>
            <td class="data-cell" style="height:55px;">' . $valnl('nefro_comorbilidades_otras') . '</td>
            <td class="data-cell" style="height:55px;">' . $valnl('nefro_ant_familiares_otros') . '</td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">4</span>SIGNOS VITALES Y ANTROPOMETRÍA</td></tr>
        <tr>
            <td width="25%" class="subhead-left">PRESIÓN ARTERIAL</td><td width="25%" class="data-cell">' . $val('presion_arterial') . '</td>
            <td width="25%" class="subhead-left">F. CARDÍACA</td><td width="25%" class="data-cell">' . $val('frecuencia_cardiaca') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO (kg)</td><td class="data-cell">' . $val('peso') . '</td>
            <td class="subhead-left">TALLA (cm) · IMC</td><td class="data-cell">' . $val('talla') . ' · ' . $val('imc') . '</td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">5</span>EXAMEN FÍSICO</td></tr>
        <tr><td class="data-cell" style="height:60px;">' . $valnl('nefro_examen_fisico', $valnl('examen_fisico')) . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">6</span>EXÁMENES COMPLEMENTARIOS</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('nefro_examenes') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">7</span>IMPRESIÓN DIAGNÓSTICA (CIE-10)
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">8</span><span class="red-text">PLAN</span> DE TRATAMIENTO</td></tr>
        <tr><td class="data-cell" style="height:90px;">' . $valnl('nefro_plan_tratamiento') . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'NEFRO', 'HISTORIA CLÍNICA NEFROLÓGICA');

    return salvarPDF($pdf, 'nefrologia', $idatencion);
}

// ============================================================
// ANEXOS ADICIONALES
// ============================================================

/**
 * ANEXO 1: FICHA FAMILIAR DE ATENCIÓN PRIMARIA
 */
function generarPDFAnexo1($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('ANEXO 1 – FICHA FAMILIAR');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'Anexo 1 – Ficha Familiar', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. DATOS DE LA VIVIENDA Y UBICACIÓN
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">1</span>DATOS DE LA VIVIENDA Y UBICACIÓN</td></tr>
        <tr><td class="subhead-left">DIRECCIÓN EXACTA</td></tr>
        <tr><td class="data-cell" style="height:24px;">' . $val('direccion') . '</td></tr>
        <tr><td class="subhead-left">REFERENCIA DE UBICACIÓN</td></tr>
        <tr><td class="data-cell" style="height:24px;">' . $val('referencia') . '</td></tr>
    </table><br>';

    // 2. ESTRUCTURA FAMILIAR
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="2" class="section-band"><span class="section-num">2</span>ESTRUCTURA FAMILIAR</td></tr>
        <tr>
            <td width="50%" class="subhead-left">TIPO DE FAMILIA</td>
            <td width="50%" class="subhead-left">CICLO VITAL FAMILIAR</td>
        </tr>
        <tr style="font-size:8.5pt;">
            <td class="data-cell text-center">' . $val('tipo_familia') . '</td>
            <td class="data-cell text-center">' . $val('ciclo_vital_familiar') . '</td>
        </tr>
    </table><br>';

    // 3. IDENTIFICACIÓN DE RIESGOS
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>IDENTIFICACIÓN DE RIESGOS FAMILIARES</td></tr>
        <tr><td class="subhead-left">RIESGOS BIOLÓGICOS</td></tr>
        <tr><td class="data-cell" style="height:90px;">' . $valnl('riesgos_biologicos') . '</td></tr>
        <tr><td class="subhead-left">RIESGOS SOCIOECONÓMICOS</td></tr>
        <tr><td class="data-cell" style="height:90px;">' . $valnl('riesgos_socioeconomicos') . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'Anexo-1', 'FICHA FAMILIAR');

    return salvarPDF($pdf, 'anexo1', $idatencion);
}

/**
 * ANEXO 2: ATENCIÓN PREHOSPITALARIA
 */
function generarPDFAnexo2($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('ANEXO 2 – ATENCIÓN PREHOSPITALARIA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'Anexo 2 – Atención Prehospitalaria', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    // 1. CRONOLOGÍA Y UBICACIÓN
    $html .= '
    <table cellspacing="0">
        <tr><td colspan="6" class="section-band"><span class="section-num">1</span>CRONOLOGÍA Y UBICACIÓN</td></tr>
        <tr>
            <td width="17%" class="subhead-left">FECHA DEL EVENTO</td>
            <td width="16%" class="data-cell">' . $val('fecha_atencion') . '</td>
            <td width="17%" class="subhead-left">HORA DESPACHO</td>
            <td width="16%" class="data-cell">' . $val('hora_despacho') . '</td>
            <td width="17%" class="subhead-left">HORA LLEGADA ESCENA</td>
            <td width="17%" class="data-cell">' . $val('hora_llegada_escena') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">HORA SALIDA ESCENA</td>
            <td class="data-cell">' . $val('hora_salida_escena') . '</td>
            <td class="subhead-left">HORA LLEGADA HOSPITAL</td>
            <td colspan="3" class="data-cell">' . $val('hora_llegada_hospital') . '</td>
        </tr>
        <tr>
            <td colspan="6" class="subhead-left">MOTIVO DE LLAMADA / DESPACHO</td>
        </tr>
        <tr>
            <td colspan="6" class="data-cell" style="height:30px;">' . $valnl('motivo_llamada') . '</td>
        </tr>
        <tr>
            <td colspan="6" class="subhead-left">ESCENARIO / SITUACIÓN ENCONTRADA</td>
        </tr>
        <tr>
            <td colspan="6" class="data-cell" style="height:30px;">' . $valnl('escenario') . '</td>
        </tr>
    </table><br>';

    // 2. EVALUACIÓN
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>EVALUACIÓN DEL PACIENTE</td></tr>
        <tr><td class="subhead-left">EVALUACIÓN PRIMARIA (X · A · B · C · D · E)</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('evaluacion_primaria') . '</td></tr>
        <tr><td class="subhead-left">SIGNOS VITALES EN ESCENA</td></tr>
        <tr><td class="data-cell" style="height:35px;">' . $valnl('signos_vitales_escena') . '</td></tr>
    </table><br>';

    // 3. PROCEDIMIENTOS Y MANEJO
    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>PROCEDIMIENTOS Y MANEJO</td></tr>
        <tr><td class="subhead-left">PROCEDIMIENTOS REALIZADOS</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('procedimientos_realizados') . '</td></tr>
        <tr><td class="subhead-left">MEDICAMENTOS ADMINISTRADOS</td></tr>
        <tr><td class="data-cell" style="height:55px;">' . $valnl('medicamentos_administrados') . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'Anexo-2', 'ATENCIÓN PREHOSPITALARIA');

    return salvarPDF($pdf, 'anexo2', $idatencion);
}

// --- NUTRICIÓN: HISTORIA CLÍNICA ---
function generarPDFNutricion($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $val = function ($k, $alt = '—') use ($d) { return _mspVal($d, $k, $alt); };
    $valnl = function ($k, $alt = '—') use ($d) { return _mspValnl($d, $k, $alt); };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('NUTRICIÓN · Historia Clínica');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'NUTRICIÓN · Historia Clínica', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);

    $html .= '
    <table cellspacing="0">
        <tr><td class="section-band" style="text-align:center; font-size:11pt;">NUTRICIÓN · HISTORIA CLÍNICA NUTRICIONAL</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="4" class="section-band"><span class="section-num">1</span>ANTROPOMETRÍA Y EVALUACIÓN</td></tr>
        <tr>
            <td width="25%" class="subhead-left">PESO ACTUAL (kg)</td><td width="25%" class="data-cell">' . $val('eval_peso_actual', $val('peso')) . '</td>
            <td width="25%" class="subhead-left">PESO HABITUAL</td><td width="25%" class="data-cell">' . $val('eval_peso_habitual') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PESO IDEAL</td><td class="data-cell">' . $val('eval_peso_ideal') . '</td>
            <td class="subhead-left">TALLA (cm)</td><td class="data-cell">' . $val('eval_talla', $val('talla')) . '</td>
        </tr>
        <tr>
            <td class="subhead-left">IMC (kg/m²)</td><td class="data-cell" style="font-weight:bold;">' . $val('calc_imc', $val('imc')) . '</td>
            <td class="subhead-left">DIAGNÓSTICO NUTRICIONAL</td><td class="data-cell">' . $val('diag_nutricional') . '</td>
        </tr>
        <tr>
            <td class="subhead-left">PERÍMETRO ABDOMINAL (cm)</td><td class="data-cell">' . $val('perimetro_abdominal') . '</td>
            <td class="subhead-left">% GRASA / % MÚSCULO</td><td class="data-cell">' . $val('porc_grasa') . ' / ' . $val('porc_musculo') . '</td>
        </tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">2</span>HÁBITOS ALIMENTARIOS</td></tr>
        <tr><td class="data-cell" style="height:70px;">' . $valnl('habitos_alimentarios') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">3</span>RECORDATORIO DE 24 HORAS</td></tr>
        <tr><td class="data-cell" style="height:85px;">' . $valnl('recordatorio_24h') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">4</span>ANTECEDENTES PATOLÓGICOS Y ALERGIAS</td></tr>
        <tr><td class="data-cell" style="height:50px;">' . $valnl('antecedentes_nutricion') . '</td></tr>
        <tr><td class="subhead-left">ALERGIAS ALIMENTARIAS</td></tr>
        <tr><td class="data-cell"><span class="red-text">' . $val('alergias_alimentarias', 'Ninguna referida') . '</span></td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">5</span>OBJETIVOS NUTRICIONALES</td></tr>
        <tr><td class="data-cell" style="height:50px;">' . $valnl('objetivos_nutricion') . '</td></tr>
    </table><br>

    <table cellspacing="0">
        <tr><td colspan="4" class="section-band">
            <span class="section-num">6</span>DIAGNÓSTICOS (CIE-10)
        </td></tr>
        <tr>
            <td width="14%" class="subhead">CIE-10</td>
            <td width="62%" class="subhead">DESCRIPCIÓN</td>
            <td width="12%" class="subhead">PRE</td>
            <td width="12%" class="subhead">DEF</td>
        </tr>
        ' . obtenerDiagnosticosFormat($idatencion) . '
    </table><br>

    <table cellspacing="0">
        <tr><td class="section-band"><span class="section-num">7</span><span class="red-text">PLAN</span> NUTRICIONAL Y RECOMENDACIONES</td></tr>
        <tr><td class="data-cell" style="height:110px;">' . $valnl('plan_nutricion', $valnl('tratamiento')) . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'NUT', 'HISTORIA CLÍNICA NUTRICIONAL');

    return salvarPDF($pdf, 'nutricion', $idatencion);
}

// --- GERIATRÍA: VALORACIÓN GERIÁTRICA INTEGRAL ---
function generarPDFGeriatria($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('VALORACIÓN GERIÁTRICA INTEGRAL');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'GERIATRÍA · Valoración Integral', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // Helper functions to safely get values
    $getTam = function($val) { return $val === '1' ? 'SÍ' : ($val === '0' ? 'NO' : '-'); };
    $getVal = function($val) { return $val !== '' && $val !== null ? $val : '-'; };

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p) . '
    <table cellspacing="0">
        <tr><td class="section-band" style="text-align:center; font-size:11pt;">VALORACIÓN GERIÁTRICA INTEGRAL (VGI · MSP 057A)</td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px;">1. TAMIZAJE RÁPIDO</div>
    <table cellpadding="2" border="1" style="font-size: 7pt;">
        <tr>
            <td width="40%">Dificultad visual: <b>' . $getTam($d['tam_visual'] ?? '') . '</b></td>
            <td width="30%">Pérdida de orina: <b>' . $getTam($d['tam_orina'] ?? '') . '</b></td>
            <td width="30%">Se siente triste/deprimido: <b>' . $getTam($d['tam_triste'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Dificultad auditiva: <b>' . $getTam($d['tam_auditiva'] ?? '') . '</b></td>
            <td>Pérdida peso >4.5Kg/6m: <b>' . $getTam($d['tam_peso'] ?? '') . '</b></td>
            <td>Puede bañarse solo: <b>' . $getTam($d['tam_bano'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Prueba levántate y anda >15s: <b>' . $getTam($d['tam_anda'] ?? '') . '</b></td>
            <td>Pérdida memoria reciente: <b>' . $getTam($d['tam_memoria'] ?? '') . '</b></td>
            <td>Sale de compras solo: <b>' . $getTam($d['tam_compras'] ?? '') . '</b> | Vive solo: <b>' . $getTam($d['tam_vive'] ?? '') . '</b></td>
        </tr>
        <tr style="background-color: #f1f5f9;"><td colspan="3" align="right"><b>TOTAL TAMIZAJE: ' . ($d['tam_total'] ?? '0') . '</b></td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">2. ACTIVIDADES INSTRUMENTALES (LAWTON)</div>
    <table cellpadding="2" border="1" style="font-size: 7pt;">
        <tr>
            <td width="25%">Cuida la casa: <b>' . $getVal($d['inst_casa'] ?? '') . '</b></td>
            <td width="25%">Usa transporte: <b>' . $getVal($d['inst_trans'] ?? '') . '</b></td>
            <td width="25%">Lava la ropa: <b>' . $getVal($d['inst_ropa'] ?? '') . '</b></td>
            <td width="25%">Maneja dinero: <b>' . $getVal($d['inst_dinero'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Usa el teléfono: <b>' . $getVal($d['inst_telefono'] ?? '') . '</b></td>
            <td>Prepara comida: <b>' . $getVal($d['inst_comida'] ?? '') . '</b></td>
            <td>Va de compras: <b>' . $getVal($d['inst_compras'] ?? '') . '</b></td>
            <td>Maneja medicación: <b>' . $getVal($d['inst_med'] ?? '') . '</b></td>
        </tr>
        <tr style="background-color: #f1f5f9;"><td colspan="4" align="right"><b>TOTAL INSTRUMENTAL: ' . ($d['inst_total'] ?? '0') . ' - ' . ($d['inst_desc'] ?? '') . '</b></td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">3. DEPRESIÓN (YESAVAGE)</div>
    <table cellpadding="2" border="1" style="font-size: 6.5pt;">
        <tr>
            <td width="33%">Satisfecho con vida: <b>' . $getTam($d['dep_1'] ?? '') . '</b></td>
            <td width="33%">Dejó actividades de interés: <b>' . $getTam($d['dep_2'] ?? '') . '</b></td>
            <td width="34%">Siente su vida vacía: <b>' . $getTam($d['dep_3'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Se aburre frecuencia: <b>' . $getTam($d['dep_4'] ?? '') . '</b></td>
            <td>Buen ánimo mayor tiempo: <b>' . $getTam($d['dep_5'] ?? '') . '</b></td>
            <td>Preocupado algo malo sucederá: <b>' . $getTam($d['dep_6'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Feliz mayor parte del tiempo: <b>' . $getTam($d['dep_7'] ?? '') . '</b></td>
            <td>A menudo desamparado: <b>' . $getTam($d['dep_8'] ?? '') . '</b></td>
            <td>Prefiere casa a salir: <b>' . $getTam($d['dep_9'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Problemas memoria > demás: <b>' . $getTam($d['dep_10'] ?? '') . '</b></td>
            <td>Maravilloso estar vivo: <b>' . $getTam($d['dep_11'] ?? '') . '</b></td>
            <td>Se siente inútil: <b>' . $getTam($d['dep_12'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Lleno de energía: <b>' . $getTam($d['dep_13'] ?? '') . '</b></td>
            <td>Sin esperanza actual: <b>' . $getTam($d['dep_14'] ?? '') . '</b></td>
            <td>Gente mejor que usted: <b>' . $getTam($d['dep_15'] ?? '') . '</b></td>
        </tr>
        <tr style="background-color: #f1f5f9;"><td colspan="3" align="right"><b>TOTAL DEPRESIÓN: ' . ($d['dep_total'] ?? '0') . ' - ' . ($d['dep_desc'] ?? '') . '</b></td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">4. COGNITIVO</div>
    <table cellpadding="2" border="1" style="font-size: 7pt;">
        <tr>
            <td width="33%">Fecha (D,M,A,S): <b>' . $getVal($d['cog_fecha'] ?? '') . '</b></td>
            <td width="33%">Aprende 3 objetos: <b>' . $getVal($d['cog_obj'] ?? '') . '</b></td>
            <td width="34%">Repite revés (1,3,5,7,9): <b>' . $getVal($d['cog_num'] ?? '') . '</b></td>
        </tr>
        <tr>
            <td>Toma/dobla/coloca papel: <b>' . $getVal($d['cog_papel'] ?? '') . '</b></td>
            <td>Repite 3 palabras: <b>' . $getVal($d['cog_pal'] ?? '') . '</b></td>
            <td>Copia 2 círculos: <b>' . $getVal($d['cog_circ'] ?? '') . '</b></td>
        </tr>
        <tr style="background-color: #f1f5f9;"><td colspan="3" align="right"><b>TOTAL COGNITIVO: ' . ($d['cog_total'] ?? '0') . ' - ' . ($d['cog_desc'] ?? '') . '</b></td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">5. ACTIVIDADES BÁSICAS (KATZ MODIFICADO)</div>
    <table cellpadding="2" border="1" style="font-size: 7pt; text-align: center;">
        <tr style="background-color: #f8fafc;">
            <td width="12%">Baña</td><td width="12%">Viste</td><td width="13%">Apariencia</td><td width="12%">Inodoro</td>
            <td width="13%">Esfínteres</td><td width="13%">Traslada</td><td width="13%">Camina</td><td width="12%">Alimenta</td>
        </tr>
        <tr>
            <td>' . $getVal($d['bas_bana'] ?? '') . '</td>
            <td>' . $getVal($d['bas_viste'] ?? '') . '</td>
            <td>' . $getVal($d['bas_apa'] ?? '') . '</td>
            <td>' . $getVal($d['bas_ino'] ?? '') . '</td>
            <td>' . $getVal($d['bas_esf'] ?? '') . '</td>
            <td>' . $getVal($d['bas_tras'] ?? '') . '</td>
            <td>' . $getVal($d['bas_camina'] ?? '') . '</td>
            <td>' . $getVal($d['bas_alim'] ?? '') . '</td>
        </tr>
        <tr style="background-color: #f1f5f9;"><td colspan="8" align="right"><b>TOTAL BÁSICAS: ' . ($d['bas_total'] ?? '0') . '</b></td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">6. NUTRICIONAL Y 7. SOCIAL</div>
    <table cellpadding="2" border="1" style="font-size: 7pt;">
        <tr>
            <td width="50%" valign="top">
                <b>NUTRICIONAL</b><br>
                Disminución ingesta: <b>' . $getVal($d['nut_ingesta'] ?? '') . '</b> | Pérdida peso: <b>' . $getVal($d['nut_peso'] ?? '') . '</b><br>
                IMC: <b>' . $getVal($d['nut_imc'] ?? '') . '</b> | Movilidad: <b>' . $getVal($d['nut_mov'] ?? '') . '</b><br>
                Enf Aguda/Psic: <b>' . $getVal($d['nut_psi'] ?? '') . '</b> | Demencia/Dep: <b>' . $getVal($d['nut_dem'] ?? '') . '</b><br>
                <div style="background-color: #f1f5f9; text-align:right;"><b>TOTAL: ' . ($d['nut_total'] ?? '0') . ' - ' . ($d['nut_desc'] ?? '') . '</b></div>
            </td>
            <td width="50%" valign="top">
                <b>SOCIAL</b><br>
                Familiar: <b>' . $getVal($d['soc_fam'] ?? '') . '</b> | Relaciones: <b>' . $getVal($d['soc_rel'] ?? '') . '</b><br>
                Apoyo Red: <b>' . $getVal($d['soc_apoyo'] ?? '') . '</b> | Grupo Edad: <b>' . $getVal($d['soc_edad'] ?? '') . '</b><br>
                <div style="background-color: #f1f5f9; text-align:right;"><b>TOTAL: ' . ($d['soc_total'] ?? '0') . ' - ' . ($d['soc_desc'] ?? '') . '</b></div>
            </td>
        </tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">8. DIAGNÓSTICO SINDROMÁTICO INTEGRAL</div>
    <table cellpadding="4" border="1" style="font-size: 8pt;">
        <tr><td height="40" style="vertical-align: top;">' . nl2br($d['geri_diag'] ?? 'Sin registro sindromático') . '</td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">9. PLAN DE INTERVENCIÓN Y SEGUIMIENTO</div>
    <table cellpadding="4" border="1" style="font-size: 8pt;">
        <tr><td height="40" style="vertical-align: top;">' . nl2br($d['geri_plan'] ?? 'Sin registro de plan') . '</td></tr>
        <tr style="background-color: #f8fafc;"><td><b>FECHA DE PRÓXIMO CONTROL VGI:</b> ' . ($d['geri_proxima_cita'] ?? 'No programada') . '</td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'GERI', 'VALORACIÓN GERIÁTRICA INTEGRAL');
    return salvarPDF($pdf, 'geriatria', $idatencion);
}

// --- PSICOLOGÍA: HISTORIA CLÍNICA PSICOLÓGICA ---
function generarPDFPsicologia($idatencion, $json)
{
    if (!cargarTCPDF()) return null;
    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];

    $emisor = _mspObtenerEmisor();
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('HISTORIA CLÍNICA PSICOLÓGICA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'PSICOLOGÍA · Historia Clínica', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $getVal = function($val) { return $val !== '' && $val !== null ? $val : '-'; };

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p) . '
    <table cellspacing="0">
        <tr><td class="section-band" style="text-align:center; font-size:11pt;">HISTORIA CLÍNICA PSICOLÓGICA</td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">1. DATOS DEL PACIENTE</div>
    <table cellpadding="3" border="1" style="font-size: 7.5pt;">
        <tr>
            <td width="15%" style="background-color: #f8fafc;"><b>PACIENTE:</b></td><td width="55%">' . $p['apaterno'] . ' ' . $p['nombre'] . '</td>
            <td width="15%" style="background-color: #f8fafc;"><b>CÉDULA:</b></td><td width="15%">' . $p['num_documento'] . '</td>
        </tr>
        <tr>
            <td style="background-color: #f8fafc;"><b>EDAD / SEXO:</b></td><td>' . $p['edad_completa'] . ' / ' . $p['sexo'] . '</td>
            <td style="background-color: #f8fafc;"><b>FECHA:</b></td><td>' . $p['fecha'] . '</td>
        </tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">2. DATOS ADICIONALES (DESARROLLO Y PERINATALES)</div>
    <table cellpadding="2" border="1" style="font-size: 7pt; text-align: center;">
        <tr style="background-color: #f8fafc; font-weight: bold;">
            <td width="20%">Embarazo Deseado</td><td width="20%">Controles Médicos</td><td width="20%">Parto a Término</td>
            <td width="20%">Peso/Talla Adec.</td><td width="20%">Lloró al nacer</td>
        </tr>
        <tr>
            <td>' . $getVal($d['da_emb_deseado'] ?? '') . '</td><td>' . $getVal($d['da_controles'] ?? '') . '</td>
            <td>' . $getVal($d['da_parto_termino'] ?? '') . '</td><td>' . $getVal($d['da_peso_talla'] ?? '') . '</td>
            <td>' . $getVal($d['da_lloro'] ?? '') . '</td>
        </tr>
        <tr style="background-color: #f8fafc; font-weight: bold;">
            <td>Control de Cuello</td><td>Voltearse</td><td>Sentarse</td><td>Gateo</td><td>Pararse con Apoyo</td>
        </tr>
        <tr>
            <td>' . $getVal($d['da_cuello'] ?? '') . '</td><td>' . $getVal($d['da_voltearse'] ?? '') . '</td>
            <td>' . $getVal($d['da_sentarse'] ?? '') . '</td><td>' . $getVal($d['da_gateo'] ?? '') . '</td>
            <td>' . $getVal($d['da_pararse_apoyo'] ?? '') . '</td>
        </tr>
        <tr style="background-color: #f8fafc; font-weight: bold;">
            <td>Pararse Solo</td><td>Balbuceo</td><td>Primeras Palabras</td><td>Esfínter Micción</td><td>Esfínter Defecación</td>
        </tr>
        <tr>
            <td>' . $getVal($d['da_pararse'] ?? '') . '</td><td>' . $getVal($d['da_balbuceo'] ?? '') . '</td>
            <td>' . $getVal($d['da_palabras'] ?? '') . '</td><td>' . $getVal($d['da_esfinter_mic'] ?? '') . '</td>
            <td>' . $getVal($d['da_esfinter_def'] ?? '') . '</td>
        </tr>
    </table>
    <table cellpadding="3" border="1" style="font-size: 7pt;">
        <tr><td style="vertical-align: top;"><b>Observaciones:</b> ' . nl2br($d['da_resultados'] ?? 'Sin observaciones de desarrollo.') . '</td></tr>
    </table><br>

    <table cellpadding="0" border="0" width="100%">
        <tr>
            <td width="49%">
                <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">3. MOTIVO DE CONSULTA</div>
                <table cellpadding="3" border="1" style="font-size: 7.5pt;"><tr><td height="50" style="vertical-align: top;">' . nl2br($d['psic_motivo'] ?? '') . '</td></tr></table>
            </td>
            <td width="2%"></td>
            <td width="49%">
                <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">4. ENFERMEDAD O PROBLEMA ACTUAL</div>
                <table cellpadding="3" border="1" style="font-size: 7.5pt;"><tr><td height="50" style="vertical-align: top;">' . nl2br($d['psic_enfermedad_actual'] ?? '') . '</td></tr></table>
            </td>
        </tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">5. ANAMNESIS FAMILIAR Y 6. ANAMNESIS PERSONAL</div>
    <table cellpadding="3" border="1" style="font-size: 7.5pt;">
        <tr>
            <td width="50%" style="vertical-align: top;"><b>Familiar (Ítem 5):</b><br>' . nl2br($d['psic_anamnesis_fam_1'] ?? '') . '<br><br><b>Observaciones Especiales:</b><br>' . nl2br($d['psic_obs_5'] ?? '') . '</td>
            <td width="50%" style="vertical-align: top;"><b>Personal (Ítem 6):</b><br>' . nl2br($d['psic_anamnesis_fam_2'] ?? '') . '</td>
        </tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">7. EVALUACIÓN DE FUNCIONES (ESTADO MENTAL)</div>
    <table cellpadding="2" border="1" style="font-size: 7pt; text-align: center;">
        <tr style="background-color: #f8fafc; font-weight: bold;">
            <td width="10%">Orientación</td><td width="10%">Atención</td><td width="10%">Memoria</td><td width="10%">Lenguaje</td><td width="10%">Sensoper.</td>
            <td width="10%">Pensam.</td><td width="10%">Afectivid.</td><td width="10%">Voluntad</td><td width="10%">Instintos</td><td width="10%">Hábitos</td>
        </tr>
        <tr>
            <td>' . $getVal($d['ef_orientacion'] ?? '') . '</td><td>' . $getVal($d['ef_atencion'] ?? '') . '</td><td>' . $getVal($d['ef_memoria'] ?? '') . '</td>
            <td>' . $getVal($d['ef_lenguaje'] ?? '') . '</td><td>' . $getVal($d['ef_sensopercepciones'] ?? '') . '</td><td>' . $getVal($d['ef_pensamiento'] ?? '') . '</td>
            <td>' . $getVal($d['ef_afectividad'] ?? '') . '</td><td>' . $getVal($d['ef_voluntad'] ?? '') . '</td><td>' . $getVal($d['ef_instintos'] ?? '') . '</td>
            <td>' . $getVal($d['ef_habitos'] ?? '') . '</td>
        </tr>
    </table>
    <table cellpadding="3" border="1" style="font-size: 7.5pt;">
        <tr><td style="vertical-align: top;"><b>Resultados de Evaluación Mental:</b> ' . nl2br($d['ef_resultados'] ?? '') . '</td></tr>
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">8. DIAGNÓSTICOS DSM-5 (SISTEMA INTEGRADO)</div>
    <table cellpadding="3" border="1" style="font-size: 7pt;">
        <tr style="background-color: #f8fafc; font-weight: bold; text-align: center;">
            <td width="15%">CÓDIGO</td><td width="55%">DIAGNÓSTICO DSM-5</td><td width="30%">CATEGORÍA</td>
        </tr>
        ';
        
        $dsm_html = '';
        if (isset($d['dsm5_codigo']) && is_array($d['dsm5_codigo'])) {
            for ($i = 0; $i < count($d['dsm5_codigo']); $i++) {
                $dsm_html .= '<tr>
                    <td align="center"><b>' . $d['dsm5_codigo'][$i] . '</b></td>
                    <td>' . $d['dsm5_enfermedad'][$i] . '</td>
                    <td>' . ($d['dsm5_categoria'][$i] ?? '-') . '</td>
                </tr>';
            }
        }
        
        if (empty($dsm_html)) {
            $dsm_html = '<tr><td colspan="3" align="center">No se registraron diagnósticos DSM-5 específicos.</td></tr>';
        }
        
        $html .= $dsm_html . '
    </table><br>

    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">10. DIAGNÓSTICO DEFINITIVO Y PLAN TERAPÉUTICO</div>
    <table cellpadding="3" border="1" style="font-size: 7.5pt;">
        <tr>
            <td style="vertical-align: top;"><b>Conclusiones Diagnósticas:</b><br>' . nl2br($d['psic_diag_definitivo'] ?? '-') . '</td>
        </tr>
        <tr>
            <td style="vertical-align: top;"><b>Plan Terapéutico / Recomendaciones:</b><br>' . nl2br($d['psic_plan_terapeutico'] ?? '-') . '</td>
        </tr>
    </table><br>


    <div class="section-band" style="padding:4px 6px; font-size:8.5pt;">9. BATERÍAS Y TESTS APLICADOS</div>
    <table cellpadding="3" border="1" style="font-size: 7.5pt; text-align: center;">
        <tr><td style="color: #475569;"><i>(CONSTANCIA LEGAL: Los archivos adjuntos de tests y baterías aplicadas, correspondientes a este ítem, reposan anexados digitalmente en la base de datos de la Historia Clínica Electrónica del paciente).</i></td></tr>
    </table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'PSI', 'HISTORIA CLÍNICA PSICOLÓGICA');
    return salvarPDF($pdf, 'psicologia', $idatencion);
}

function generarPDFFisioterapia($idatencion, $json)
{
    if (!cargarTCPDF()) return null;

    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $g = function($k, $def = '-') use ($d) {
        $v = $d[$k] ?? '';
        return ($v !== '' && $v !== null) ? htmlspecialchars($v, ENT_QUOTES, 'UTF-8') : $def;
    };
    $gnl = function($k, $def = '-') use ($d) {
        $v = $d[$k] ?? '';
        return ($v !== '' && $v !== null) ? nl2br(htmlspecialchars($v, ENT_QUOTES, 'UTF-8')) : $def;
    };
    // Resuelve un par SI/NO + Especifique en una sola celda compacta
    $snEsp = function($base, $espKey = null) use ($d) {
        $v = $d[$base] ?? '';
        $esp = $espKey ? ($d[$espKey] ?? '') : '';
        $out = $v !== '' ? '<b>' . htmlspecialchars($v) . '</b>' : '-';
        if ($esp !== '') $out .= ' <span style="color:#555;">(' . htmlspecialchars($esp) . ')</span>';
        return $out;
    };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetCreator('Sistema Medico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional medico');
    $pdf->SetTitle('HISTORIA CLINICA FISIOTERAPIA Y REHABILITACION');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'FISIOTERAPIA y REHABILITACION', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    // Encabezado oficial + identificacion paciente
    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);
    $html .= '<table cellspacing="0"><tr><td class="section-band" style="text-align:center; font-size:11pt;">HISTORIA CLINICA DE FISIOTERAPIA Y REHABILITACION</td></tr></table>';

    // ---------- 1. DATOS GENERALES ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">1. DATOS GENERALES</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="14%" style="background:#f8fafc;"><b>No. Expediente:</b></td><td width="20%">' . $g('ft_no_expediente') . '</td>'
        . '<td width="13%" style="background:#f8fafc;"><b>Cama/Cubiculo:</b></td><td width="16%">' . $g('ft_cama_cubiculo') . '</td>'
        . '<td width="9%" style="background:#f8fafc;"><b>Fecha:</b></td><td width="13%">' . $g('ft_fecha') . '</td>'
        . '<td width="6%" style="background:#f8fafc;"><b>Hora:</b></td><td width="9%">' . $g('ft_hora') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Diagnostico medico:</b></td><td colspan="3">' . $gnl('ft_dx_medico') . '</td>'
        . '<td style="background:#f8fafc;"><b>Tx previos:</b></td><td colspan="3">' . $gnl('ft_tx_previos') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Motivo:</b></td><td colspan="3">' . $gnl('ft_motivo_consulta') . '</td>'
        . '<td style="background:#f8fafc;"><b>Mec. lesion:</b></td><td colspan="3">' . $gnl('ft_mecanismo_lesion') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Medico tratante:</b></td><td colspan="3">' . $g('ft_medico_tratante') . '</td>'
        . '<td style="background:#f8fafc;"><b>Remision:</b></td><td colspan="3">' . $g('ft_remision') . '</td></tr>'
        . '</table>';

    // ---------- 2. PACIENTE DEPORTIVO (si aplica) ----------
    if (!empty($d['ft_deportivo_on'])) {
        $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">2. PACIENTE DEPORTIVO</div>';
        $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
            . '<tr><td width="18%" style="background:#f8fafc;"><b>Disciplina:</b></td><td width="32%">' . $g('ft_dep_disciplina') . '</td>'
            . '<td width="18%" style="background:#f8fafc;"><b>Categoria:</b></td><td width="32%">' . $g('ft_dep_categoria') . '</td></tr>'
            . '<tr><td style="background:#f8fafc;"><b>Alto rendimiento:</b></td><td>' . $g('ft_dep_alto_rend') . '</td>'
            . '<td style="background:#f8fafc;"><b>Entrenador:</b></td><td>' . $g('ft_dep_entrenador') . '</td></tr>'
            . '<tr><td style="background:#f8fafc;"><b>Arte competitivo:</b></td><td>' . $g('ft_dep_arte') . '</td>'
            . '<td style="background:#f8fafc;"><b>Club / Liga:</b></td><td>' . $g('ft_dep_club') . '</td></tr>'
            . '</table>';
    }

    // ---------- 3. MEDIDAS FISICAS Y SIGNOS VITALES ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">3. MEDIDAS FISICAS Y SIGNOS VITALES</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="10%" style="background:#f8fafc;"><b>Peso:</b></td><td width="10%">' . $g('ft_peso') . ' kg</td>'
        . '<td width="10%" style="background:#f8fafc;"><b>Talla:</b></td><td width="10%">' . $g('ft_talla') . ' m</td>'
        . '<td width="10%" style="background:#f8fafc;"><b>Estatura:</b></td><td width="10%">' . $g('ft_estatura') . '</td>'
        . '<td width="6%" style="background:#f8fafc;"><b>IMC:</b></td><td width="9%">' . $g('ft_imc') . '</td>'
        . '<td width="9%" style="background:#f8fafc;"><b>Temp:</b></td><td width="6%">' . $g('ft_temp') . '&deg;C</td>'
        . '<td width="9%" style="background:#f8fafc;"><b>FC/FR/TA:</b></td><td width="11%">' . $g('ft_fc') . ' / ' . $g('ft_fr') . ' / ' . $g('ft_ta') . '</td></tr>'
        . '</table>';

    // ---------- 4. IDENTIFICACION COMPLEMENTARIA ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">4. IDENTIFICACION COMPLEMENTARIA</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="14%" style="background:#f8fafc;"><b>Escolaridad:</b></td><td width="20%">' . $g('ft_id_escolaridad') . '</td>'
        . '<td width="12%" style="background:#f8fafc;"><b>Ocupacion:</b></td><td width="20%">' . $g('ft_id_ocupacion') . '</td>'
        . '<td width="12%" style="background:#f8fafc;"><b>Estado civil:</b></td><td width="22%">' . $g('ft_id_estado_civil') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Domicilio:</b></td><td colspan="3">' . $g('ft_id_domicilio') . '</td>'
        . '<td style="background:#f8fafc;"><b>Tel:</b></td><td>' . $g('ft_id_telefono') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Religion:</b></td><td>' . $g('ft_id_religion') . '</td>'
        . '<td style="background:#f8fafc;"><b>Tel. emergencia:</b></td><td>' . $g('ft_id_tel_emergencia') . '</td>'
        . '<td style="background:#f8fafc;"><b>Nacionalidad:</b></td><td>' . $g('ft_id_nacionalidad') . '</td></tr>'
        . '</table>';

    // ---------- 5. ANTECEDENTES PATOLOGICOS ----------
    $antPato = ['diabetes'=>'Diabetes','neurologica'=>'Neurologica','has'=>'HAS','neoplasias'=>'Neoplasias','cardiopatias'=>'Cardiopatias','reumaticas'=>'Reumaticas','respiratorias'=>'Respiratorias','geneticas'=>'Geneticas','endocrinologicas'=>'Endocrinologicas','infecciosas'=>'Infecciosas','accidentes'=>'Accidentes','hospitalizaciones'=>'Hospitalizaciones','traumatismos'=>'Traumatismos','fracturas'=>'Fracturas','cirugias'=>'Cirugias','alergias'=>'Alergias','otras'=>'Otras'];
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">5. ANTECEDENTES PATOLOGICOS Y HEREDOFAMILIARES</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="22%">Enfermedad</td><td width="8%" align="center">Si/No</td><td width="30%">Parentesco</td><td>Especifique</td></tr>';
    foreach ($antPato as $k => $lbl) {
        $sn = $d['ap_'.$k] ?? '-';
        $par = $d['ap_'.$k.'_parentesco'] ?? '';
        $esp = $d['ap_'.$k.'_esp'] ?? '';
        $html .= '<tr><td><b>' . $lbl . '</b></td>'
            . '<td align="center"><b>' . htmlspecialchars($sn) . '</b></td>'
            . '<td>' . htmlspecialchars($par !== '' ? $par : '-') . '</td>'
            . '<td>' . htmlspecialchars($esp !== '' ? $esp : '-') . '</td></tr>';
    }
    $html .= '</table>';

    // ---------- 6. ANTECEDENTES NO PATOLOGICOS ----------
    $antNo = ['toxicomanias'=>'Toxicomanias','inmunizaciones'=>'Inmunizaciones','automedicacion'=>'Automedicacion','sueno'=>'Trastornos del sueno','alimentacion'=>'Alimentacion','habitacion'=>'Habitacion','higiene'=>'Habitos higienicos','zoonosis'=>'Zoonosis','act_fisica'=>'Actividad fisica','ocupacion'=>'Ocupacion','ocio'=>'Actividades de ocio'];
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">6. ANTECEDENTES NO PATOLOGICOS</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Antecedente</td><td width="10%" align="center">Si/No</td><td>Especifique</td></tr>';
    foreach ($antNo as $k => $lbl) {
        $sn = $d['anp_'.$k] ?? '-';
        $esp = $d['anp_'.$k.'_esp'] ?? '';
        $html .= '<tr><td><b>' . $lbl . '</b></td>'
            . '<td align="center"><b>' . htmlspecialchars($sn) . '</b></td>'
            . '<td>' . htmlspecialchars($esp !== '' ? $esp : '-') . '</td></tr>';
    }
    $html .= '</table>';

    // ---------- 7. GINECO-OBSTETRICOS (si aplica) ----------
    if (!empty($d['ft_gineco_on'])) {
        $gin = ['menarca'=>'Menarca','dismenorreas'=>'Dismenorreas','gesta_actual'=>'Gesta actual','num_gestas'=>'Num. gestas','num_partos'=>'Num. partos','cesareas'=>'Cesareas','aborto'=>'Aborto','productos_vivos'=>'Productos vivos','menopausia'=>'Menopausia'];
        $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">7. ANTECEDENTES GINECO-OBSTETRICOS</div>';
        $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
        $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Antecedente</td><td width="10%" align="center">Si/No</td><td>Especifique</td></tr>';
        foreach ($gin as $k => $lbl) {
            $sn = $d['gin_'.$k] ?? '-';
            $esp = $d['gin_'.$k.'_esp'] ?? '';
            $html .= '<tr><td><b>' . $lbl . '</b></td><td align="center"><b>' . htmlspecialchars($sn) . '</b></td><td>' . htmlspecialchars($esp !== '' ? $esp : '-') . '</td></tr>';
        }
        $html .= '</table>';
    }

    // ---------- 8. PERINATALES (si aplica) ----------
    if (!empty($d['ft_peri_on'])) {
        $peri = ['num_embarazo'=>'No. embarazo','multiple'=>'Multiple','alim_embarazo'=>'Alim. embarazo','meds_vitaminas'=>'Meds/Vitaminas','control_perinatal'=>'Control perinatal','periodo_intrauterino'=>'Periodo intrauterino','parto_cesarea'=>'Parto/cesarea','problemas_embarazo'=>'Problemas embarazo','traumatismo'=>'Traumatismo','reanimacion'=>'Reanimacion','incubadora'=>'Incubadora','peso_medida_nino'=>'Peso/medida','tamiz_metabolico'=>'Tamiz metabolico','apgar'=>'APGAR'];
        $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">8. ANTECEDENTES PERINATALES</div>';
        $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
        $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Antecedente</td><td width="10%" align="center">Si/No</td><td>Especifique</td></tr>';
        foreach ($peri as $k => $lbl) {
            $sn = $d['peri_'.$k] ?? '-';
            $esp = $d['peri_'.$k.'_esp'] ?? '';
            $html .= '<tr><td><b>' . $lbl . '</b></td><td align="center"><b>' . htmlspecialchars($sn) . '</b></td><td>' . htmlspecialchars($esp !== '' ? $esp : '-') . '</td></tr>';
        }
        $html .= '</table>';
    }

    // ---------- 9. EXPLORACION FISICA - OBSERVACION ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">9. EXPLORACION FISICA - OBSERVACION</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="18%" style="background:#f8fafc;"><b>Facies:</b></td><td width="32%">' . $g('ef_facies') . '</td>'
        . '<td width="18%" style="background:#f8fafc;"><b>Actitud:</b></td><td width="32%">' . $g('ef_actitud') . '</td></tr>'
        . '</table>';

    $marcha = ['Libre','Claudicante','Con ayuda','Espastica','Ataxia','Otra'];
    $movilidad = ['Independiente','Dependiente','Silla de ruedas','Andadera','Muletas o baston','Otra'];
    $marchaTxt = []; foreach ($marcha as $i => $m) { if (($d['ef_marcha_'.$i] ?? '') === 'SI') $marchaTxt[] = $m; }
    $movilTxt  = []; foreach ($movilidad as $i => $m) { if (($d['ef_movilidad_'.$i] ?? '') === 'SI') $movilTxt[] = $m; }
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="18%" style="background:#f8fafc;"><b>Marcha:</b></td><td width="32%">' . ($marchaTxt ? htmlspecialchars(implode(', ', $marchaTxt)) : '-') . '</td>'
        . '<td width="18%" style="background:#f8fafc;"><b>Movilidad:</b></td><td width="32%">' . ($movilTxt ? htmlspecialchars(implode(', ', $movilTxt)) : '-') . '</td></tr>'
        . '</table>';

    // ---------- 10. DOLOR (EVA + SEMIOLOGIA) ----------
    $eva = (int)($d['eva_valor'] ?? 0);
    $colorEva = $eva <= 3 ? '#dcfce7' : ($eva <= 6 ? '#fef9c3' : '#fee2e2');
    $textColorEva = $eva <= 3 ? '#15803d' : ($eva <= 6 ? '#854d0e' : '#991b1b');
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">10. DOLOR (EVA) Y SEMIOLOGIA</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="18%" style="background:#f8fafc;"><b>Segmento evaluado:</b></td><td width="52%">' . $g('eva_segmento') . '</td>'
        . '<td width="14%" style="background:#f8fafc;"><b>EVA:</b></td>'
        . '<td width="16%" align="center" style="background:' . $colorEva . '; color:' . $textColorEva . '; font-size:11pt; font-weight:bold;">' . $eva . ' / 10</td></tr>'
        . '</table>';
    $semio = ['circunstancias'=>'Circunstancias','tipo'=>'Tipo','antiguedad'=>'Antiguedad','localizacion'=>'Localizacion','irradiacion'=>'Irradiacion','aumento'=>'Aumento','atenuantes'=>'Atenuantes','duracion'=>'Duracion','avd'=>'AVD limitadas'];
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Dato</td><td>Especificar</td></tr>';
    foreach ($semio as $k => $lbl) {
        $html .= '<tr><td><b>' . $lbl . '</b></td><td>' . $g('sem_'.$k) . '</td></tr>';
    }
    $html .= '</table>';

    // ---------- 11. INSPECCION POR SEGMENTOS (resumen alterados) ----------
    $craneo = ['Perimetro','Plano transversal','Plano longitudinal','Diametro','Borde occipital','Apofisis mastoides','ATM','Tub. masetero','Otro'];
    $cuello = ['Cartilago tiroides','Cartilago cricoides','Vallecula','Otro'];
    $pielS  = ['Dolor','Pigmentacion','Puntos de presion','Temperatura','Tumoracion','Acumulacion liquidos','Sensibilidad','Masas','Pulsaciones','Otro'];
    $altCraneo = []; foreach ($craneo as $i => $lbl) { if (($d['craneo_'.$i] ?? '') === 'ALTERADO') { $e = $d['craneo_esp_'.$i] ?? ''; $altCraneo[] = $lbl . ($e ? ' (' . $e . ')' : ''); } }
    $altCuello = []; foreach ($cuello as $i => $lbl) { if (($d['cuello_'.$i] ?? '') === 'ALTERADO') { $e = $d['cuello_esp_'.$i] ?? ''; $altCuello[] = $lbl . ($e ? ' (' . $e . ')' : ''); } }
    $altPiel   = []; foreach ($pielS  as $i => $lbl) { if (($d['piel_'.$i]   ?? '') === 'ALTERADO') { $e = $d['piel_esp_'.$i]   ?? ''; $altPiel[]   = $lbl . ($e ? ' (' . $e . ')' : ''); } }
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">11. INSPECCION Y PALPACION POR SEGMENTOS (alterados)</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="15%" style="background:#f8fafc;"><b>Craneo:</b></td><td>' . ($altCraneo ? htmlspecialchars(implode('; ', $altCraneo)) : 'Sin alteraciones') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Cuello:</b></td><td>' . ($altCuello ? htmlspecialchars(implode('; ', $altCuello)) : 'Sin alteraciones') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Piel:</b></td><td>' . ($altPiel ? htmlspecialchars(implode('; ', $altPiel)) : 'Sin alteraciones') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Obs.:</b></td><td>' . $gnl('obs_seg_inspeccion') . '</td></tr>'
        . '</table>';

    // ---------- 12. INSPECCION ESTATICA - POSTURA Y BIOTIPO ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">12. INSPECCION ESTATICA</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="18%" style="background:#f8fafc;"><b>Postura:</b></td><td width="32%">' . $g('ie_postura') . '</td>'
        . '<td width="18%" style="background:#f8fafc;"><b>Biotipo:</b></td><td width="32%">' . $g('ie_biotipo') . '</td></tr>'
        . '</table>';

    // ---------- 13. VISTAS (resumen de hallazgos SI) ----------
    $vaAntReg = ['Cabeza centrada','Incl. lateral cabeza','Rotacion cabeza','Claviculas simetricas','Hombros nivelados','Hombro D elevado','Hombro I elevado','Pectorales alineados','Tronco centrado','Incl. tronco','Rot. tronco','Alin. manos/brazos','Dedos en garra','Dedos en martillo','Caderas niveladas','Cadera D elevada','Cadera I elevada','Rotacion cadera','Rodillas niveladas','Genu varum','Genu valgum','Rotulas niveladas','Rotulas en rotacion','Angulo Q normal','Angulo Q incrementado','Rotacion tobillos','Inv. tobillos','Ev. tobillos','Alin. pies/dedos','Dedos en garra (pie)','Dedos en martillo (pie)','Hallux valgus'];
    $vaLatReg = ['Incl. cabeza','Rot. cabeza','Antepuls. cabeza','Retropuls. cabeza','Flex. tronco','Ext. tronco','Rot. tronco','Antepuls. hombros','Retropuls. hombros','Pecho en tonel','Pectus carinatum','Cifosis dorsal normal','Hipercifosis','Lordosis normal','Hiperlordosis','Rectificacion columna','Abdomen prominente','Incl. cadera/pelvis','Trocanter antepulsion','Trocanter retropulsion','Rodillas normales','Hiperext. rodillas','Flex. rodillas','Pie plano','Pie cavo'];
    $vaPosReg = ['Cabeza centrada','Incl. lateral cabeza','Rot. cabeza','Hombros nivelados','Hombro D elevado','Hombro I elevado','Escapulas alineadas','Escapulas aladas','Escoliosis','Espina bifida/meningocele','Tronco centrado','Incl. tronco','Rot. tronco','Alin. manos/brazos','Dedos en garra','Dedos en martillo','Caderas niveladas','Cadera D elevada','Cadera I elevada','Rotacion cadera','Huecos popliteos niv.','Genu varum','Genu valgum','Rotacion tobillos','Inv. tobillos','Ev. tobillos','Pies alineados'];
    $resumeVista = function($regs, $prefix) use ($d) {
        $si = [];
        foreach ($regs as $i => $lbl) {
            if (($d[$prefix.'_'.$i] ?? '') === 'SI') {
                $obs = $d[$prefix.'_obs_'.$i] ?? '';
                $si[] = $lbl . ($obs ? ' (' . $obs . ')' : '');
            }
        }
        return $si ? htmlspecialchars(implode('; ', $si)) : 'Sin hallazgos positivos';
    };
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">13. VISTAS ANTERIOR, LATERAL Y POSTERIOR (hallazgos positivos)</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="14%" style="background:#f8fafc;"><b>Anterior:</b></td><td>' . $resumeVista($vaAntReg, 'vantreg') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Lateral:</b></td><td>' . $resumeVista($vaLatReg, 'vlatreg') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Posterior:</b></td><td>' . $resumeVista($vaPosReg, 'vposreg') . '</td></tr>'
        . '</table>';

    // ---------- 14. MARCHA - ANALISIS CUANTITATIVO + TIPO ----------
    $tipoMarcha = ['Cerebelosa','Ataxia sensorial','Espastica','Parkinsoniana','Estepaje','Vestibular','Miopatica'];
    $tipoMarchaTxt = []; foreach ($tipoMarcha as $i => $t) { if (($d['tmar_'.$i] ?? '') === 'SI') $tipoMarchaTxt[] = $t; }
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">14. ANALISIS DE LA MARCHA</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">'
        . '<tr style="background:#f8fafc; font-weight:bold;"><td width="20%">Variable</td><td width="20%" align="center">Hombres</td><td width="20%" align="center">Mujeres</td><td width="20%" align="center">Pte. Der.</td><td width="20%" align="center">Pte. Izq.</td></tr>'
        . '<tr><td>Longitud del paso</td><td align="center">79 cm</td><td align="center">66 cm</td><td align="center">' . $g('cuant_paso_d') . '</td><td align="center">' . $g('cuant_paso_i') . '</td></tr>'
        . '<tr><td>Longitud zancada</td><td align="center">158 cm</td><td align="center">132 cm</td><td align="center">' . $g('cuant_zancada_d') . '</td><td align="center">' . $g('cuant_zancada_i') . '</td></tr>'
        . '<tr><td>Anchura de paso</td><td align="center">8.1 cm</td><td align="center">7.1 cm</td><td align="center">' . $g('cuant_anchura_d') . '</td><td align="center">' . $g('cuant_anchura_i') . '</td></tr>'
        . '<tr><td>Pasos por minuto</td><td align="center">117</td><td align="center">117</td><td align="center">' . $g('cuant_ppm_d') . '</td><td align="center">' . $g('cuant_ppm_i') . '</td></tr>'
        . '<tr><td>Angulo del pie</td><td align="center">7-10&deg;</td><td align="center">6&deg;</td><td align="center">' . $g('cuant_ang_d') . '</td><td align="center">' . $g('cuant_ang_i') . '</td></tr>'
        . '<tr><td>Velocidad</td><td align="center">1.54 m/s</td><td align="center">1.31 m/s</td><td align="center">' . $g('cuant_vel_d') . '</td><td align="center">' . $g('cuant_vel_i') . '</td></tr>'
        . '</table>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="18%" style="background:#f8fafc;"><b>Tipo de marcha:</b></td><td>' . ($tipoMarchaTxt ? htmlspecialchars(implode(', ', $tipoMarchaTxt)) : '-') . '</td></tr>'
        . '</table>';

    // ---------- 15-16. GONIOMETRIA (compactada) ----------
    $artSup = [
        'raquis_cervical' => ['Raquis cervical', ['Flexion','Extension','Inc. lat. der.','Inc. lat. izq.','Rot. izq.','Rot. der.']],
        'raquis_dorsolumbar' => ['Raquis dorsolumbar', ['Flexion','Extension','Inc. lat. izq.','Inc. lat. der.','Rot. izq.','Rot. der.']],
        'hombro' => ['Hombro', ['Flexion','Extension','Abduccion','Aduccion','Rot. interna','Rot. externa']],
        'codo' => ['Codo', ['Flexion','Extension','Pronacion','Supinacion']],
        'muneca' => ['Muneca', ['Flexion','Extension','Desv. radial','Desv. cubital']],
        'pulgar' => ['Pulgar', ['Abd. CMC','Ad. CMC','Op. CMC','Flex. MCF','Ext. MCF','Flex. IF','Ext. IF']],
        'dedos_mano' => ['Dedos mano', ['Flex. MCF','Ext. MCF','Flex. IFP','Ext. IFP','Flex. IFD','Ext. IFD']],
    ];
    $artInf = [
        'cadera' => ['Cadera', ['Flexion','Extension','Abduccion','Aduccion','Rot. interna','Rot. externa']],
        'rodilla' => ['Rodilla', ['Flexion','Extension']],
        'tobillo' => ['Tobillo', ['Flex. plantar','Flex. dorsal']],
        'subastragalina' => ['Subastragalina', ['Inversion','Eversion']],
        'hallux' => ['Hallux', ['Flex. MTTF','Ext. MTTF','Flex. IF','Ext. IF']],
        'dedos_pie' => ['Dedos pie', ['Flex. MTTF','Ext. MTTF','Flex. IFP','Ext. IFP','Flex. IFD','Ext. IFD']],
    ];
    $renderRom = function($prefix, $arts) use ($d, $g) {
        $html = '';
        foreach ($arts as $k => $art) {
            $html .= '<table cellpadding="2" border="1" style="font-size:6.5pt;">';
            $html .= '<tr style="background:#eceff1; font-weight:bold;"><td colspan="6">' . $art[0] . '</td></tr>';
            $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="40%">Movimiento</td><td width="15%" align="center">Izq. Inicial</td><td width="15%" align="center">Izq. Final</td><td width="15%" align="center">Der. Inicial</td><td width="15%" align="center">Der. Final</td><td></td></tr>';
            foreach ($art[1] as $i => $mov) {
                $n = $prefix . '_' . $k . '_' . $i;
                $html .= '<tr><td>' . $mov . '</td>'
                    . '<td align="center">' . $g($n.'_ii') . '</td>'
                    . '<td align="center">' . $g($n.'_if') . '</td>'
                    . '<td align="center">' . $g($n.'_di') . '</td>'
                    . '<td align="center">' . $g($n.'_df') . '</td><td></td></tr>';
            }
            $html .= '</table>';
        }
        return $html;
    };
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">15. GONIOMETRIA - EXTREMIDAD SUPERIOR</div>';
    $html .= $renderRom('rom_sup', $artSup);
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">16. GONIOMETRIA - EXTREMIDAD INFERIOR</div>';
    $html .= $renderRom('rom_inf', $artInf);

    // ---------- 17-18. DANIELS (compactada) ----------
    $musSup = [
        'cuello' => ['Cuello', ['Extension cervical','Flexion cervical','Rotacion cervical']],
        'tronco' => ['Tronco', ['Ext. lumbar','Ext. toracica','Elev. pelvica','Flexion','Rotacion']],
        'hombro' => ['Hombro', ['Flexion','Extension','Abduccion','Aduccion','Rot. externa','Rot. interna']],
        'codo' => ['Codo', ['Flexion','Extension','Pronacion','Supinacion']],
        'muneca' => ['Muneca', ['Flexion','Extension','Desv. radial','Desv. cubital']],
        'dedos' => ['Dedos mano', ['Flex. MCF','Flex. IFP','Flex. IFD','Ext. MCF','Abd. dedo','Ad. dedo','Flex. MCF pulgar','Flex. IF pulgar','Ext. MCF pulgar','Ext. IF pulgar','Abd. CMC pulgar']],
    ];
    $musInf = [
        'cadera' => ['Cadera', ['Flexion','Extension','Ext. asistida','Abduccion','Abd. y flexion','Aduccion','Rot. externa','Rot. interna']],
        'rodilla' => ['Rodilla', ['Flexion','Extension']],
        'tobillo' => ['Tobillo', ['Flex. plantar','Flex. plantar soleo','Flex. dorsal e inv.','Inversion','Ev. con flex. plantar','Ev. con flex. dorsal']],
        'dedos_pie' => ['Dedos pie', ['Flex. MTTF gordo','Flex. MTTF dedos','Flex. IF gordo','Flex. IF dedos','Ext. MTTF gordo','Ext. MTTF dedos','Ext. IF gordo','Ext. IF dedos']],
    ];
    $renderDan = function($prefix, $grupos) use ($d, $g) {
        $html = '';
        foreach ($grupos as $k => $gr) {
            $html .= '<table cellpadding="2" border="1" style="font-size:6.5pt;">';
            $html .= '<tr style="background:#eceff1; font-weight:bold;"><td colspan="5">' . $gr[0] . '</td></tr>';
            $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="40%">Movimiento</td><td width="15%" align="center">Inicial D</td><td width="15%" align="center">Inicial I</td><td width="15%" align="center">Final D</td><td width="15%" align="center">Final I</td></tr>';
            foreach ($gr[1] as $i => $mov) {
                $n = $prefix . '_' . $k . '_' . $i;
                $html .= '<tr><td>' . $mov . '</td>'
                    . '<td align="center">' . $g($n.'_id') . '</td>'
                    . '<td align="center">' . $g($n.'_ii') . '</td>'
                    . '<td align="center">' . $g($n.'_fd') . '</td>'
                    . '<td align="center">' . $g($n.'_fi') . '</td></tr>';
            }
            $html .= '</table>';
        }
        return $html;
    };
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">17. EVALUACION MUSCULAR (DANIELS) - EXTREMIDAD SUPERIOR</div>';
    $html .= $renderDan('dan_sup', $musSup);
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">18. EVALUACION MUSCULAR (DANIELS) - EXTREMIDAD INFERIOR</div>';
    $html .= $renderDan('dan_inf', $musInf);
    if (!empty($d['obs_musculares'])) {
        $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;"><tr><td width="20%" style="background:#f8fafc;"><b>Obs. musculares:</b></td><td>' . $gnl('obs_musculares') . '</td></tr></table>';
    }

    // ---------- 19. NEUROLOGICO: GLASGOW + MINI-MENTAL ----------
    $gO = (int)($d['gl_ocular'] ?? 0);
    $gV = (int)($d['gl_verbal'] ?? 0);
    $gM = (int)($d['gl_motora'] ?? 0);
    $gTot = $gO + $gV + $gM;
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">19. VALORACION NEUROLOGICA - FUNCIONES SUPERIORES</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr style="background:#f8fafc; font-weight:bold;"><td width="20%" align="center">Ocular (1-4)</td><td width="20%" align="center">Verbal (1-5)</td><td width="20%" align="center">Motora (1-6)</td><td width="20%" align="center">Total Glasgow</td><td width="20%" align="center">Mini-Mental</td></tr>'
        . '<tr><td align="center"><b>' . ($gO ?: '-') . '</b></td><td align="center"><b>' . ($gV ?: '-') . '</b></td><td align="center"><b>' . ($gM ?: '-') . '</b></td>'
        . '<td align="center" style="background:#e0f2f1; font-size:11pt;"><b>' . ($gTot ?: '-') . '</b></td>'
        . '<td align="center"><b>' . $g('minimental_pts') . '</b> - ' . $g('minimental_interp', '') . '</td></tr>'
        . '</table>';

    // ---------- 20. PARES CRANEALES ----------
    $pares = ['I. Olfatorio','II. Optico','III. Oculomotor','IV. Patetico','V. Trigemino','VI. Abducens','VII. Facial','VIII. Acustico-vestibular','IX. Glosofaringeo','X. Vago','XI. Espinal','XII. Hipogloso'];
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">20. PARES CRANEALES</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="30%">Par craneal</td><td width="15%" align="center">Estado</td><td>Observaciones</td></tr>';
    foreach ($pares as $i => $lbl) {
        $est = $d['par_'.$i] ?? '-';
        $obs = $d['par_obs_'.$i] ?? '';
        $html .= '<tr><td>' . $lbl . '</td><td align="center"><b>' . htmlspecialchars($est) . '</b></td><td>' . htmlspecialchars($obs ?: '-') . '</td></tr>';
    }
    $html .= '</table>';

    // ---------- 21. TONO MUSCULAR ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">21. TONO MUSCULAR</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="22%" style="background:#f8fafc;"><b>Ashworth:</b></td><td width="28%">' . $g('ashworth') . '</td>'
        . '<td width="22%" style="background:#f8fafc;"><b>Campbell:</b></td><td width="28%">' . $g('campbell') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Rigidez:</b></td><td>' . $g('rigidez') . '</td>'
        . '<td style="background:#f8fafc;"><b>Tono predominante:</b></td><td>' . $g('tono_predom') . '</td></tr>'
        . '</table>';

    // ---------- 22. REFLEJOS ----------
    $reflejos = ['Maseterino','Bicipital','Tricipital','Estilorradial','Cutaneo abdominal','Rotuliano','Aquiliano','Plantar'];
    $seidelLbl = ['0'=>'Arreflexia','1'=>'Hiporreflexia','2'=>'Normal','3'=>'Hiperreflexia','4'=>'Clonus'];
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">22. REFLEJOS OSTEOTENDINOSOS (SEIDEL)</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="30%">Reflejo</td><td width="15%" align="center">Grado</td><td>Interpretacion</td></tr>';
    foreach ($reflejos as $i => $lbl) {
        $v = $d['ref_'.$i] ?? '';
        $interp = isset($seidelLbl[$v]) ? $seidelLbl[$v] : '-';
        $html .= '<tr><td>' . $lbl . '</td><td align="center"><b>' . htmlspecialchars($v !== '' ? $v : '-') . '</b></td><td>' . $interp . '</td></tr>';
    }
    $html .= '</table>';

    // ---------- 23. ASIA (resumen + niveles) ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">23. ASIA - SENSITIVA Y MOTORA</div>';
    $dermatomas = ['C2','C3','C4','C5','C6','C7','C8','T1','T2','T3','T4','T5','T6','T7','T8','T9','T10','T11','T12','L1','L2','L3','L4','L5','S1','S2','S3','S4','S5'];
    $html .= '<table cellpadding="1" border="1" style="font-size:6pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="12%">Dermatoma</td>';
    foreach ($dermatomas as $dr) { $html .= '<td width="3%" align="center">' . $dr . '</td>'; }
    $html .= '</tr>';
    foreach (['tfi'=>'TF I','tfd'=>'TF D','ppi'=>'PP I','ppd'=>'PP D'] as $code => $hdr) {
        $html .= '<tr><td><b>' . $hdr . '</b></td>';
        foreach ($dermatomas as $dr) {
            $html .= '<td align="center">' . ($d['asia_s_'.$dr.'_'.$code] ?? '-') . '</td>';
        }
        $html .= '</tr>';
    }
    $html .= '</table>';
    $miotomas = ['C5'=>'Flex. codo','C6'=>'Ext. muneca','C7'=>'Ext. codo','C8'=>'Flex. dedos','T1'=>'Abd. menique','L2'=>'Flex. cadera','L3'=>'Flex. rodilla','L4'=>'Dorsiflex. tobillo','L5'=>'Ext. dedo gordo','S1'=>'Plantiflex. tobillo'];
    $html .= '<table cellpadding="2" border="1" style="font-size:6.5pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="10%">Miotoma</td><td width="40%">Musculos</td><td width="25%" align="center">Izquierda</td><td width="25%" align="center">Derecha</td></tr>';
    foreach ($miotomas as $k => $mus) {
        $html .= '<tr><td><b>' . $k . '</b></td><td>' . $mus . '</td>'
            . '<td align="center">' . ($d['asia_m_'.$k.'_i'] ?? '-') . '</td>'
            . '<td align="center">' . ($d['asia_m_'.$k.'_d'] ?? '-') . '</td></tr>';
    }
    $html .= '</table>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="20%" style="background:#f8fafc;"><b>Grado ASIA:</b></td><td colspan="3">' . $g('asia_grado') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Nivel sens. I/D:</b></td><td>' . $g('nivel_sens_i') . ' / ' . $g('nivel_sens_d') . '</td>'
        . '<td style="background:#f8fafc;"><b>Nivel mot. I/D:</b></td><td>' . $g('nivel_mot_i') . ' / ' . $g('nivel_mot_d') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>NNL:</b></td><td>' . $g('nnl') . '</td>'
        . '<td style="background:#f8fafc;"><b>Lesion:</b></td><td>' . $g('lesion_tipo') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>ZPP:</b></td><td colspan="3">Sens I/D: ' . $g('zpp_sens_i') . ' / ' . $g('zpp_sens_d') . ' | Mot I/D: ' . $g('zpp_mot_i') . ' / ' . $g('zpp_mot_d') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Obs:</b></td><td colspan="3">' . $gnl('asia_obs') . '</td></tr>'
        . '</table>';

    // ---------- 24-25. MANIOBRAS Y ESTUDIOS DE IMAGEN ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">24. MANIOBRAS, ESCALAS O TEST EXPLORATORIOS</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Nombre</td><td width="30%">Que evalua</td><td>Resultado</td></tr>';
    $manioCount = 0;
    for ($i = 0; $i < 5; $i++) {
        $n = $d['man_nombre_'.$i] ?? '';
        if (trim($n) === '') continue;
        $manioCount++;
        $html .= '<tr><td>' . htmlspecialchars($n) . '</td>'
            . '<td>' . htmlspecialchars($d['man_evalua_'.$i] ?? '') . '</td>'
            . '<td>' . htmlspecialchars($d['man_resultado_'.$i] ?? '') . '</td></tr>';
    }
    if (!$manioCount) $html .= '<tr><td colspan="3" align="center" style="color:#888;">Sin registros</td></tr>';
    $html .= '</table>';

    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">25. ESTUDIO DE IMAGEN Y EXAMENES COMPLEMENTARIOS</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt;">';
    $html .= '<tr style="background:#f8fafc; font-weight:bold;"><td width="30%">Tipo de examen</td><td width="25%">Proyeccion</td><td>Resultado y observaciones</td></tr>';
    $imgCount = 0;
    for ($i = 0; $i < 5; $i++) {
        $t = $d['img_tipo_'.$i] ?? '';
        if (trim($t) === '') continue;
        $imgCount++;
        $html .= '<tr><td>' . htmlspecialchars($t) . '</td>'
            . '<td>' . htmlspecialchars($d['img_proy_'.$i] ?? '') . '</td>'
            . '<td>' . htmlspecialchars($d['img_res_'.$i] ?? '') . '</td></tr>';
    }
    if (!$imgCount) $html .= '<tr><td colspan="3" align="center" style="color:#888;">Sin registros</td></tr>';
    $html .= '</table>';

    // ---------- 26. PLAN ANALITICO ----------
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">26. PLAN ANALITICO DE ATENCION EN REHABILITACION</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="22%" style="background:#f8fafc;"><b>Padecimiento actual:</b></td><td colspan="3">' . $gnl('plan_padecimiento') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Diagnostico CIF:</b></td><td colspan="3">' . $gnl('plan_dx_cif') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Pronostico:</b></td><td colspan="3">' . $gnl('plan_pronostico') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Objetivos generales:</b></td><td>' . $gnl('plan_obj_gen') . '</td>'
        . '<td style="background:#f8fafc;"><b>Objetivos especificos:</b></td><td>' . $gnl('plan_obj_esp') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Plan de tratamiento:</b></td><td colspan="3">' . $gnl('plan_tratamiento') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Total sesiones:</b></td><td>' . $g('plan_total_sesiones') . '</td>'
        . '<td style="background:#f8fafc;"><b>Sesiones / semana:</b></td><td>' . $g('plan_ses_semanales') . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Duracion (min):</b></td><td>' . $g('plan_duracion_min') . '</td>'
        . '<td style="background:#f8fafc;"><b>Obs. finales:</b></td><td>' . $gnl('plan_obs_finales') . '</td></tr>'
        . '</table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'FT', 'HISTORIA CLINICA DE FISIOTERAPIA Y REHABILITACION');
    return salvarPDF($pdf, 'fisioterapia', $idatencion);
}

// ============================================================
// Valoracion Rapida de Fisioterapia (formato reducido de 8 secciones)
// ============================================================
function generarPDFValoracionRapidaFT($idatencion, $json)
{
    if (!cargarTCPDF()) return null;

    $p = obtenerDatosPaciente($idatencion);
    $d = json_decode($json, true) ?? [];
    $emisor = _mspObtenerEmisor();
    $getVal = function($val) { return ($val !== '' && $val !== null) ? htmlspecialchars($val, ENT_QUOTES, 'UTF-8') : '-'; };
    $getNl  = function($val) { return ($val !== '' && $val !== null) ? nl2br(htmlspecialchars($val, ENT_QUOTES, 'UTF-8')) : '-'; };

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetCreator('Sistema Medico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional medico');
    $pdf->SetTitle('VALORACION RAPIDA DE FISIOTERAPIA');
    $pdf->SetMargins(10, 8, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->AddPage();

    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = _mspQrContent($idatencion, 'VALORACION RAPIDA DE FISIOTERAPIA', $emisor, $qrTimestamp);
    $estilo = _mspEstiloOficial();

    $html = $estilo . _mspCabeceraEmisor($emisor) . _mspIdentificacionPaciente($emisor, $p);
    $html .= '<table cellspacing="0"><tr><td class="section-band" style="text-align:center; font-size:11pt;">VALORACION RAPIDA DE FISIOTERAPIA</td></tr></table>';

    // 1. ANAMNESIS
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">1. ANAMNESIS Y ANTECEDENTES</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="50%" style="background:#f8fafc;"><b>Motivo y enfermedad actual:</b><br>' . $getNl($d['ft_motivo'] ?? '') . '</td>'
        . '<td width="25%" style="background:#f8fafc;"><b>Antecedentes Qx/Traum:</b><br>' . $getNl($d['ft_ant_quirurgicos'] ?? '') . '</td>'
        . '<td width="25%" style="background:#f8fafc;"><b>Ocupacion/Actividad:</b><br>' . $getNl($d['ft_ocupacion_actividad'] ?? '') . '</td></tr>'
        . '</table>';

    // 2. INSPECCION Y EXAMEN FISICO
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">2. INSPECCION Y EXAMEN FISICO INICIAL</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr style="background:#f8fafc; font-weight:bold; text-align:center;"><td width="33%">Inspeccion / Marcha</td><td width="33%">Piel y faneras</td><td width="34%">Palpacion / Tono</td></tr>'
        . '<tr><td height="40" style="vertical-align:top;">' . $getNl($d['ft_inspeccion'] ?? '') . '</td>'
        . '<td style="vertical-align:top;">' . $getNl($d['ft_piel'] ?? '') . '</td>'
        . '<td style="vertical-align:top;">' . $getNl($d['ft_palpacion'] ?? '') . '</td></tr>'
        . '</table>';

    // 3. DOLOR (EVA)
    $eva = (int)($d['ft_dolor_eva'] ?? 0);
    $colorEva = $eva <= 3 ? '#dcfce7' : ($eva <= 7 ? '#fef9c3' : '#fee2e2');
    $textColorEva = $eva <= 3 ? '#15803d' : ($eva <= 7 ? '#854d0e' : '#991b1b');
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">3. EVALUACION ANALOGICA DEL DOLOR (EVA)</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="20%" style="background:#f8fafc;"><b>Intensidad EVA:</b></td>'
        . '<td width="30%" align="center" style="font-size:11pt; font-weight:bold; background:' . $colorEva . '; color:' . $textColorEva . ';">' . $eva . ' / 10</td>'
        . '<td width="20%" style="background:#f8fafc;"><b>Topografia y comportamiento:</b></td>'
        . '<td width="30%">' . $getNl($d['ft_dolor_obs'] ?? '') . '</td></tr>'
        . '</table>';

    // 4. NEUROLOGICA Y SENSIBILIDAD
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">4. VALORACION NEUROLOGICA Y SENSIBILIDAD</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td style="background:#f8fafc;" width="20%"><b>Reflejos (ROT):</b></td>'
        . '<td colspan="3">'
        . 'BICIPITAL: <b>' . $getVal($d['rot_bicipital'] ?? '') . '</b> | '
        . 'ROTULIANO: <b>' . $getVal($d['rot_rotuliano'] ?? '') . '</b> | '
        . 'TRICIPITAL: <b>' . $getVal($d['rot_tricipital'] ?? '') . '</b> | '
        . 'AQUILIANO: <b>' . $getVal($d['rot_aquiliano'] ?? '') . '</b>'
        . '</td></tr>'
        . '<tr><td style="background:#f8fafc;"><b>Sensibilidad:</b></td><td colspan="3">' . $getNl($d['ft_sensibilidad'] ?? '') . '</td></tr>'
        . '</table>';

    // 5. ROM Y FUERZA (DANIELS)
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">5. VALORACION FUNCIONAL: ROM Y FUERZA MUSCULAR</div>';
    $html .= '<table cellpadding="2" border="1" style="font-size:7pt; text-align:center;">'
        . '<tr style="background:#f8fafc; font-weight:bold;"><td width="30%">Articulacion / Plano</td><td width="15%">Derecha (&deg;)</td><td width="15%">Izquierda (&deg;)</td><td width="40%">End-Feel / Hallazgo</td></tr>'
        . '<tr><td>Cervical (Flex/Ext)</td><td>' . $getVal($d['rom_1_r'] ?? '') . '</td><td>' . $getVal($d['rom_1_l'] ?? '') . '</td><td>' . $getVal($d['rom_1_obs'] ?? '') . '</td></tr>'
        . '<tr><td>Hombro (Flex/Abd)</td><td>' . $getVal($d['rom_2_r'] ?? '') . '</td><td>' . $getVal($d['rom_2_l'] ?? '') . '</td><td>' . $getVal($d['rom_2_obs'] ?? '') . '</td></tr>'
        . '<tr><td>Rodilla (Flex/Ext)</td><td>' . $getVal($d['rom_3_r'] ?? '') . '</td><td>' . $getVal($d['rom_3_l'] ?? '') . '</td><td>' . $getVal($d['rom_3_obs'] ?? '') . '</td></tr>'
        . '</table>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt; text-align:center;">'
        . '<tr style="background:#f8fafc; font-weight:bold;"><td width="25%">Flexores Cervicales</td><td width="25%">Extensores Lumbar</td><td width="25%">Fuerza MM.SS.</td><td width="25%">Fuerza MM.II.</td></tr>'
        . '<tr><td><b>' . $getVal($d['dan_1'] ?? '') . ' / 5</b></td><td><b>' . $getVal($d['dan_2'] ?? '') . ' / 5</b></td><td><b>' . $getVal($d['dan_3'] ?? '') . ' / 5</b></td><td><b>' . $getVal($d['dan_4'] ?? '') . ' / 5</b></td></tr>'
        . '</table>';

    // 6. POSTURAL Y EQUILIBRIO
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">6. ANALISIS POSTURAL Y EQUILIBRIO</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td width="50%" style="vertical-align:top;"><b>Examen Postural:</b><br>' . $getNl($d['ft_postura'] ?? '') . '</td>'
        . '<td width="50%" style="vertical-align:top;"><b>Equilibrio y Coordinacion:</b><br>' . $getNl($d['ft_equilibrio'] ?? '') . '</td></tr>'
        . '</table>';

    // 7. DIAGNOSTICO Y PRUEBAS ESPECIALES
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">7. DIAGNOSTICO FISIOTERAPEUTICO Y PRUEBAS ESPECIALES</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td style="vertical-align:top;"><b>Pruebas Especiales (Ortopedicas / Neurologicas):</b><br>' . $getNl($d['ft_pruebas_especiales'] ?? '') . '</td></tr>'
        . '<tr><td style="vertical-align:top;"><b>Diagnostico Funcional (CIF):</b><br><b>' . $getNl($d['ft_diagnostico_funcional'] ?? '') . '</b></td></tr>'
        . '</table>';

    // 8. PLAN DE INTERVENCION
    $html .= '<div class="section-band" style="padding:4px 6px; font-size:8.5pt;">8. PLAN DE INTERVENCION Y OBJETIVOS</div>';
    $html .= '<table cellpadding="3" border="1" style="font-size:7.5pt;">'
        . '<tr><td style="vertical-align:top;"><b>Medios fisicos:</b><br>' . $getNl($d['ft_electroterapia'] ?? '') . '</td></tr>'
        . '<tr><td style="vertical-align:top;"><b>Terapia manual y cinesiterapia:</b><br>' . $getNl($d['ft_terapia_manual'] ?? '') . '</td></tr>'
        . '<tr><td style="vertical-align:top;"><b>Objetivos terapeuticos (SMART):</b><br>' . $getNl($d['ft_objetivos'] ?? '') . '</td></tr>'
        . '<tr><td style="vertical-align:top;"><b>Sesiones planificadas:</b> ' . $getVal($d['ft_num_sesiones'] ?? '0') . ' sesiones estimadas.</td></tr>'
        . '</table>';

    $pdf->writeHTML($html, true, false, true, false, '');
    _mspPieFirmaConQR($pdf, $emisor, $qrContent, $qrTimestamp, $estilo, 'VR', 'VALORACION RAPIDA DE FISIOTERAPIA');
    return salvarPDF($pdf, 'fisio_rapida', $idatencion);
}