<?php
// GENERADOR DE PDF PARA MSP-033: HISTORIA CLÍNICA ODONTOLÓGICA (VERSIÓN 2.0 - VECTORIAL)
// Diseño Vectorial y Estricto del MSP

function generarPDFMsp033($idatencion, $json)
{
    // Carga segura de TCPDF
    if (function_exists('cargarTCPDF')) {
        if (!cargarTCPDF())
            die("Error al cargar TCPDF");
    } else {
        if (!class_exists('TCPDF')) {
            $cpanelSharedPath = '/home/' . get_current_user() . '/public_html/tcpdf/tcpdf.php';
            $rutas = ['../public/tcpdf/tcpdf.php', dirname(__DIR__) . '/public/tcpdf/tcpdf.php', $cpanelSharedPath];
            foreach ($rutas as $r)
                if (file_exists($r))
                    require_once($r);
        }
    }

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

    // ============================================================
    // CRÍTICO: NORMALIZACIÓN DE DATOS serializeArray
    // Convierte [{name: 'campo', value: 'valor'}] -> ['campo' => 'valor']
    // ============================================================
    if (is_array($d) && isset($d[0]['name']) && (isset($d[0]['value']) || array_key_exists('value', $d[0]))) {
        $d_assoc = [];
        foreach ($d as $item) {
            if (isset($item['name'])) {
                $val = $item['value'];
                if (substr($item['name'], -2) === '[]') {
                    $key = substr($item['name'], 0, -2);
                    $d_assoc[$key][] = $val;
                } else {
                    $d_assoc[$item['name']] = $val;
                }
            }
        }
        $d = $d_assoc;
    }

    // Emisor dinámico (cero hardcodeo, multi-tenant)
    $emisor = function_exists('_mspObtenerEmisor') ? _mspObtenerEmisor() : [
        'institucion'=>'', 'unidad'=>'', 'ruc'=>'', 'razon_social'=>'',
        'direccion'=>'', 'telefono'=>'', 'email'=>'',
        'profesional'=>'', 'especialidad'=>'', 'senescyt'=>'',
    ];

    $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 ODONTOLÓGICA - MSP 033');

    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetMargins(10, 10, 10);
    $pdf->SetAutoPageBreak(TRUE, 5);
    $pdf->SetFont('helvetica', '', 8);

    $pdf->AddPage();

    // ==========================================
    // 1. ENCABEZADO (sin logo MSP, datos dinámicos del emisor)
    // ==========================================
    $pdf->SetFont('helvetica', 'B', 11);
    $pdf->SetXY(10, 10);
    $cabTit = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $pdf->Cell(150, 5, strtoupper($cabTit) . ($emisor['ruc'] ? '   ·   RUC ' . $emisor['ruc'] : ''), 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 8);
    $pdf->SetXY(10, 15);
    $cabSub = trim(
        ($emisor['direccion'] ? $emisor['direccion'] : '')
        . ($emisor['telefono'] ? '  ·  Tel. ' . $emisor['telefono'] : '')
        . ($emisor['email'] ? '  ·  ' . $emisor['email'] : '')
    );
    $pdf->Cell(150, 4, $cabSub, 0, 1, 'L');

    $pdf->SetFont('helvetica', 'B', 13);
    $pdf->SetXY(10, 22);
    $pdf->Cell(150, 6, 'HISTORIA CLÍNICA ODONTOLÓGICA', 0, 1, 'L');

    $pdf->SetFont('helvetica', 'B', 16);
    $pdf->SetXY(170, 12);
    $pdf->SetFillColor(204, 204, 255); // violeta institucional MSP
    $pdf->Cell(30, 10, '033', 1, 1, 'C', 1);

    $pdf->Ln(10);

    // ==========================================
    // A. DATOS DEL PACIENTE (Tabla Rígida)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, 'A. DATOS DE IDENTIFICACIÓN', '#CCFFCC', '#000000');

    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->SetFillColor(245, 245, 245);

    // Fila 1 - INSTITUCIÓN y UNIDAD ahora dinámicos desde el emisor
    $pdf->Cell(35, 5, 'INSTITUCIÓN DEL SISTEMA:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(60, 5, strtoupper($emisor['institucion'] ?: '—'), 1, 0, 'L');

    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(35, 5, 'UNIDAD OPERATIVA:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(60, 5, strtoupper($emisor['unidad'] ?: '—'), 1, 1, 'L');

    // Fila 2
    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(35, 5, 'PACIENTE:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->Cell(95, 5, strtoupper($p['apaterno'] . ' ' . $p['amaterno'] . ' ' . $p['nombre']), 1, 0, 'L');

    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(30, 5, 'SEXO (M/F) / EDAD:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(30, 5, $p['sexo'] . ' / ' . $p['edad_completa'], 1, 1, 'C');

    // Fila 3
    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(35, 5, 'No. HISTORIA / CÉDULA:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(60, 5, $p['num_documento'], 1, 0, 'L');

    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(35, 5, 'LUGAR RESIDENCIA:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 7);
    $pdf->Cell(60, 5, substr($p['direccion'], 0, 45), 1, 1, 'L');

    $pdf->Ln(2);

    // ==========================================
    // 1. MOTIVO DE CONSULTA
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '1. MOTIVO DE CONSULTA', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', '', 9);
    $pdf->MultiCell(190, 8, $d['motivo_consulta_odonto'] ?? '', 1, 'L');
    $pdf->Ln(2);

    // ==========================================
    // 2. ENFERMEDAD O PROBLEMA ACTUAL (NUEVO)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '2. ENFERMEDAD O PROBLEMA ACTUAL', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', '', 7);
    $pdf->Cell(190, 4, 'Registrar síntomas, cronología, localización, características, intensidad, causa aparente, síntomas asociados, estado actual', 'LR', 1, 'L');
    $pdf->SetFont('helvetica', '', 9);
    $pdf->MultiCell(190, 10, $d['enfermedad_actual_odonto'] ?? '', 'LBR', 'J');
    $pdf->Ln(2);

    // ==========================================
    // 3. ANTECEDENTES (Renumerado)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '3. ANTECEDENTES PERSONALES Y FAMILIARES', '#E8F5E9', '#2E7D32');

    // Checkboxes simulados
    $pdf->SetFont('helvetica', '', 8);

    $lista1 = [
        'alergia_antibiotico' => '1. Alergia Antib.',
        'alergia_anestesia' => '2. Alergia Anest.',
        'hemorragias' => '3. Hemorragias',
        'vih' => '4. VIHSIDA'
    ];
    $lista2 = [
        'tuberculosis' => '5. Tuberculosis',
        'asma' => '6. Asma',
        'diabetes' => '7. Diabetes',
        'hipertension' => '8. Hipertensión'
    ];
    $lista3 = [
        'cardiopatia' => '9. Enf. Cardíaca',
        'otros_antecedentes_check' => '10. Otro'
    ];

    // Función helper para dibujar fila de checks
    function dibujarFilaChecks($pdf, $items, $data)
    {
        $pdf->SetFont('helvetica', '', 8);
        foreach ($items as $key => $label) {
            $val = isset($data[$key]) ? 'X' : ' ';
            $pdf->Cell(5, 5, $val, 1, 0, 'C');
            $pdf->Cell(35, 5, ' ' . $label, 0, 0, 'L');
        }
        $pdf->Ln();
    }

    dibujarFilaChecks($pdf, $lista1, $d);
    dibujarFilaChecks($pdf, $lista2, $d);
    dibujarFilaChecks($pdf, $lista3, $d);

    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 5, 'Otros Antecedentes / Medicación: ' . ($d['otros_antecedentes_odonto'] ?? ''), 'B', 1, 'L');
    $pdf->Ln(2);

    // ==========================================
    // 4. SIGNOS VITALES (Renumerado)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '4. SIGNOS VITALES', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(47, 5, 'PRESIÓN ARTERIAL', 1, 0, 'C', 1);
    $pdf->Cell(47, 5, 'FRECUENCIA CARDÍACA', 1, 0, 'C', 1);
    $pdf->Cell(47, 5, 'TEMPERATURA', 1, 0, 'C', 1);
    $pdf->Cell(49, 5, 'FRECUENCIA RESP.', 1, 1, 'C', 1);

    $pdf->SetFont('helvetica', '', 9);
    $pdf->Cell(47, 6, ($d['presion_arterial'] ?? '-') . ' mmHg', 1, 0, 'C');
    $pdf->Cell(47, 6, ($d['frecuencia_cardiaca'] ?? '-') . ' lpm', 1, 0, 'C');
    $pdf->Cell(47, 6, ($d['temperatura'] ?? '-') . ' °C', 1, 0, 'C');
    $pdf->Cell(49, 6, ($d['frecuencia_respiratoria'] ?? '-') . ' rpm', 1, 1, 'C');
    $pdf->Ln(2);

    // ==========================================
    // 5. EXAMEN ESTOMATOGNÁTICO (Renumerado)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '5. EXAMEN DEL SISTEMA ESTOMATOGNÁTICO', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', '', 7);
    // Lista de chequeo simple 1-12
    $patologias = [
        '1. Labios' => 'labios_patologia',
        '2. Mejillas' => 'mejillas_patologia',
        '3. Maxilar Sup' => 'maxilar_patologia',
        '4. Maxilar Inf' => 'maxilar_inf_patologia',
        '5. Lengua' => 'lengua_patologia',
        '6. Paladar' => 'paladar_patologia'
    ];
    $patologias2 = [
        '7. Piso' => 'piso_patologia',
        '8. Carrillos' => 'carrillos_patologia',
        '9. Glándulas' => 'glandulas_patologia',
        '10. Oro Faringe' => 'orofaringe_patologia',
        '11. A.T.M' => 'atm_patologia',
        '12. Ganglios' => 'ganglios_patologia'
    ];

    foreach ($patologias as $label => $key) {
        $v = isset($d[$key]) ? 'X' : ' ';
        $pdf->Cell(5, 5, $v, 1, 0, 'C');
        $pdf->Cell(25, 5, $label, 0, 0, 'L');
    }
    $pdf->Ln();
    foreach ($patologias2 as $label => $key) {
        $v = isset($d[$key]) ? 'X' : ' ';
        $pdf->Cell(5, 5, $v, 1, 0, 'C');
        $pdf->Cell(25, 5, $label, 0, 0, 'L');
    }
    $pdf->Ln();

    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 5, 'Descripción:', 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(190, 6, $d['examen_estomatognatico'] ?? '', 1, 'L');
    $pdf->Ln(2);

    // ==========================================
    // 6. ODONTOGRAMA (VECTORIAL AVANZADO)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '6. ODONTOGRAMA', '#E8F5E9', '#2E7D32');
    $pdf->Ln(1);

    // Coordenadas Iniciales
    $startX = 12;
    $startY = $pdf->GetY() + 14; // Mayor espacio para casillas superiores

    // Función de Dibujo Vectorial del Diente
    function dibujarDienteVectorial($pdf, $x, $y, $numero, $datosDiente, $esInferior)
    {
        // Dimensiones
        $s = 8;
        $bx = $x + 1;
        $by = $y + 1;

        // --- NÚMERO DE DIENTE ---
        $pdf->SetFont('helvetica', 'B', 6);
        if (!$esInferior) {
            // Superior: Número Arriba del diente
            $pdf->SetXY($x, $y - 3);
            $pdf->Cell(10, 3, $numero, 0, 0, 'C');
        } else {
            // Inferior: Número Debajo del diente
            $pdf->SetXY($x, $by + $s);
            $pdf->Cell(10, 3, $numero, 0, 0, 'C');
        }

        // --- CASILLAS RECESIÓN / MOVILIDAD ---
        $pdf->SetLineWidth(0.2);
        $pdf->SetDrawColor(0);

        if (!$esInferior) {
            // Superior: 
            // Movilidad encima del número (y-6)
            // Recesion encima de movilidad (y-9)
            $pdf->Rect($bx, $y - 6, $s, 3); // Movilidad
            $pdf->Rect($bx, $y - 9, $s, 3); // Recesion

            // Texto Valores (Centrado con Cell)
            $pdf->SetFont('helvetica', '', 5);
            $mov = $datosDiente['movilidad'] ?? '';
            $rec = $datosDiente['recesion'] ?? '';

            if ($mov !== '') {
                $pdf->SetXY($bx, $y - 6);
                $pdf->Cell($s, 3, $mov, 0, 0, 'C');
            }
            if ($rec !== '') {
                $pdf->SetXY($bx, $y - 9);
                $pdf->Cell($s, 3, $rec, 0, 0, 'C');
            }

        } else {
            // Inferior:
            // Movilidad debajo de numero -> $by+$s+3
            // Recesion debajo de movilidad -> $by+$s+6
            $pdf->Rect($bx, $by + $s + 3, $s, 3); // Movilidad
            $pdf->Rect($bx, $by + $s + 6, $s, 3); // Recesion

            // Texto Valores
            $pdf->SetFont('helvetica', '', 5);
            $mov = $datosDiente['movilidad'] ?? '';
            $rec = $datosDiente['recesion'] ?? '';

            if ($mov !== '') {
                $pdf->SetXY($bx, $by + $s + 3);
                $pdf->Cell($s, 3, $mov, 0, 0, 'C');
            }
            if ($rec !== '') {
                $pdf->SetXY($bx, $by + $s + 6);
                $pdf->Cell($s, 3, $rec, 0, 0, 'C');
            }
        }

        // Colores
        $getColor = function ($estado) {
            if ($estado == 'caries')
                return [211, 47, 47];
            if ($estado == 'obturado')
                return [25, 118, 210];
            return [255, 255, 255];
        };

        // Helper Poligonos relativos
        $drawPoly = function ($pts, $fillColor) use ($pdf, $bx, $by, $s) {
            $pdf->SetFillColor($fillColor[0], $fillColor[1], $fillColor[2]);
            $absPoly = [];
            for ($i = 0; $i < count($pts); $i += 2) {
                $absPoly[] = $bx + ($pts[$i] / 100 * $s);
                $absPoly[] = $by + ($pts[$i + 1] / 100 * $s);
            }
            $pdf->Polygon($absPoly, 'DF');
        };

        // --- DIBUJAR CARAS ---
        // Top
        $drawPoly([0, 0, 100, 0, 75, 25, 25, 25], $getColor($datosDiente['top'] ?? ''));
        // Bottom
        $drawPoly([25, 75, 75, 75, 100, 100, 0, 100], $getColor($datosDiente['bottom'] ?? ''));
        // Left
        $drawPoly([0, 0, 25, 25, 25, 75, 0, 100], $getColor($datosDiente['left'] ?? ''));
        // Right
        $drawPoly([100, 0, 100, 100, 75, 75, 75, 25], $getColor($datosDiente['right'] ?? ''));
        // Center
        $pdf->SetFillColor(...$getColor($datosDiente['center'] ?? ''));
        $pdf->Rect($bx + ($s * 0.25), $by + ($s * 0.25), $s * 0.5, $s * 0.5, 'DF');

        // --- SIMBOLOGÍA GLOBAL Y SUPERPUESTA ---
        $gen = $datosDiente['general'] ?? '';

        // 1. CORONA (Cuadrado Rojo Bordeando)
        if (strpos($gen, 'corona') !== false) {
            $pdf->SetLineWidth(0.4);
            $pdf->SetDrawColor(211, 47, 47); // Rojo
            $pdf->Rect($bx, $by, $s, $s, 'D');
            $pdf->SetDrawColor(0, 0, 0); // Reset
            $pdf->SetLineWidth(0.2);
        }

        // 2. EXTRACTIÓN (X Roja)
        if (strpos($gen, 'extraccion') !== false) {
            $pdf->SetLineWidth(0.4);
            $pdf->SetDrawColor(211, 47, 47);
            $pdf->Line($bx, $by, $bx + $s, $by + $s);
            $pdf->Line($bx + $s, $by, $bx, $by + $s);
            $pdf->SetDrawColor(0, 0, 0);
            $pdf->SetLineWidth(0.2);
        }

        // 3. PÉRDIDA POR CARIES (X Azul)
        if (strpos($gen, 'perdida-caries') !== false) {
            $pdf->SetLineWidth(0.4);
            $pdf->SetDrawColor(25, 118, 210); // Azul
            $pdf->Line($bx, $by, $bx + $s, $by + $s);
            $pdf->Line($bx + $s, $by, $bx, $by + $s);
            $pdf->SetDrawColor(0, 0, 0);
            $pdf->SetLineWidth(0.2);
        }

        // 4. PÉRDIDA OTRA CAUSA (X Roja encerrada en circulo)
        if (strpos($gen, 'perdida-otra') !== false) {
            $pdf->SetLineWidth(0.4);
            $pdf->SetDrawColor(211, 47, 47);
            $pdf->Line($bx, $by, $bx + $s, $by + $s);
            $pdf->Line($bx + $s, $by, $bx, $by + $s);
            $pdf->Circle($bx + $s / 2, $by + $s / 2, $s / 2 + 1, 0, 360, 'D');
            $pdf->SetDrawColor(0, 0, 0);
            $pdf->SetLineWidth(0.2);
        }

        // 5. AUSENTE (X Negra)
        if (strpos($gen, 'ausente') !== false) {
            $pdf->SetLineWidth(0.4);
            $pdf->SetDrawColor(50, 50, 50);
            $pdf->Line($bx, $by, $bx + $s, $by + $s);
            $pdf->Line($bx + $s, $by, $bx, $by + $s);
            $pdf->SetDrawColor(0, 0, 0);
            $pdf->SetLineWidth(0.2);
        }

        // 6. ENDODONCIA
        if (strpos($gen, 'endodoncia') !== false) {
            $pdf->SetFillColor(211, 47, 47);
            $pdf->Polygon([
                $bx + $s / 2,
                $by + $s * 0.2,
                $bx + $s * 0.8,
                $by + $s * 0.8,
                $bx + $s * 0.2,
                $by + $s * 0.8
            ], 'D', [], [211, 47, 47]);
        }

        // 7. PRÓTESIS (Total, Fija, Removible)
        // Check genérico primero para config global
        if (strpos($gen, 'protesis') !== false) {
            $pdf->SetDrawColor(211, 47, 47);
            $pdf->SetLineWidth(0.5);
            $m = 1.5;
            if (strpos($gen, 'protesis-fija') !== false) {
                $pdf->Line($bx - $m, $by - $m, $bx + ($s / 3), $by - $m);
                $pdf->Line($bx - $m, $by - $m, $bx - $m, $by + $s + $m);
                $pdf->Line($bx - $m, $by + $s + $m, $bx + ($s / 3), $by + $s + $m);

                $pdf->Line($bx + $s + $m, $by - $m, $bx + $s - ($s / 3), $by - $m);
                $pdf->Line($bx + $s + $m, $by - $m, $bx + $s + $m, $by + $s + $m);
                $pdf->Line($bx + $s + $m, $by + $s + $m, $bx + $s - ($s / 3), $by + $s + $m);
            }
            if (strpos($gen, 'protesis-removible') !== false) {
                $pdf->SetFont('helvetica', 'B', 14);
                $pdf->SetTextColor(211, 47, 47);
                $pdf->Text($bx - 2, $by - 1, '(');
                $pdf->Text($bx + $s - 1, $by - 1, ')');
                $pdf->SetTextColor(0);
            }
            if (strpos($gen, 'protesis-total') !== false) {
                $pdf->SetFont('helvetica', 'B', 14);
                $pdf->SetTextColor(211, 47, 47);
                $pdf->Text($bx + 1, $by - 2, '=');
                $pdf->SetTextColor(0);
            }
            $pdf->SetDrawColor(0);
            $pdf->SetLineWidth(0.2);
        }

        // 8. SELLANTES
        if (strpos($gen, 'sellante-nec') !== false) {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->SetFont('helvetica', 'B', 12);
            $pdf->Text($bx + $s / 2 - 1.5, $by + $s / 2 - 2, '*');
            $pdf->SetTextColor(0);
        }
        if (strpos($gen, 'sellante-rea') !== false) {
            $pdf->SetTextColor(25, 118, 210);
            $pdf->SetFont('helvetica', 'B', 12);
            $pdf->Text($bx + $s / 2 - 1.5, $by + $s / 2 - 2, '*');
            $pdf->SetTextColor(0);
        }
    }

    // Función Helper para obtener datos de un diente específico desde $d
    $getDienteData = function ($num) use ($d) {
        $base = 'diente_' . $num;
        return [
            'top' => $d[$base . '_top'] ?? '',
            'bottom' => $d[$base . '_bottom'] ?? '',
            'left' => $d[$base . '_left'] ?? '',
            'right' => $d[$base . '_right'] ?? '',
            'center' => $d[$base . '_center'] ?? '',
            'general' => $d[$base . '_general'] ?? '',
            'recesion' => $d[$base . '_recesion'] ?? '',
            'movilidad' => $d[$base . '_movilidad'] ?? ''
        ];
    };

    // ETIQUETAS LATERALES SUPERIORES (Alineadas con filas de cuadritos)
    $pdf->SetFont('helvetica', '', 5);
    $pdf->Text(2, $startY - 9 + 1.5, 'RECESIÓN');    // Alineado con fila de recesión
    $pdf->Text(2, $startY - 6 + 1.5, 'MOVILIDAD');   // Alineado con fila de movilidad
    $pdf->Text(2, $startY + 4, 'VESTIBULAR');        // Alineado con centro del diente

    // DIBUJAR ARCADA SUPERIOR (18-11 y 21-28)
    $currX = $startX;
    // Cuadrante 1 (18-11)
    for ($i = 18; $i >= 11; $i--) {
        dibujarDienteVectorial($pdf, $currX, $startY, $i, $getDienteData($i), false);
        $currX += 11; // Espacio entre dientes
    }
    $currX += 5; // Separador central
    // Cuadrante 2 (21-28)
    for ($i = 21; $i <= 28; $i++) {
        dibujarDienteVectorial($pdf, $currX, $startY, $i, $getDienteData($i), false);
        $currX += 11;
    }

    // Separator Arcadas (LINGUAL)
    $startY += 18;
    $pdf->SetFont('helvetica', 'B', 5);
    $pdf->Text(95, $startY - 2, 'LINGUAL');
    $pdf->Line(15, $startY - 3, 195, $startY - 3);

    // ETIQUETAS LATERALES INFERIORES (Alineadas con filas de cuadritos)
    $pdf->SetFont('helvetica', '', 5);
    $pdf->Text(2, $startY + 4, 'VESTIBULAR');        // Alineado con centro del diente
    $pdf->Text(2, $startY + 8 + 3 + 1.5, 'MOVILIDAD');   // Alineado con fila de movilidad (y+s+3+1.5, s=8)
    $pdf->Text(2, $startY + 8 + 6 + 1.5, 'RECESIÓN');    // Alineado con fila de recesión (y+s+6+1.5)

    // DIBUJAR ARCADA INFERIOR (48-41 y 31-38)
    $currX = $startX;
    // Cuadrante 4 (48-41)
    for ($i = 48; $i >= 41; $i--) {
        dibujarDienteVectorial($pdf, $currX, $startY, $i, $getDienteData($i), true);
        $currX += 11;
    }
    $currX += 5;
    // Cuadrante 3 (31-38)
    for ($i = 31; $i <= 38; $i++) {
        dibujarDienteVectorial($pdf, $currX, $startY, $i, $getDienteData($i), true);
        $currX += 11;
    }

    // Espacio suficiente para cajas inferiores (Tooth+Num+Mov+Rec ~ 20mm)
    $pdf->SetY($startY + 25);

    // ==========================================
    // 7. INDICADORES DE SALUD BUCAL Y 8. INDICES CPO-ceo (LAYOUT COMPACTO)
    // ==========================================

    // Guardar Y inicial para columnas
    $ySec7 = $pdf->GetY();

    // --- COLUMNA IZQUIERDA: 7. INDICADORES ---
    // Ancho total ~130mm
    $w7 = 135;

    // Titulo 7
    $pdf->SetFillColor(232, 245, 233);
    $pdf->SetTextColor(46, 125, 50);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell($w7, 6, '7. INDICADORES DE SALUD BUCAL', 1, 0, 'L', 1);
    $pdf->SetTextColor(0);

    // Estructura Tabla 7
    // Subheaders
    $pdf->SetXY(15, $ySec7 + 6);
    $pdf->SetFont('helvetica', 'B', 6);
    $pdf->Cell(55, 4, 'HIGIENE ORAL SIMPLIFICADA', 1, 0, 'C');
    $pdf->Cell(30, 4, 'ENFERMEDAD', 1, 0, 'C'); // Periodontal
    $pdf->Cell(25, 4, 'MAL OCLUSIÓN', 1, 0, 'C');
    $pdf->Cell(25, 4, 'FLUOROSIS', 1, 0, 'C');

    // Sub-subheaders
    $pdf->SetXY(15, $ySec7 + 10);
    $pdf->Cell(25, 8, 'PIEZAS DENTALES', 1, 0, 'C'); // Spanning 2 rows visual
    $pdf->Cell(15, 4, 'PLACA', 1, 0, 'C');
    $pdf->Cell(15, 4, 'CÁLCULO', 1, 0, 'C');

    $pdf->Cell(30, 4, 'PERIODONTAL', 1, 0, 'C'); // Sub header 2
    $pdf->Cell(25, 4, '', 1, 0, 'C'); // Empty spacer for logic alignment
    $pdf->Cell(25, 4, '', 1, 0, 'C'); // Empty spacer

    // Row 3 (Values labels)
    $pdf->SetXY(40, $ySec7 + 14);
    $pdf->Cell(15, 4, '0-1-2-3', 1, 0, 'C');
    $pdf->Cell(15, 4, '0-1-2-3', 1, 0, 'C');

    // Side Columns Content (Periodontal, Maloclusion, Fluorosis)
    // We will draw these as a separate block to right of Higiene table

    // --- TABLA HIGIENE ORAL (Left most) ---
    $xH = 15;
    $yH = $ySec7 + 18;
    $pdf->SetFont('helvetica', '', 7);

    $piezas = [
        ['16', '17', '55'],
        ['11', '21', '61'],
        ['26', '27', '65'],
        ['36', '37', '85'],
        ['31', '41', '81'],
        ['46', '47', '75']
    ];

    // Rows
    for ($i = 0; $i < 6; $i++) {
        $pdf->SetXY($xH, $yH + ($i * 4));
        // Piezas Cells
        $pdf->Cell(8, 4, $piezas[$i][0], 1, 0, 'C');
        $pdf->Cell(9, 4, $piezas[$i][1], 1, 0, 'C');
        $pdf->Cell(8, 4, $piezas[$i][2], 1, 0, 'C');

        // Data Inputs
        $placa = $d['placa_' . ($i + 1)] ?? '';
        $calculo = $d['calc_' . ($i + 1)] ?? '';

        $pdf->Cell(15, 4, $placa, 1, 0, 'C');
        $pdf->Cell(15, 4, $calculo, 1, 0, 'C');
    }

    // Totales Row
    $pdf->SetXY($xH, $yH + 24);
    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(25, 4, 'TOTALES', 1, 0, 'C');
    $pdf->Cell(15, 4, $d['placa_total'] ?? '', 1, 0, 'C');
    $pdf->Cell(15, 4, $d['calc_total'] ?? '', 1, 0, 'C');

    // --- COLUMNAS DE CHECKBOXES (Right of Higiene) ---
    // Periodontal
    $xP = 70;
    $yP = $ySec7 + 14;
    $pdf->SetXY($xP, $yP);
    $pdf->SetFont('helvetica', '', 6);

    // Helper Checkbox Row
    $drawCheckRow = function ($pdf, $x, $y, $label, $checked) {
        $pdf->SetXY($x, $y);
        $pdf->Cell(24, 6, $label, 1, 0, 'L');
        $pdf->Cell(6, 6, $checked ? 'X' : '', 1, 0, 'C');
    };

    // Periodontal
    $per = $d['periodontal'] ?? '';
    $drawCheckRow($pdf, $xP, $yP, 'LEVE', $per == 'leve');
    $drawCheckRow($pdf, $xP, $yP + 6, 'MODERADA', $per == 'mod');
    $drawCheckRow($pdf, $xP, $yP + 12, 'SEVERA', $per == 'sev');

    // Maloclusion
    $xM = 100;
    $mal = $d['maloclusion'] ?? '';
    $drawCheckRow($pdf, $xM, $yP, 'ANGLE I', $mal == 'angle1');
    $drawCheckRow($pdf, $xM, $yP + 6, 'ANGLE II', $mal == 'angle2');
    $drawCheckRow($pdf, $xM, $yP + 12, 'ANGLE III', $mal == 'angle3');

    // Fluorosis
    $xF = 130;
    $flu = $d['fluorosis'] ?? '';
    $drawCheckRow($pdf, $xF, $yP, 'LEVE', $flu == 'leve');
    $drawCheckRow($pdf, $xF, $yP + 6, 'MODERADA', $flu == 'mod');
    $drawCheckRow($pdf, $xF, $yP + 12, 'SEVERA', $flu == 'sev');


    // --- COLUMNA DERECHA: 8. INDICES CPO-ceo ---
    $x8 = 160; // Start X for section 8
    $w8 = 45; // Width

    $pdf->SetXY($x8, $ySec7);
    $pdf->SetFillColor(232, 245, 233);
    $pdf->SetTextColor(46, 125, 50);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(35, 6, '8. INDICES CPO-ceo', 1, 0, 'L', 1); // Titulo recortado visualmente
    $pdf->SetTextColor(0);

    // Tabla CPO
    $yT8 = $ySec7 + 6;
    $pdf->SetXY($x8, $yT8);
    $pdf->SetFont('helvetica', 'B', 7);

    // Headers
    $pdf->Cell(7, 6, '', 1, 0); // Empty corner
    $pdf->Cell(7, 6, 'C', 1, 0, 'C');
    $pdf->Cell(7, 6, 'P', 1, 0, 'C');
    $pdf->Cell(7, 6, 'O', 1, 0, 'C');
    $pdf->Cell(7, 6, 'TOT', 1, 0, 'C');

    // Row D (CPO)
    $pdf->SetXY($x8, $yT8 + 6);
    $pdf->Cell(7, 6, 'D', 1, 0, 'C');
    $pdf->SetFont('helvetica', '', 7);
    $pdf->Cell(7, 6, $d['cpod_c'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['cpod_p'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['cpod_o'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['cpod_total'] ?? '', 1, 0, 'C');

    // Headers ceo
    $pdf->SetXY($x8, $yT8 + 12);
    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->Cell(7, 6, '', 1, 0);
    $pdf->Cell(7, 6, 'c', 1, 0, 'C');
    $pdf->Cell(7, 6, 'e', 1, 0, 'C');
    $pdf->Cell(7, 6, 'o', 1, 0, 'C');
    $pdf->Cell(7, 6, 'TOT', 1, 0, 'C');

    // Row d (ceo)
    $pdf->SetXY($x8, $yT8 + 18);
    $pdf->Cell(7, 6, 'd', 1, 0, 'C');
    $pdf->SetFont('helvetica', '', 7);
    $pdf->Cell(7, 6, $d['ceod_c'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['ceod_e'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['ceod_o'] ?? '', 1, 0, 'C');
    $pdf->Cell(7, 6, $d['ceod_total'] ?? '', 1, 0, 'C');

    // Mover cursor abajo de todo lo dibujado (la tabla más alta es la 7, ~36mm altura total desde ySec7)
    $pdf->SetY($ySec7 + 42);

    // ==========================================
    // 9. SIMBOLOGÍA DEL ODONTOGRAMA (LEYENDA GRÁFICA)
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '9. SIMBOLOGÍA DEL ODONTOGRAMA', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', '', 7);

    // Coordenadas base
    $bX = 15;
    $bY = $pdf->GetY() + 2;
    $hLine = 6;

    // Función helper para dibujar item de leyenda
    $drawLegendItem = function ($pdf, $x, $y, $symbolType, $label) {
        $pdf->SetXY($x, $y);
        // Dibujar Simbolo
        if ($symbolType == 'sellante_nec') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y, '*');
        }
        if ($symbolType == 'sellante_rea') {
            $pdf->SetTextColor(25, 118, 210);
            $pdf->Text($x, $y, '*');
        }
        if ($symbolType == 'extraccion') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y + 1, 'X');
        }
        if ($symbolType == 'perdida_caries') {
            $pdf->SetTextColor(25, 118, 210);
            $pdf->Text($x, $y + 1, 'X');
        }
        if ($symbolType == 'perdida_otra') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y + 1, '(X)');
        } // Simplificado
        if ($symbolType == 'endodoncia') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y, '▲');
        }
        if ($symbolType == 'corona') {
            $pdf->SetDrawColor(211, 47, 47);
            $pdf->Rect($x, $y + 1, 4, 4);
        }
        if ($symbolType == 'fija') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y, '[  ]');
        }
        if ($symbolType == 'removible') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y, '(  )');
        }
        if ($symbolType == 'total') {
            $pdf->SetTextColor(211, 47, 47);
            $pdf->Text($x, $y + 1, '=');
        }
        if ($symbolType == 'obturado') {
            $pdf->SetFillColor(25, 118, 210);
            $pdf->Circle($x + 2, $y + 3, 1.5, 0, 360, 'F');
        }
        if ($symbolType == 'caries') {
            $pdf->SetFillColor(211, 47, 47);
            $pdf->Circle($x + 2, $y + 3, 1.5, 0, 360, 'F');
        }

        $pdf->SetTextColor(0);
        $pdf->SetDrawColor(0);
        $pdf->SetXY($x + 8, $y + 1);
        $pdf->Cell(40, 4, $label, 0, 0, 'L');
    };

    // Columna 1
    $drawLegendItem($pdf, $bX, $bY, 'sellante_nec', 'SELLANTE NECESARIO');
    $drawLegendItem($pdf, $bX, $bY + $hLine, 'sellante_rea', 'SELLANTE REALIZADO');
    $drawLegendItem($pdf, $bX, $bY + ($hLine * 2), 'extraccion', 'EXTRACCIÓN INDICADA');
    $drawLegendItem($pdf, $bX, $bY + ($hLine * 3), 'perdida_caries', 'PÉRDIDA POR CARIES');

    // Columna 2
    $bX2 = $bX + 60;
    $drawLegendItem($pdf, $bX2, $bY, 'perdida_otra', 'PÉRDIDA (OTRA CAUSA)');
    $drawLegendItem($pdf, $bX2, $bY + $hLine, 'endodoncia', 'ENDODONCIA');
    $drawLegendItem($pdf, $bX2, $bY + ($hLine * 2), 'fija', 'PRÓTESIS FIJA');
    $drawLegendItem($pdf, $bX2, $bY + ($hLine * 3), 'removible', 'PRÓTESIS REMOVIBLE');

    // Columna 3
    $bX3 = $bX2 + 60;
    $drawLegendItem($pdf, $bX3, $bY, 'total', 'PRÓTESIS TOTAL');
    $drawLegendItem($pdf, $bX3, $bY + $hLine, 'corona', 'CORONA');
    $drawLegendItem($pdf, $bX3, $bY + ($hLine * 2), 'obturado', 'OBTURADO');
    $drawLegendItem($pdf, $bX3, $bY + ($hLine * 3), 'caries', 'CARIES');

    $pdf->SetY($bY + ($hLine * 4) + 2);

    // ==========================================
    // 10. PLANES
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '10. PLANES DE DIAGNÓSTICO, TERAPÉUTICO Y EDUCACIONAL', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', '', 8);
    // Checks
    $chkBio = isset($d['plan_biometria']) ? 'X' : ' ';
    $chkQui = isset($d['plan_quimica']) ? 'X' : ' ';
    $chkRay = isset($d['plan_rayos']) ? 'X' : ' ';
    $chkOtr = isset($d['plan_otros']) ? 'X' : ' ';

    $pdf->Cell(25, 6, 'Biometría: [' . $chkBio . ']', 0, 0);
    $pdf->Cell(35, 6, 'Química Sang.: [' . $chkQui . ']', 0, 0);
    $pdf->Cell(25, 6, 'Rayos-X: [' . $chkRay . ']', 0, 0);
    $pdf->Cell(25, 6, 'Otros: [' . $chkOtr . ']', 0, 1);

    $pdf->MultiCell(190, 8, $d['plan_descripcion'] ?? '', 1, 'L');
    $pdf->Ln(2);

    // ==========================================
    // 11. DIAGNÓSTICO
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '11. DIAGNÓSTICO', '#E8F5E9', '#2E7D32');
    $pdf->SetFont('helvetica', 'B', 7);
    $pdf->SetFillColor(240, 240, 240);
    $pdf->Cell(10, 5, 'No', 1, 0, 'C', 1);
    $pdf->Cell(130, 5, 'DIAGNÓSTICO DESCRIPTIVO', 1, 0, 'C', 1);
    $pdf->Cell(20, 5, 'CIE', 1, 0, 'C', 1);
    $pdf->Cell(15, 5, 'PRE', 1, 0, 'C', 1);
    $pdf->Cell(15, 5, 'DEF/REP', 1, 1, 'C', 1);

    $pdf->SetFont('helvetica', '', 7);
    // Decodificar JSON de diagnósticos dinámicos (ROBUSTO)
    $diagnosticos = [];
    if (isset($d['diagnosticos']) && !empty($d['diagnosticos'])) {
        $raw = $d['diagnosticos'];

        // 1. Intento directo
        $jsonDiags = json_decode($raw, true);

        // 2. Si falla, intentar stripslashes (común en serializaciones dobles)
        if (json_last_error() !== JSON_ERROR_NONE) {
            $temp = stripslashes($raw);
            $jsonDiags = json_decode($temp, true);
        }

        // 3. Si falla, html_entity_decode
        if (json_last_error() !== JSON_ERROR_NONE) {
            $temp = html_entity_decode($raw);
            $jsonDiags = json_decode($temp, true);
        }

        if (json_last_error() === JSON_ERROR_NONE && is_array($jsonDiags)) {
            $diagnosticos = $jsonDiags;
        } else {
            // Log de error específico si sigue fallando
            file_put_contents(__DIR__ . '/debug_msp033_error.log', "Error JSON Diags: " . json_last_error_msg() . "\nRaw: " . $raw);
        }
    }

    // Rellenar hasta 4 filas mínimo para mantener estructura visual
    $totalRows = max(4, count($diagnosticos));

    $pdf->SetFont('helvetica', '', 7);

    for ($i = 0; $i < $totalRows; $i++) {
        $diag = $diagnosticos[$i] ?? null;

        // Datos del diagnóstico (Soportando estructura del partials/diagnostics.php)
        // Estructura esperada: codigo, enfermedad, tipo (PRE/DEF)
        $desc = $diag ? ($diag['enfermedad'] ?? '') : '';
        $cie = $diag ? ($diag['codigo'] ?? '') : '';
        $tipo = $diag ? ($diag['tipo'] ?? '') : '';

        // Fallback a campos antiguos si no hay JSON y es un índice bajo
        if (!$diag && $i < 4) {
            $idx = $i + 1;
            if (isset($d["diag_{$idx}_desc"]) && !empty($d["diag_{$idx}_desc"])) {
                $desc = $d["diag_{$idx}_desc"];
                $cie = $d["diag_{$idx}_cie"];
                $tipo = $d["diag_{$idx}_kind"];
            }
        }

        $pre = (strtoupper($tipo) == 'PRE' || strtoupper($tipo) == 'PRESUNTIVO') ? 'X' : '';
        $def = (strtoupper($tipo) == 'DEF' || strtoupper($tipo) == 'DEFINITIVO') ? 'X' : '';
        $rep = (strpos(strtoupper($tipo), 'REP') !== false) || (strtoupper($tipo) == 'REPETITIVO') ? 'R' : '';

        $pdf->Cell(10, 5, $i + 1, 1, 0, 'C');
        $pdf->Cell(130, 5, substr($desc, 0, 75), 1, 0, 'L'); // Truncar si es muy largo
        $pdf->Cell(20, 5, $cie, 1, 0, 'C');
        $pdf->Cell(15, 5, $pre, 1, 0, 'C');
        $pdf->Cell(15, 5, ($def ? 'X' : ($rep ? 'R' : '')), 1, 1, 'C');
    }
    $pdf->Ln(2);

    // ==========================================
    // 12. TRATAMIENTO
    // ==========================================
    dibujarTituloSeccionMSP033($pdf, '12. TRATAMIENTO', '#E8F5E9', '#2E7D32');

    $pdf->SetFont('helvetica', 'B', 6);
    $pdf->SetFillColor(240, 240, 240);
    $pdf->Cell(10, 6, 'SESIÓN', 1, 0, 'C', 1);
    $pdf->Cell(15, 6, 'FECHA', 1, 0, 'C', 1);
    $pdf->Cell(45, 6, 'DIAGNÓSTICOS Y COMPL.', 1, 0, 'C', 1);
    $pdf->Cell(45, 6, 'PROCEDIMIENTOS', 1, 0, 'C', 1);
    $pdf->Cell(40, 6, 'PRESCRIPCIONES', 1, 0, 'C', 1);
    $pdf->Cell(35, 6, 'CÓDIGO Y FIRMA', 1, 1, 'C', 1);

    $pdf->SetFont('helvetica', '', 6);

    if (isset($d['trat_sesion']) && is_array($d['trat_sesion'])) {
        for ($k = 0; $k < count($d['trat_sesion']); $k++) {
            // Calcular altura maxima de fila
            $diag = $d['trat_diag'][$k] ?? '';
            $proc = $d['trat_proc'][$k] ?? '';
            $presc = $d['trat_presc'][$k] ?? '';

            // Usar MultiCell simulado o Cell simple truncado? MultiCell es mejor para texto largo.
            // Pero MultiCell en tabla requiere coordinar alturas. Usaremos single line height fixed por ahora o Cell que trunque.
            // Para "Pixel Perfect" ideal es MultiCell. Pero si es complejo de alinear, usar Cell.
            // User Image 3 shows rows with some height.
            // Usaremos MultiCell simple logic: max num lines.

            $h = 8; // Altura fija fila
            $pdf->Cell(10, $h, $d['trat_sesion'][$k], 1, 0, 'C');
            $pdf->Cell(15, $h, $d['trat_fecha'][$k], 1, 0, 'C');

            // Cells manuales para texto largo
            $x = $pdf->GetX();
            $y = $pdf->GetY();
            $pdf->MultiCell(45, $h, $diag, 1, 'L');
            $pdf->SetXY($x + 45, $y);

            $pdf->MultiCell(45, $h, $proc, 1, 'L');
            $pdf->SetXY($x + 90, $y);

            $pdf->MultiCell(40, $h, $presc, 1, 'L');
            $pdf->SetXY($x + 130, $y);

            $pdf->Cell(35, $h, $d['trat_firma'][$k] ?? '', 1, 1, 'C');

            // Si multicell salta linea internamente, el layout se rompe si no controlamos Y.
            // Con altura fija y Multicell en modo caja 1, corta texto si excede.
            // Aseguramos Y para siguiente fila.
            // Check page break
            if ($pdf->GetY() > 270) {
                $pdf->AddPage();
            }
        }
    } else {
        $pdf->Cell(190, 6, 'Sin tratamiento registrado', 1, 1, 'C');
    }

    // ==========================================
    // PIE: FIRMA ELECTRÓNICA SIMULADA CON QR (sin tocar firma digital)
    // ==========================================
    $qrTimestamp = date('Y-m-d H:i:s');
    $qrContent = function_exists('_mspQrContent')
        ? _mspQrContent($idatencion, 'MSP-033 Odontología', $emisor, $qrTimestamp)
        : "FIRMA ELECTRONICA SIMULADA · MSP-033 · #{$idatencion} · {$qrTimestamp}";

    $pdf->Ln(4);
    $yPie = $pdf->GetY();

    // Bloque del pie con QR (coordenadas absolutas)
    $pdf->SetFillColor(204, 255, 204); // verde menta
    $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');

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

    // Texto al lado del QR
    $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);
    $pdf->SetFont('helvetica', '', 8);

    // Línea final HCU-form
    $pdf->Ln(4);
    $pdf->SetXY(10, $pdf->GetY());
    $pdf->Cell(95, 5, 'SNS-MSP / HCU-form.033 / 2008', 0, 0, 'L');
    $pdf->Cell(95, 5, 'HISTORIA CLÍNICA ODONTOLÓGICA', 0, 1, 'R');

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

function dibujarTituloSeccionMSP033($pdf, $texto, $bg, $border)
{
    if ($pdf->GetY() > 270)
        $pdf->AddPage();
    $pdf->SetFillColor(232, 245, 233);
    $pdf->SetLineStyle(array('width' => 0.5, 'color' => array(46, 125, 50)));
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->SetTextColor(46, 125, 50);
    $pdf->Cell(190, 6, '  ' . $texto, 'L', 1, 'L', 1);
    $pdf->SetTextColor(0);
    $pdf->SetLineStyle(array('width' => 0.2, 'color' => array(0, 0, 0)));
}
?>