<?php
// =============================================================================
// GENERADOR PDF - ARMONIZACION OROFACIAL (FMA Pro v2)
// Tipo_formato: ARMONIZACION
// Llamado desde el wrapper en generar_pdf_msp.php (case 'ARMONIZACION').
// =============================================================================

function generarPDFArmonizacion($idatencion, $json)
{
    if (function_exists('cargarTCPDF')) {
        if (!cargarTCPDF()) { return null; }
    } elseif (!class_exists('TCPDF')) {
        return null;
    }

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

    // Normalizacion: si llega como array de {name,value} (serializeArray)
    if (is_array($d) && isset($d[0]['name']) && array_key_exists('value', $d[0])) {
        $d_assoc = [];
        foreach ($d as $item) {
            if (!isset($item['name'])) continue;
            $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 = function_exists('_mspObtenerEmisor') ? _mspObtenerEmisor() : [
        'institucion'=>'', 'unidad'=>'', 'ruc'=>'', 'razon_social'=>'',
        'direccion'=>'', 'telefono'=>'', 'email'=>'',
        'profesional'=>'', 'especialidad'=>'', 'senescyt'=>'',
    ];

    $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;
    };

    // =========================================================================
    // PDF SETUP
    // =========================================================================
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('Sistema Medico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional medico');
    $pdf->SetTitle('Armonizacion Orofacial - FMA Pro');
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetMargins(10, 10, 10);
    $pdf->SetAutoPageBreak(TRUE, 12);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->AddPage();

    // =========================================================================
    // CABECERA (institucion + datos paciente)
    // =========================================================================
    $cabTit = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $pdf->SetFont('helvetica', 'B', 11);
    $pdf->SetXY(10, 10);
    $pdf->Cell(190, 5, strtoupper($cabTit) . ($emisor['ruc'] ? '   .   RUC ' . $emisor['ruc'] : ''), 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 7.5);
    $pdf->Cell(190, 4,
        ($emisor['direccion'] ?: '')
        . ($emisor['telefono'] ? '  .  Tel. ' . $emisor['telefono'] : '')
        . ($emisor['email'] ? '  .  ' . $emisor['email'] : ''),
        0, 1, 'L');

    // Banda titulo
    $pdf->Ln(2);
    $pdf->SetFont('helvetica', 'B', 12);
    $pdf->SetFillColor(124, 58, 237);
    $pdf->SetTextColor(255, 255, 255);
    $pdf->Cell(190, 7, 'ARMONIZACION OROFACIAL  -  FACE MAPPING PROFESIONAL', 1, 1, 'C', 1);
    $pdf->SetTextColor(0, 0, 0);
    $pdf->Ln(2);

    // Datos paciente
    $nombre = strtoupper(trim(($p['apaterno'] ?? '') . ' ' . ($p['amaterno'] ?? '') . ' ' . ($p['nombre'] ?? '')));
    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(22, 5, 'PACIENTE:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(80, 5, $nombre, 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->Cell(15, 5, 'EDAD:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(20, 5, $p['edad_completa'] ?? '', 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->Cell(15, 5, 'SEXO:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(15, 5, $p['sexo'] ?? '', 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->Cell(15, 5, 'FECHA:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(0, 5, ($d['aof_fecha'] ?? date('Y-m-d')) . '  ' . ($d['aof_hora'] ?? ''), 1, 1, 'L');

    // Sesion / profesional / banderas
    $absMap = [
        'aof_abs_embarazo'=>'Embarazo/lactancia','aof_abs_inf_activa'=>'Infeccion activa',
        'aof_abs_alergia_prod'=>'Alergia producto','aof_abs_enf_grave'=>'Enf. sistemica grave',
        'aof_abs_trastorno_coag'=>'Trast. coagulacion'
    ];
    $flagsAbs = [];
    foreach ($absMap as $k => $lbl) { if (!empty($d[$k])) $flagsAbs[] = $lbl; }

    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->Cell(22, 5, 'SESION:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(40, 5, $g('aof_num_sesion'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8.5);
    $pdf->Cell(25, 5, 'PROFESIONAL:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8.5);
    $pdf->Cell(0, 5, $g('aof_profesional', '') . ' - ' . $g('aof_especialidad', ''), 1, 1, 'L');

    if (count($flagsAbs)) {
        $pdf->SetFont('helvetica', 'B', 8.5);
        $pdf->SetTextColor(255,255,255);
        $pdf->SetFillColor(220, 38, 38);
        $pdf->Cell(190, 5, 'CONTRAINDICACIONES ABSOLUTAS DETECTADAS: ' . strtoupper(implode(' | ', $flagsAbs)), 1, 1, 'C', 1);
        $pdf->SetTextColor(0,0,0);
    }

    $pdf->Ln(2);

    // =========================================================================
    // SECCION 1 - MOTIVO Y OBJETIVO
    // =========================================================================
    _aofSeccion($pdf, '1. MOTIVO Y OBJETIVO');
    $pdf->SetFont('helvetica', '', 8);
    $pdf->SetFillColor(250, 245, 255);
    $pdf->MultiCell(95, 4, "MOTIVO DEL PACIENTE:\n" . ($d['aof_motivo'] ?? '-'), 1, 'L', 1, 0);
    $pdf->MultiCell(0, 4, "PLAN IDEAL PROFESIONAL:\n" . ($d['aof_plan_ideal'] ?? '-'), 1, 'L', 1, 1);
    $pdf->MultiCell(0, 4, "EXPECTATIVAS: " . ($d['aof_expectativas'] ?? '-'), 1, 'L');
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 2 - ANAMNESIS Y BANDERAS
    // =========================================================================
    _aofSeccion($pdf, '2. ANAMNESIS ESTETICA Y BANDERAS ROJAS');
    $relMap = [
        'aof_rel_autoinmune'=>'Autoinmune','aof_rel_miastenia'=>'Miastenia','aof_rel_esclerosis'=>'Esclerosis',
        'aof_rel_queloide'=>'Queloide','aof_rel_anticoag'=>'Anticoag.','aof_rel_aines'=>'AINE/AAS',
        'aof_rel_suppro'=>'Sup. pro-sangrado','aof_rel_tabaquismo'=>'Tabaquismo','aof_rel_isotret'=>'Isotretinoina',
        'aof_rel_corticoides'=>'Corticoides','aof_rel_implantes'=>'Implantes faciales','aof_rel_cx_facial'=>'Cx facial previa',
        'aof_rel_herpes'=>'Herpes recurrente','aof_rel_dismorfia'=>'Sosp. dismorfia'
    ];
    $flagsRel = [];
    foreach ($relMap as $k => $lbl) { if (!empty($d[$k])) $flagsRel[] = $lbl; }
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(50, 4.5, 'C. ABSOLUTAS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, count($flagsAbs) ? implode(' . ', $flagsAbs) : 'Ninguna', 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(50, 4.5, 'C. RELATIVAS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, count($flagsRel) ? implode(' . ', $flagsRel) : 'Ninguna', 1, 1, 'L');

    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(50, 4.5, 'ALERGIAS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_alergias'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(50, 4.5, 'ANTICOAGULANTES', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_anticoag'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(50, 4.5, 'ULT. TOXINA / ULT. AH', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_ult_toxina') . '  |  ' . $g('aof_ult_ah'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(50, 4.5, 'MEDICACION HABITUAL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_med_habitual'), 1, 1, 'L');
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 3 - EVALUACION FACIAL
    // =========================================================================
    _aofSeccion($pdf, '3. EVALUACION FACIAL ESTANDARIZADA');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(38, 4.5, 'FITZPATRICK', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_fitzpatrick'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'GLOGAU', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_glogau'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'CALIDAD PIEL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_calidad_piel'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'TIPO PIEL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_tipo_piel'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'TURGOR / HIDRATAC.', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_turgor') . ' / ' . $g('aof_hidratacion'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'POROS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_poros'), 1, 1, 'L');

    // Merz por zona
    $pdf->Ln(1);
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(190, 4.5, 'ESCALA DE MERZ - Ritides (0=ninguna, 4=muy severa)', 1, 1, 'L', 1);
    $merzZonas = [
        'aof_merz_frente'=>'Frente','aof_merz_glabela'=>'Glabela','aof_merz_patas'=>'Patas gallo',
        'aof_merz_nasogenianos'=>'Nasogenianos','aof_merz_marionetas'=>'Marionetas','aof_merz_labios'=>'Labios','aof_merz_cuello'=>'Cuello'
    ];
    $pdf->SetFont('helvetica', '', 8);
    foreach ($merzZonas as $k => $lbl) {
        $v = $d[$k] ?? '';
        $pdf->Cell(27, 4.5, $lbl . ': ' . ($v === '' ? '-' : $v), 1, 0, 'C');
    }
    $pdf->Ln(4.5);

    // Proporciones y angulos
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'TERCIOS (S/M/I)', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_tercio_sup','0') . ' / ' . $g('aof_tercio_med','0') . ' / ' . $g('aof_tercio_inf','0'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'QUINTOS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_quintos'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'ANG. NASOLABIAL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_ang_nasolabial'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'ANG. MENTOLABIAL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_ang_mentolabial'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'ANG. CERVICOMENTAL', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_ang_cervico'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'LINEA RICKETTS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_ricketts'), 1, 1, 'L');

    // Musculos hiperactivos
    $muscMap = ['aof_musc_frontal'=>'Frontal','aof_musc_corrugador'=>'Corrugador','aof_musc_procerus'=>'Procerus','aof_musc_orbicular_oc'=>'Orb.ocular','aof_musc_orbicular_or'=>'Orb.oral','aof_musc_nasalis'=>'Nasalis','aof_musc_masetero'=>'Masetero','aof_musc_mentoniano'=>'Mentoniano','aof_musc_dao'=>'DAO','aof_musc_platisma'=>'Platisma','aof_musc_risorio'=>'Risorio','aof_musc_elev_labio'=>'Elev. labio'];
    $musc = []; foreach ($muscMap as $k => $lbl) { if (!empty($d[$k])) $musc[] = $lbl; }
    $habMap = ['aof_hab_bruxismo'=>'Bruxismo','aof_hab_apretamiento'=>'Apretamiento','aof_hab_fumar'=>'Fumar','aof_hab_chupar_labio'=>'Chupar labio','aof_hab_dormir_lateral'=>'Dormir lateral'];
    $hab = []; foreach ($habMap as $k => $lbl) { if (!empty($d[$k])) $hab[] = $lbl; }
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'MUSC. HIPERACT.', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $musc ? implode(' . ', $musc) : 'Ninguno marcado', 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'HABITOS', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $hab ? implode(' . ', $hab) : 'Ninguno marcado', 1, 1, 'L');

    $pdf->Ln(2);

    // =========================================================================
    // SECCION 4 - FACE CHART CON MARCAS
    // =========================================================================
    $pdf->AddPage();
    _aofSeccion($pdf, '4. FACE MAPPING - MARCAS REGISTRADAS');

    // Parsear marcas
    $canvasRaw = $d['aof_canvas_data'] ?? '';
    $canvas = json_decode($canvasRaw, true);
    if (is_string($canvas)) { $canvas = json_decode($canvas, true); }
    $markers = (is_array($canvas) && isset($canvas['markers'])) ? $canvas['markers'] : [];

    // Un solo face chart centrado, usando la imagen del sistema
    $chartY = $pdf->GetY();
    $cw = 110;                  // ancho mm
    $cFx = (210 - $cw) / 2;     // centrado horizontal en A4

    // Resolver la ruta de la imagen y calcular alto proporcional
    $imgPath = null;
    $candidatos = [
        __DIR__ . '/../public/img/face_chart.png',
        dirname(__DIR__) . '/public/img/face_chart.png',
    ];
    foreach ($candidatos as $cand) {
        if (file_exists($cand)) { $imgPath = $cand; break; }
    }

    if ($imgPath) {
        list($origW, $origH) = getimagesize($imgPath);
        $ratio = $origH / max($origW, 1);
        $ch = $cw * $ratio;
        // Encabezado del chart
        $pdf->SetDrawColor(124, 58, 237);
        $pdf->SetFillColor(124, 58, 237);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->SetXY($cFx, $chartY);
        $pdf->Cell($cw, 4.5, '  FACE CHART - MARCAS POSICIONADAS', 1, 1, 'L', 1);
        $pdf->SetTextColor(0, 0, 0);
        $imgY = $chartY + 4.5;
        $pdf->Image($imgPath, $cFx, $imgY, $cw, $ch, 'PNG');
        // Marco
        $pdf->SetDrawColor(124, 58, 237);
        $pdf->SetLineWidth(0.3);
        $pdf->Rect($cFx, $imgY, $cw, $ch);
    } else {
        // Fallback: rectangulo vacio si no se encuentra la imagen
        $ch = 140;
        $imgY = $chartY;
        $pdf->SetDrawColor(124, 58, 237);
        $pdf->Rect($cFx, $imgY, $cw, $ch);
        $pdf->SetXY($cFx, $imgY + $ch/2);
        $pdf->SetFont('helvetica', 'I', 9);
        $pdf->Cell($cw, 5, '(face_chart.png no encontrado)', 0, 1, 'C');
    }

    // Renderizar marcas encima de la imagen
    foreach ($markers as $i => $m) {
        $cx = $cFx + ($cw * (floatval($m['x'] ?? 0) / 100));
        $cy = $imgY + ($ch * (floatval($m['y'] ?? 0) / 100));
        $color = isset($m['toolColor']) ? _aofHexToRgb($m['toolColor']) : [220, 38, 38];
        $pdf->SetFillColor($color[0], $color[1], $color[2]);
        $pdf->SetDrawColor(255, 255, 255);
        $pdf->SetLineWidth(0.4);
        $pdf->Circle($cx, $cy, 2.8, 0, 360, 'DF');
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetFont('helvetica', 'B', 6.5);
        $pdf->SetXY($cx - 3, $cy - 1.9);
        $pdf->Cell(6, 3, $i + 1, 0, 0, 'C');
        $pdf->SetTextColor(0, 0, 0);
    }

    $pdf->SetY($imgY + $ch + 3);

    // Leyenda con marcas detalladas (tabla)
    if (count($markers)) {
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->SetFillColor(237, 233, 254);
        $pdf->Cell(8, 5, '#', 1, 0, 'C', 1);
        $pdf->Cell(42, 5, 'Tipo', 1, 0, 'C', 1);
        $pdf->Cell(35, 5, 'Zona / Etiqueta', 1, 0, 'C', 1);
        $pdf->Cell(45, 5, 'Producto / Lote', 1, 0, 'C', 1);
        $pdf->Cell(18, 5, 'Cant.', 1, 0, 'C', 1);
        $pdf->Cell(20, 5, 'Profundidad', 1, 0, 'C', 1);
        $pdf->Cell(0, 5, 'Tecnica', 1, 1, 'C', 1);
        $pdf->SetFont('helvetica', '', 7.5);
        foreach ($markers as $i => $m) {
            $color = isset($m['toolColor']) ? _aofHexToRgb($m['toolColor']) : [220,38,38];
            $pdf->SetFillColor($color[0], $color[1], $color[2]);
            $pdf->SetTextColor(255, 255, 255);
            $pdf->SetFont('helvetica', 'B', 7.5);
            $pdf->Cell(8, 4.5, $i + 1, 1, 0, 'C', 1);
            $pdf->SetTextColor(0, 0, 0);
            $pdf->SetFont('helvetica', '', 7.5);
            $pdf->Cell(42, 4.5, _aofShort($m['toolName'] ?? '-', 32), 1, 0, 'L');
            $pdf->Cell(35, 4.5, _aofShort($m['zona'] ?? $m['label'] ?? '-', 28), 1, 0, 'L');
            $pdf->Cell(45, 4.5, _aofShort(($m['prod'] ?? '-') . ($m['lote'] ? ' / ' . $m['lote'] : ''), 36), 1, 0, 'L');
            $pdf->Cell(18, 4.5, ($m['cant'] ?? '-') . ' ' . ($m['unidad'] ?? ''), 1, 0, 'C');
            $pdf->Cell(20, 4.5, _aofShort($m['prof'] ?? '-', 16), 1, 0, 'L');
            $pdf->Cell(0, 4.5, _aofShort($m['tecnica'] ?? '-', 28), 1, 1, 'L');
        }
    } else {
        $pdf->SetFont('helvetica', '', 8);
        $pdf->Cell(190, 5, 'Sin marcas registradas en el face chart.', 1, 1, 'C');
    }
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 5 - PLAN POR ZONAS ANATOMICAS
    // =========================================================================
    $pdf->AddPage();
    _aofSeccion($pdf, '5. PLAN POR ZONAS ANATOMICAS');
    $zonasMap = [
        'frente'=>'Frente','glabela'=>'Glabela','patas'=>'Patas de gallo','cejas'=>'Elev. cejas','bunny'=>'Bunny lines',
        'sien'=>'Sien','punta_nariz'=>'Punta nasal','pomulos'=>'Pomulos','ojeras'=>'Ojeras','nasogenianos'=>'Nasogenianos',
        'labios_vol'=>'Labios volumen','labios_cont'=>'Labios contorno','filtrum'=>'Filtrum','comisuras'=>'Comisuras',
        'marionetas'=>'Marionetas','menton'=>'Menton','mandibula'=>'Mandibula','masetero'=>'Masetero','sonrisa_g'=>'Sonrisa gingival',
        'platisma'=>'Platisma','papada'=>'Papada'
    ];
    $pdf->SetFont('helvetica', 'B', 7.5);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(36, 5, 'Zona', 1, 0, 'C', 1);
    $pdf->Cell(28, 5, 'Producto', 1, 0, 'C', 1);
    $pdf->Cell(22, 5, 'Marca', 1, 0, 'C', 1);
    $pdf->Cell(18, 5, 'Lote', 1, 0, 'C', 1);
    $pdf->Cell(16, 5, 'Cant.', 1, 0, 'C', 1);
    $pdf->Cell(12, 5, 'Unid.', 1, 0, 'C', 1);
    $pdf->Cell(22, 5, 'Tecnica', 1, 0, 'C', 1);
    $pdf->Cell(20, 5, 'Estado', 1, 0, 'C', 1);
    $pdf->Cell(0, 5, 'Notas', 1, 1, 'C', 1);
    $pdf->SetFont('helvetica', '', 7);
    $imprimidas = 0;
    foreach ($zonasMap as $k => $lbl) {
        $indicado = !empty($d['zona_'.$k.'_ind']);
        if (!$indicado) continue;
        $imprimidas++;
        $pdf->SetFillColor(250, 245, 255);
        $pdf->Cell(36, 4.5, $lbl, 1, 0, 'L', 1);
        $pdf->Cell(28, 4.5, _aofShort($d['zona_'.$k.'_prod'] ?? '-', 20), 1, 0, 'L');
        $pdf->Cell(22, 4.5, _aofShort($d['zona_'.$k.'_marca'] ?? '-', 16), 1, 0, 'L');
        $pdf->Cell(18, 4.5, _aofShort($d['zona_'.$k.'_lote'] ?? '-', 12), 1, 0, 'L');
        $pdf->Cell(16, 4.5, $d['zona_'.$k.'_cant'] ?? '-', 1, 0, 'C');
        $pdf->Cell(12, 4.5, $d['zona_'.$k.'_unidad'] ?? '-', 1, 0, 'C');
        $pdf->Cell(22, 4.5, _aofShort($d['zona_'.$k.'_tecnica'] ?? '-', 18), 1, 0, 'L');
        $pdf->Cell(20, 4.5, $d['zona_'.$k.'_estado'] ?? '-', 1, 0, 'C');
        $pdf->Cell(0, 4.5, _aofShort($d['zona_'.$k.'_notas'] ?? '-', 60), 1, 1, 'L');
    }
    if (!$imprimidas) {
        $pdf->Cell(190, 5, 'Sin zonas indicadas en este plan.', 1, 1, 'C');
    }
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 6 - RESUMEN TOTALIZADO
    // =========================================================================
    _aofSeccion($pdf, '6. RESUMEN TOTALIZADO DE LA SESION');
    $totT = $d['aof_tot_toxina'] ?? '0';
    $totF = $d['aof_tot_filler'] ?? '0';
    $totH = $d['aof_tot_hilos'] ?? '0';
    $totZ = $d['aof_tot_zonas'] ?? '0';
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->SetFillColor(237, 233, 254);
    $pdf->Cell(47, 5, 'TOXINA (U totales)', 1, 0, 'C', 1);
    $pdf->Cell(47, 5, 'FILLER (mL totales)', 1, 0, 'C', 1);
    $pdf->Cell(47, 5, 'HILOS / VECTORES', 1, 0, 'C', 1);
    $pdf->Cell(49, 5, 'ZONAS INDICADAS', 1, 1, 'C', 1);
    $pdf->SetFont('helvetica', 'B', 14);
    $pdf->SetFillColor(250, 245, 255);
    $pdf->Cell(47, 9, $totT, 1, 0, 'C', 1);
    $pdf->Cell(47, 9, $totF, 1, 0, 'C', 1);
    $pdf->Cell(47, 9, $totH, 1, 0, 'C', 1);
    $pdf->Cell(49, 9, $totZ, 1, 1, 'C', 1);
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 7 - DOCUMENTACION Y CONSENTIMIENTO
    // =========================================================================
    _aofSeccion($pdf, '7. DOCUMENTACION Y CONSENTIMIENTO');
    $chk = function($v) { return !empty($v) ? '[X]' : '[  ]'; };
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(95, 4.5, $chk($d['aof_doc_consent'] ?? '') . ' Consentimiento informado firmado', 1, 0, 'L');
    $pdf->Cell(0, 4.5, $chk($d['aof_doc_foto_antes'] ?? '') . ' Fotografias antes', 1, 1, 'L');
    $pdf->Cell(95, 4.5, $chk($d['aof_doc_foto_post'] ?? '') . ' Fotografias post inmediato', 1, 0, 'L');
    $pdf->Cell(0, 4.5, $chk($d['aof_doc_instrucciones'] ?? '') . ' Instrucciones post entregadas', 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'ASEPSIA', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_asepsia'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'ANESTESIA', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_anestesia'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 4.5, 'EVENTOS ADVERSOS DURANTE EL PROCEDIMIENTO:', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(0, 4, $d['aof_eventos_intra'] ?? '-', 1, 'L');
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 8 - PLAN SESIONES Y POST
    // =========================================================================
    _aofSeccion($pdf, '8. PLAN EN SESIONES Y POST-PROCEDIMIENTO');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(45, 4.5, 'SESIONES TOTALES', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(40, 4.5, $g('aof_ses_total'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(38, 4.5, 'INTERVALO', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(35, 4.5, $g('aof_ses_intervalo'), 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(22, 4.5, 'PROX. CITA', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(0, 4.5, $g('aof_proxima_cita'), 1, 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 4.5, 'INDICACIONES INMEDIATAS (24h):', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(0, 4, $d['aof_indic_24h'] ?? '-', 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 4.5, 'INDICACIONES 1-2 SEMANAS:', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(0, 4, $d['aof_indic_2sem'] ?? '-', 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->SetFillColor(254, 226, 226);
    $pdf->Cell(190, 4.5, 'SENALES DE ALARMA PARA CONSULTAR DE INMEDIATO:', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->SetFillColor(255, 255, 255);
    $pdf->MultiCell(0, 4, $d['aof_alarmas'] ?? '-', 1, 'L');
    $pdf->Ln(2);

    // =========================================================================
    // SECCION 9 - SEGUIMIENTO (si aplica)
    // =========================================================================
    if (!empty($d['aof_seg_on'])) {
        _aofSeccion($pdf, '9. SEGUIMIENTO, RESULTADO Y SATISFACCION');
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->Cell(45, 4.5, 'GAIS', 1, 0, 'L', 1);
        $pdf->SetFont('helvetica', '', 8);
        $pdf->Cell(50, 4.5, $g('aof_gais'), 1, 0, 'L');
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->Cell(35, 4.5, 'SATISFACCION (0-10)', 1, 0, 'L', 1);
        $pdf->SetFont('helvetica', '', 8);
        $pdf->Cell(0, 4.5, $g('aof_satisfaccion'), 1, 1, 'L');
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->Cell(45, 4.5, 'RETOQUE', 1, 0, 'L', 1);
        $pdf->SetFont('helvetica', '', 8);
        $pdf->Cell(50, 4.5, $g('aof_retoque'), 1, 0, 'L');
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->Cell(35, 4.5, 'ZONA RETOQUE', 1, 0, 'L', 1);
        $pdf->SetFont('helvetica', '', 8);
        $pdf->Cell(0, 4.5, $g('aof_retoque_zona'), 1, 1, 'L');
        $pdf->SetFont('helvetica', 'B', 8);
        $pdf->Cell(190, 4.5, 'EVENTOS ADVERSOS POSTERIORES:', 1, 1, 'L', 1);
        $pdf->SetFont('helvetica', '', 8);
        $pdf->MultiCell(0, 4, $d['aof_eventos_post'] ?? '-', 1, 'L');
        $pdf->Ln(2);
    }

    // =========================================================================
    // SECCION 10 - NOTAS FINALES
    // =========================================================================
    _aofSeccion($pdf, '10. NOTAS FINALES');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 4.5, 'NOTAS TECNICAS DEL PROFESIONAL:', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(0, 4, $d['aof_notas_tec'] ?? '-', 1, 'L');
    $pdf->SetFont('helvetica', 'B', 8);
    $pdf->Cell(190, 4.5, 'RECOMENDACIONES PARA EL PACIENTE:', 1, 1, 'L', 1);
    $pdf->SetFont('helvetica', '', 8);
    $pdf->MultiCell(0, 4, $d['aof_notas_paciente'] ?? '-', 1, 'L');

    // =========================================================================
    // PIE DE FIRMA CON QR
    // =========================================================================
    if (function_exists('_pdfPieFirmaQRSimple')) {
        _pdfPieFirmaQRSimple($pdf, $emisor, $idatencion, 'ARMONIZACION OROFACIAL  -  FACE MAPPING');
    }

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


// =============================================================================
// HELPERS LOCALES (con guards para no chocar entre includes)
// =============================================================================
if (!function_exists('_aofSeccion')) {
    function _aofSeccion($pdf, $titulo) {
        $pdf->SetFont('helvetica', 'B', 9);
        $pdf->SetFillColor(124, 58, 237);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->Cell(0, 5, $titulo, 0, 1, 'L', 1);
        $pdf->SetTextColor(0, 0, 0);
    }
}

if (!function_exists('_aofHexToRgb')) {
    function _aofHexToRgb($hex) {
        $hex = ltrim($hex, '#');
        if (strlen($hex) === 3) {
            $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
        }
        if (strlen($hex) !== 6) return [124, 58, 237];
        return [hexdec(substr($hex,0,2)), hexdec(substr($hex,2,2)), hexdec(substr($hex,4,2))];
    }
}

if (!function_exists('_aofShort')) {
    function _aofShort($s, $max) {
        $s = (string)$s;
        if (mb_strlen($s) <= $max) return $s;
        return mb_substr($s, 0, $max - 1) . '.';
    }
}

// Las funciones _aofDibujarFaceFrontal y _aofDibujarFaceLateral fueron
// removidas: ahora usamos directamente public/img/face_chart.png via Image().
?>
