<?php
// GENERADOR DE REPORTE: PERIODONTOGRAMA CLÍNICO
// Renderiza el gráfico complejo usando primitivas de dibujo de TCPDF

function generarPDFPeriodontograma($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) ?? [];

    $pdf = new TCPDF('L', 'mm', 'A4', true, 'UTF-8', false); // Landscape para mejor visualización
    // Emisor dinámico (cero hardcodeo)
    $emisor = function_exists('_mspObtenerEmisor') ? _mspObtenerEmisor() : [
        'institucion'=>'', 'unidad'=>'', 'ruc'=>'', 'razon_social'=>'',
        'direccion'=>'', 'telefono'=>'', 'email'=>'',
        'profesional'=>'', 'especialidad'=>'', 'senescyt'=>'',
    ];

    $pdf->SetCreator('Sistema Médico HC');
    $pdf->SetAuthor($emisor['institucion'] ?: 'Profesional médico');
    $pdf->SetTitle('PERIODONTOGRAMA · Ficha Periodontal');
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetMargins(10, 10, 10);
    $pdf->SetAutoPageBreak(TRUE, 5);
    $pdf->AddPage();

    // HEADER (sin logo MSP, datos dinámicos)
    $pdf->SetFont('helvetica', 'B', 11);
    $cabTit = trim($emisor['institucion'] ?: $emisor['razon_social']);
    $pdf->Cell(0, 5, strtoupper($cabTit) . ($emisor['ruc'] ? '   ·   RUC ' . $emisor['ruc'] : ''), 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 7.5);
    $pdf->Cell(0, 4,
        ($emisor['direccion'] ?: '')
        . ($emisor['telefono'] ? '  ·  Tel. ' . $emisor['telefono'] : '')
        . ($emisor['email'] ? '  ·  ' . $emisor['email'] : ''),
        0, 1, 'L');
    $pdf->Ln(2);
    $pdf->SetFont('helvetica', 'B', 13);
    $pdf->SetFillColor(204, 204, 255);
    $pdf->Cell(0, 8, 'PERIODONTOGRAMA CLÍNICO · FICHA PERIODONTAL', 1, 1, 'C', 1);
    $pdf->Ln(5);

    // DATOS PACIENTE (Horizontal)
    $pdf->SetFillColor(240, 240, 240);
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->Cell(20, 6, 'Paciente:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 9);
    $pdf->Cell(100, 6, $p['apaterno'] . ' ' . $p['nombre'], 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->Cell(15, 6, 'H.C.:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 9);
    $pdf->Cell(30, 6, $p['num_documento'], 1, 0, 'L');
    $pdf->SetFont('helvetica', 'B', 9);
    $pdf->Cell(15, 6, 'Fecha:', 1, 0, 'L', 1);
    $pdf->SetFont('helvetica', '', 9);
    $pdf->Cell(0, 6, date('Y-m-d'), 1, 1, 'L');
    $pdf->Ln(5);

    // LEYENDA (SIMPLIFICADA)
    $pdf->SetFont('helvetica', '', 8);
    $pdf->Cell(10, 5, '', 0, 0); // Spacer
    $pdf->SetFillColor(255, 0, 0);
    $pdf->Rect($pdf->GetX(), $pdf->GetY() + 1, 3, 3, 'F');
    $pdf->SetX($pdf->GetX() + 4);
    $pdf->Cell(20, 5, 'Sangrado', 0, 0);

    $pdf->SetFillColor(0, 0, 255);
    $pdf->Rect($pdf->GetX(), $pdf->GetY() + 1, 3, 3, 'F');
    $pdf->SetX($pdf->GetX() + 4);
    $pdf->Cell(20, 5, 'Placa', 0, 0);

    $pdf->SetDrawColor(255, 0, 0);
    $pdf->SetLineWidth(0.5);
    $pdf->Line($pdf->GetX(), $pdf->GetY() + 2.5, $pdf->GetX() + 5, $pdf->GetY() + 2.5);
    $pdf->SetDrawColor(0);
    $pdf->SetX($pdf->GetX() + 6);
    $pdf->Cell(30, 5, '----- Profundidad', 0, 0);

    $pdf->SetDrawColor(0, 0, 255);
    $pdf->SetLineWidth(0.5);
    $pdf->Line($pdf->GetX(), $pdf->GetY() + 2.5, $pdf->GetX() + 5, $pdf->GetY() + 2.5);
    $pdf->SetDrawColor(0);
    $pdf->SetX($pdf->GetX() + 6);
    $pdf->Cell(30, 5, '----- Margen Gingival', 0, 1);
    $pdf->Ln(2);


    // FUNCION DE DIBUJO DE FILA
    // Renderiza una fila completa: Dientes SVG + Grids
    function dibujarFilaPeriodonto($pdf, $titulo, $rango, $arcada, $cara, $d)
    {
        $pdf->SetFont('helvetica', 'B', 9);
        $pdf->Cell(0, 6, $titulo, 0, 1, 'L');

        $startX = 15;
        $y = $pdf->GetY();
        $wDiente = 14;
        $gap = 0;

        // Determinar coordenadas Y para Grid vs Diente
        if ($arcada == 'sup') {
            $yGrid = $y;
            $yDiente = $y + 12; // Grid altura approx 12 (4mm * 3 filas)
        } else {
            $yDiente = $y;
            $yGrid = $y + 25; // Diente altura approx 25
        }

        $pdf->SetFont('helvetica', '', 5);
        $pdf->SetLineWidth(0.1);

        // DIBUJAR DIENTES Y GRID

        $centerPage = 148.5; // (297/2) en A4 Land
        $startX_Left = $centerPage - 5; // Start going left
        $startX_Right = $centerPage + 5; // Start going right (gap de 10mm en medio)

        foreach ($rango as $i) {
            // Calcular X basado en cuadrante
            $x = 0;

            // Cuadrantes
            if ($i >= 11 && $i <= 18) { // Q1
                $idx = $i - 11; // 0 para 11
                $x = $startX_Left - (($idx + 1) * $wDiente);
            } elseif ($i >= 21 && $i <= 28) { // Q2
                $idx = $i - 21; // 0 para 21
                $x = $startX_Right + ($idx * $wDiente);
            } elseif ($i >= 41 && $i <= 48) { // Q4
                $idx = $i - 41;
                $x = $startX_Left - (($idx + 1) * $wDiente);
            } elseif ($i >= 31 && $i <= 38) { // Q3
                $idx = $i - 31;
                $x = $startX_Right + ($idx * $wDiente);
            } else {
                continue; // Skip invalid
            }

            // ID BASE
            $id = "p_{$i}_{$cara}";

            // === LECTURA DE ESTADOS VISUALES (NUEVO) ===
            // Sangrado y Placa (inputs checkeables)
            $sangrado = isset($d[$id . '_mg_d_sangrado']) || isset($d[$id . '_mg_c_sangrado']) || isset($d[$id . '_mg_m_sangrado']) ||
                isset($d[$id . '_ps_d_sangrado']) || isset($d[$id . '_ps_c_sangrado']) || isset($d[$id . '_ps_m_sangrado']);

            // Placa
            $placa = isset($d[$id . '_mg_d_placa']) || isset($d[$id . '_mg_c_placa']) || isset($d[$id . '_mg_m_placa']) ||
                isset($d[$id . '_ps_d_placa']) || isset($d[$id . '_ps_c_placa']) || isset($d[$id . '_ps_m_placa']);

            // Simbolos (lista csv)
            $symList = isset($d[$id . '_simbolos']) ? explode(',', $d[$id . '_simbolos']) : [];

            // 1. DIBUJAR GRID
            $hRow = 3;
            $gridY = $yGrid;

            // Datos
            $mg_d = $d[$id . '_mg_d'] ?? '';
            $mg_c = $d[$id . '_mg_c'] ?? '';
            $mg_m = $d[$id . '_mg_m'] ?? '';
            $ps_d = $d[$id . '_ps_d'] ?? '';
            $ps_c = $d[$id . '_ps_c'] ?? '';
            $ps_m = $d[$id . '_ps_m'] ?? '';
            $nic_d = $d[$id . '_nic_d'] ?? '';
            $nic_c = $d[$id . '_nic_c'] ?? '';
            $nic_m = $d[$id . '_nic_m'] ?? '';

            $cw = $wDiente / 3;

            // Helper simple para celdas (SIN BORDES para evitar lineas dobles)
            $drawCell = function ($txt, $pdf) use ($cw, $hRow) {
                // Border 0. We draw grid manually later.
                $pdf->Cell($cw, $hRow, $txt, 0, 0, 'C');
            };

            // Fila 1 (MG) 
            $pdf->SetXY($x, $gridY);
            $drawCell($mg_d, $pdf);
            $drawCell($mg_c, $pdf);
            $drawCell($mg_m, $pdf);

            // Fila 2 (PS)
            $pdf->SetXY($x, $gridY + $hRow);
            $drawCell($ps_d, $pdf);
            $drawCell($ps_c, $pdf);
            $drawCell($ps_m, $pdf);

            // Fila 3 (NIC)
            $pdf->SetXY($x, $gridY + ($hRow * 2));
            $drawCell($nic_d, $pdf);
            $drawCell($nic_c, $pdf);
            $drawCell($nic_m, $pdf);

            // DIBUJAR GRILLA MANUAL (Para evitar dobles lineas)
            $pdf->SetDrawColor(0); // Negro
            $pdf->SetLineWidth(0.1);

            // 1. Marco Exterior del Diente (3 filas x 3 columnas)
            $pdf->Rect($x, $gridY, $wDiente, $hRow * 3);

            // 2. Lineas Verticales Internas (Separadores de d, c, m)
            $pdf->Line($x + $cw, $gridY, $x + $cw, $gridY + ($hRow * 3));
            $pdf->Line($x + ($cw * 2), $gridY, $x + ($cw * 2), $gridY + ($hRow * 3));

            // 3. Lineas Horizontales Internas (Separadores de filas)
            $pdf->Line($x, $gridY + $hRow, $x + $wDiente, $gridY + $hRow);
            $pdf->Line($x, $gridY + ($hRow * 2), $x + $wDiente, $gridY + ($hRow * 2));

            // 2. DIBUJAR DIENTE (ESTÉTICO)
            $dY = $yDiente;
            $dH = 25;

            $pdf->SetDrawColor(50);
            $pdf->SetFillColor(255, 255, 255);

            // Ajustes visuales para "parecer dientes"
            // Diferenciar molares (anchos, raices dobles) de incisivos (delgados, raiz simple)
            // Lógica simple por numero de diente
            // Molares: 16,17,18, 26,27,28, 36,37,38, 46,47,48
            // Premolares: 4,5
            $isMolar = in_array($i, [16, 17, 18, 26, 27, 28, 36, 37, 38, 46, 47, 48]);
            $isPremolar = in_array($i, [14, 15, 24, 25, 34, 35, 44, 45]);

            $bx = $x + 1;
            $by = $dY;
            $bs = $wDiente - 2;

            // Opacidad para ausente
            if (in_array('ausente', $symList)) {
                $pdf->SetAlpha(0.3);
            }

            if ($arcada == 'sup') {
                // --- SUPERIOR ---
                // Raiz arriba, Corona abajo
                // Corona Body
                $cy = $by + 16;
                $ch = 10;
                // Raiz Body
                $ry = $by;
                $rh = 16;

                // Dibujar Raiz
                if ($isMolar) {
                    // 2 patitas o 3
                    $pdf->Polygon([$bx, $cy, $bx, $ry + 5, $bx + 2, $ry, $bx + 4, $ry + 8, $bx + 6, $ry, $bx + $bs, $ry + 5, $bx + $bs, $cy], 'DF');
                } else {
                    // Conica
                    $pdf->Polygon([$bx + 1, $cy, $bx + ($bs / 2), $ry, $bx + $bs - 1, $cy], 'DF');
                }

                // Dibujar Corona
                // Rounded rect bottom
                $pdf->RoundedRect($bx, $cy, $bs, $ch, 3, '1111', 'DF');
                // Linea Cervical curva (Cubic Bezier: x0,y0, x1,y1, x2,y2, x3,y3)
                $pdf->Curve($bx, $cy, $bx + ($bs / 3), $cy + 2, $bx + ($bs * 2 / 3), $cy + 2, $bx + $bs, $cy);

            } else {
                // --- INFERIOR ---
                // Raiz abajo, Corona arriba
                // Corona Body
                $cy = $by;
                $ch = 10;
                // Raiz Body
                $ry = $by + 10;
                $rh = 16;

                // Dibujar Corona
                $pdf->RoundedRect($bx, $cy, $bs, $ch, 3, '1111', 'DF');

                // Dibujar Raiz
                if ($isMolar) {
                    $pdf->Polygon([$bx, $ry, $bx, $ry + $rh - 5, $bx + 2, $ry + $rh, $bx + 4, $ry + $rh - 8, $bx + 6, $ry + $rh, $bx + $bs, $ry + $rh - 5, $bx + $bs, $ry], 'DF');
                } else {
                    $pdf->Polygon([$bx + 1, $ry, $bx + ($bs / 2), $ry + $rh, $bx + $bs - 1, $ry], 'DF');
                }
                // Linea cervical (Cubic Bezier)
                $pdf->Curve($bx, $ry, $bx + ($bs / 3), $ry - 2, $bx + ($bs * 2 / 3), $ry - 2, $bx + $bs, $ry);
            }

            // Reset Alpha
            $pdf->SetAlpha(1);

            // Numero Diente
            $pdf->SetXY($x, $dY + ($dH / 2) - 2);
            $pdf->SetFont('helvetica', 'B', 6);
            $numY = ($arcada == 'sup') ? $dY + 5 : $dY + 18;
            $pdf->SetXY($x, $numY);
            $pdf->Cell($wDiente, 4, $i, 0, 0, 'C');

            // 2b. DIBUJAR MARCAS (SANGRADO/PLACA) SOBRE EL DIENTE
            // Coordenada Y Base para los puntos (aprox Cuello)
            $ySpots = ($arcada == 'sup') ? $dY + 14 : $dY + 12;

            // Sectores: Distal, Central, Mesial (Indices 0, 1, 2)
            // Width diente 14. 
            // Pos X relativas: 2.5, 7, 11.5
            $xOffsets = [2.5, 7, 11.5];
            $sectors = ['d', 'c', 'm'];

            foreach ($sectors as $k => $sec) {
                // Verificar inputs. Checkeamos vs MG, PS, NIC? PS es el mas comun. Revisamos todos.
                $hasSangrado = isset($d[$id . '_ps_' . $sec . '_sangrado']) || isset($d[$id . '_mg_' . $sec . '_sangrado']);
                $hasPlaca = isset($d[$id . '_ps_' . $sec . '_placa']) || isset($d[$id . '_mg_' . $sec . '_placa']);

                $sx = $x + $xOffsets[$k];
                $sy = $ySpots;

                if ($hasSangrado) {
                    $pdf->SetFillColor(255, 0, 0); // ROJO
                    $pdf->Circle($sx, $sy, 2, 0, 360, 'F'); // Radio 2mm (Visible)
                }

                if ($hasPlaca) {
                    $pdf->SetFillColor(0, 0, 255); // AZUL
                    // Si tiene sangrado, desplazar un poco
                    if ($hasSangrado) {
                        $pdf->Circle($sx + 1.5, $sy - 1.5, 2, 0, 360, 'F');
                    } else {
                        $pdf->Circle($sx, $sy, 2, 0, 360, 'F');
                    }
                }
            }

            // === DIBUJAR SIMBOLOS ===
            // 1. Ausente (X)
            if (in_array('ausente', $symList)) {
                $pdf->SetLineWidth(0.5);
                $pdf->Line($x, $dY, $x + $wDiente, $dY + $dH);
                $pdf->Line($x + $wDiente, $dY, $x, $dY + $dH);
                $pdf->SetLineWidth(0.1);
            }
            // 2. Implante (IMP)
            if (in_array('implante', $symList)) {
                $pdf->SetFont('helvetica', 'B', 7);
                $pdf->SetXY($x, $dY + 10);
                $pdf->Cell($wDiente, 4, 'IMP', 0, 0, 'C');
            }
            // 3. Furcas (V, nabla)
            // Posicionar cerca de la raíz
            $fy = ($arcada == 'sup') ? $dY + 5 : $dY + 18; // approx root mid
            $fx = $x + ($wDiente / 2) - 1.5;

            if (in_array('furca1', $symList)) {
                $pdf->SetTextColor(255, 0, 0);
                $pdf->SetFont('helvetica', 'B', 8);
                $pdf->Text($fx, $fy, 'V');
            }
            if (in_array('furca2', $symList)) {
                $pdf->SetTextColor(255, 0, 0);
                $pdf->SetFont('helvetica', 'B', 8);
                $pdf->Text($fx, $fy, '∇'); // Nabla char
            }
            if (in_array('furca3', $symList)) {
                $pdf->SetTextColor(255, 0, 0);
                $pdf->SetFont('helvetica', 'B', 8);
                $pdf->Text($fx, $fy, '▼'); // Filled
            }
            $pdf->SetTextColor(0);

            // 4. Movilidad (I, II, III azul)
            // Posicionar en corona o cerca
            if (in_array('mov1', $symList) || in_array('mov2', $symList) || in_array('mov3', $symList)) {
                $my = ($arcada == 'sup') ? $dY + 15 : $dY + 2;
                $txt = '';
                if (in_array('mov1', $symList))
                    $txt = 'I';
                if (in_array('mov2', $symList))
                    $txt = 'II';
                if (in_array('mov3', $symList))
                    $txt = 'III';

                $pdf->SetTextColor(0, 0, 255);
                $pdf->SetFont('helvetica', 'B', 7);
                $pdf->Text($x + 1, $my, $txt);
                $pdf->SetTextColor(0);
            }

            // 5. Fistula (circulo rojo)
            if (in_array('fistula', $symList)) {
                $pdf->SetFillColor(255, 0, 0);
                $cy = ($arcada == 'sup') ? $dY + 2 : $dY + 22; // Apical
                $pdf->Circle($x + ($wDiente / 2), $cy, 1.5, 0, 360, 'F');
            }

            // 6. Puntos de alerta (Legacy: calculo si MG/PS altos)
            // Ya cubierto por indicadores especificos pero mantenemos logica auto si se desea
            // ...

        } // Fin loop dientes

        $pdf->SetY($y + 45); // Espacio para siguiente fila
    }

    // RENDERIZAR LAS 4 FILAS
    // 1. MAXILAR SUPERIOR - VESTIBULAR (18-11, 21-28)
    $rango1 = [18, 17, 16, 15, 14, 13, 12, 11];
    $rango2 = [21, 22, 23, 24, 25, 26, 27, 28];
    // Unir visualmente en una linea larga

    // PDF Landscape width ~280mm. 16 dientes * 14mm = 224mm. Ok.

    dibujarFilaPeriodonto($pdf, 'MAXILAR SUPERIOR - VESTIBULAR', array_merge($rango1, $rango2), 'sup', 'vest', $d);
    dibujarFilaPeriodonto($pdf, 'MAXILAR SUPERIOR - PALATINO', array_merge($rango1, $rango2), 'sup', 'pal', $d);

    // Inferior
    $rango3 = [48, 47, 46, 45, 44, 43, 42, 41];
    $rango4 = [31, 32, 33, 34, 35, 36, 37, 38];

    dibujarFilaPeriodonto($pdf, 'MANDIBULA INFERIOR - LINGUAL', array_merge($rango3, $rango4), 'inf', 'lin', $d);
    dibujarFilaPeriodonto($pdf, 'MANDIBULA INFERIOR - VESTIBULAR', array_merge($rango3, $rango4), 'inf', 'vest', $d);

    // DIAGNOSTICO
    $pdf->SetFont('helvetica', 'B', 10);
    $pdf->Cell(0, 8, 'DIAGNÓSTICO PERIODONTAL', 0, 1, 'L');
    $pdf->SetFont('helvetica', '', 9);
    $pdf->MultiCell(0, 15, $d['perio_diagnostico'] ?? '', 1, 'L');

    // Pie con QR de firma electrónica (patrón maestro MSP)
    $emisor = function_exists('_mspObtenerEmisor') ? _mspObtenerEmisor() : ['institucion'=>'','profesional'=>'','especialidad'=>'','senescyt'=>''];
    if (function_exists('_pdfPieFirmaQRSimple')) {
        _pdfPieFirmaQRSimple($pdf, $emisor, $idatencion, 'PERIODONTOGRAMA · Ficha Periodontal');
    }

    return salvarPDF($pdf, 'PERIODONTOGRAMA', $idatencion);
}
?>