<?php
/**
 * Generador de PDF para Recetas Médicas - SISTEMA UP
 * Soporte dinámico A5 (1-3 medicamentos) y A4 (4+ medicamentos)
 */

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

if (!class_exists('Persona')) {
    require_once __DIR__ . "/../modelos/Persona.php";
}

function cargarTCPDFReceta()
{
    if (class_exists('TCPDF')) {
        return true;
    }

    // Función auxiliar para números a letras (requiere intl)
    if (!function_exists('numeroALetrasReceta')) {
        function numeroALetrasReceta($num) {
            if (!class_exists('NumberFormatter')) return "";
            $formatter = new NumberFormatter("es", NumberFormatter::SPELLOUT);
            return strtoupper($formatter->format($num));
        }
    }

    $baseDir = dirname(__DIR__);
    $docRoot = isset($_SERVER['DOCUMENT_ROOT']) && !empty($_SERVER['DOCUMENT_ROOT']) ? rtrim($_SERVER['DOCUMENT_ROOT'], '/') : $baseDir;
    $cpanelSharedPath = '/home/' . get_current_user() . '/public_html/tcpdf/tcpdf.php';

    $posibles_rutas = [
        $docRoot . '/tcpdf/tcpdf.php',
        $cpanelSharedPath, // Búsqueda en public_html compartido de cPanel
        $baseDir . '/tcpdf/tcpdf.php',
        $baseDir . '/../tcpdf/tcpdf.php',
        $baseDir . '/public/tcpdf/tcpdf.php',
        $baseDir . '/../public/tcpdf/tcpdf.php',
        __DIR__ . '/../public/tcpdf/tcpdf.php'
    ];

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

    $busqueda = glob($baseDir . '/public/*/tcpdf.php');
    if (!empty($busqueda)) {
        require_once($busqueda[0]);
        return true;
    }

    throw new Exception("Librería TCPDF no encontrada. Se buscó en: " . implode(", ", $posibles_rutas));
}

function generarPDFReceta($idatencion, $datos_json = null, $paramsFirma = [])
{
    // Limpiar buffer
    while (ob_get_level()) ob_end_clean();

    $baseDir = dirname(__DIR__);
    $persona = new Persona();

    // 1. CARGA DE DATOS
    $rspta = $persona->imprimirHistoria($idatencion);
    if (!$rspta || !is_object($rspta)) return null;
    $reg = $rspta->fetch_object();
    if (!$reg) return null;

    $rspta2 = $persona->imprimirReceta($idatencion);
    $rspta3 = $persona->imprimirDetalleHistoria($idatencion);

    // Recuperar diagnósticos
    $codigosCie = ''; $enfermedades = '';
    if ($rspta3 && is_object($rspta3)) {
        while ($diag = $rspta3->fetch_object()) {
            $codigosCie .= strtoupper($diag->codigo) . ' ';
            $enfermedades .= strtoupper($diag->enfermedad) . ' ';
        }
    }

    // Recuperar medicamentos
    $listaMedicamentos = [];
    if ($rspta2 && is_object($rspta2)) {
        while ($r = $rspta2->fetch_object()) $listaMedicamentos[] = $r;
    } elseif (is_array($rspta2)) {
        $listaMedicamentos = $rspta2;
    }

    // Lógica de Firma
    $estaFirmado = false;
    $fechaFirma = isset($paramsFirma['fecha_firma']) ? $paramsFirma['fecha_firma'] : date('Y-m-d H:i:s');
    $nombreEspecialista = isset($paramsFirma['especialista']) ? $paramsFirma['especialista'] : $reg->especialista;

    $resFirma = $persona->verificarFirmaReceta($idatencion);
    if ($resFirma && isset($resFirma['firmado']) && $resFirma['firmado'] == 1) {
        $estaFirmado = true;
        $fechaFirma = $resFirma['fecha_firma'];
    }

    // FIX CRÍTICO: Si estamos en proceso de firma (llamado desde firmar_receta.php),
    // la BD aún no tiene firmado=1 pero SÍ debemos incluir el QR en el PDF.
    if (!$estaFirmado && !empty($paramsFirma) && isset($paramsFirma['rutaCert'])) {
        $estaFirmado = true;
        $fechaFirma = date('Y-m-d H:i:s');
    }

    // Directorio temporal
    $dirTemp = $baseDir . '/files/recetas_temp/';
    if (!file_exists($dirTemp)) mkdir($dirTemp, 0755, true);
    $rutaPDF = $dirTemp . 'receta_' . $idatencion . '_' . time() . '.pdf';

    if (!cargarTCPDFReceta()) {
        throw new Exception("Error CRITICO TCPDF: La librería TCPDF no pudo ser cargada. Rutas intentadas en generar_pdf_receta.php.");
    }

    // ============================================================
    // DETECCIÓN AUTOMÁTICA: Si hay más de 4 medicamentos → A4
    // ============================================================
    if (count($listaMedicamentos) > 4) {
        return generarPDFRecetaA4($idatencion, $reg, $listaMedicamentos, $codigosCie, $enfermedades, $estaFirmado, $fechaFirma, $nombreEspecialista, $baseDir);
    }

    try {
        // --- FORMATO A5 ORIGINAL (1-3 medicamentos) ---
        $pdf = new TCPDF('L', 'mm', 'A5', true, 'UTF-8', false);
        $pdf->SetMargins(0, 0, 0); $pdf->SetAutoPageBreak(false, 0); $pdf->AddPage();

        $fondoPath = $baseDir . '/public/img/fondo_receta.png';
        if (file_exists($fondoPath)) $pdf->Image($fondoPath, 0, 0, 210, 148, '', '', '', false, 300, '', false, false, 0);

        $writeAbs = function ($x, $y, $w, $h, $html, $align = 'L', $fontSize = 10) use ($pdf) {
            $pdf->SetXY($x, $y); $pdf->SetFont('helvetica', '', $fontSize);
            $pdf->writeHTMLCell($w, $h, $x, $y, $html, 0, 0, 0, true, $align, false);
        };

        $writeAbs(12, 25, 45, 6, "<b>Receta#:</b> " . $idatencion, 'L', 12);
        
        // COLUMNA 1 (Izquierda: X=45)
        $writeAbs(45, 17, 60, 6, "<b>Paciente:</b> " . $reg->paciente, 'L', 8);
        $writeAbs(45, 22, 60, 6, "<b>Cédula:</b> " . $reg->num_documento, 'L', 8);
        $writeAbs(45, 27, 60, 6, "<b>Edad:</b> " . $reg->edad, 'L', 8);
        
        // COLUMNA 2 (Centro: X=105)
        $writeAbs(105, 17, 50, 6, "<b>Peso:</b> " . $reg->peso . " kg", 'L', 8);
        $writeAbs(105, 22, 50, 6, "<b>Dirección:</b> " . ($reg->direccion ?: 'Guayaquil'), 'L', 8);
        $writeAbs(105, 27, 50, 6, "<b>HC#:</b> " . $reg->historia_clinica, 'L', 8);
        
        // COLUMNA 3 (Derecha: X=155)
        $writeAbs(155, 17, 50, 6, "<b>Sexo:</b> " . $reg->sexo, 'L', 8);
        $writeAbs(155, 22, 50, 6, "<b>Alergias:</b> " . ($reg->alergia ?: 'Ninguna'), 'L', 8);
        $writeAbs(155, 27, 50, 6, "<b>Fecha:</b> " . $reg->fecha, 'L', 8);

        $writeAbs(12, 47, 140, 6, "<b>Medico Prescriptor:</b> " . $reg->especialista . " <span style=\"margin-left:15px;\"><b>Senescyt:</b> " . $reg->registro_senescyt . "</span>", 'L', 9);
        $writeAbs(155, 47, 50, 6, "<b>Vigencia:</b> " . $reg->vigencia, 'C', 9);

        $bloqueMed = ''; foreach ($listaMedicamentos as $m) $bloqueMed .= '<b>• ' . strtoupper($m->medicamento) . ' ' . $m->concentracion . ' (' . $m->presentacion . ')</b><br>&nbsp;&nbsp; <b>Cant:</b> ' . $m->cantidad . '<br>';
        $writeAbs(5, 58, 105, 58, $bloqueMed, 'L', 8);

        $bloquePos = ''; foreach ($listaMedicamentos as $m) $bloquePos .= '<b>Vía:</b> ' . ($m->via_administracion ?: '-') . '<br>' . ($m->posologia ?: '-') . '<br>';
        $writeAbs(112, 58, 93, 58, $bloquePos, 'L', 8);

        $writeAbs(5, 113, 200, 4, "<b>Indicaciones:</b> " . str_replace("\n", " ", $reg->tratamiento), 'L', 7.5);
        $writeAbs(5, 118, 200, 4, "<b>Indicaciones No Farmacologicas:</b> " . str_replace("\n", " ", $reg->Indicaciones_no_farmacologicas), 'L', 7.5);
        $writeAbs(5, 123, 200, 4, "<b>Signos de alarma:</b> " . ($reg->signnose_de_alarma ?: 'Ninguno'), 'L', 7.5);
        $writeAbs(5, 128, 135, 4, "<b>Diagnostico:</b> " . $enfermedades, 'L', 7.5);
        $writeAbs(5, 133, 135, 4, "<b>Cie10:</b> " . $codigosCie, 'L', 7.5);

        if ($estaFirmado) {
            $qrContent = "FIRMADO POR: " . strtoupper($nombreEspecialista) . "\nFECHA: " . $fechaFirma . "\nvalidar con firma ec";
            $pdf->write2DBarcode($qrContent, 'QRCODE,H', 140, 119, 15, 15, ['border' => 0, 'fgcolor' => [0,0,0], 'bgcolor' => false], 'N');
            $writeAbs(156, 119, 50, 15, 'FIRMADO DIGITALMENTE<br><b>' . substr($nombreEspecialista, 0, 22) . '</b><br>' . $fechaFirma . '<br>validar con firma ec', 'L', 6.5);
        }

        $pdf->Output($rutaPDF, 'F');
        return $rutaPDF;
    } catch (Exception $e) { 
        throw new Exception("Error interno al generar PDF (A5): " . $e->getMessage() . " - Ruta: " . $rutaPDF); 
    }
}

function generarPDFRecetaA4($idatencion, $reg, $listaMedicamentos, $codigosCie, $enfermedades, $estaFirmado, $fechaFirma, $nombreEspecialista, $baseDir)
{
    $rutaPDF = $baseDir . '/files/recetas_temp/receta_a4_' . $idatencion . '_' . time() . '.pdf';
    try {
        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
        $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->SetMargins(0, 0, 0);
        $pdf->SetAutoPageBreak(false, 0); $pdf->AddPage();

        $fondoA4 = $baseDir . '/public/img/A4 recetas.png';
        if (file_exists($fondoA4)) $pdf->Image($fondoA4, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);

        $writeAbs = function ($x, $y, $w, $h, $html, $align = 'L', $fontSize = 10, $fontStyle = '') use ($pdf) {
            $pdf->SetXY($x, $y); $pdf->SetFont('helvetica', $fontStyle, $fontSize);
            $pdf->writeHTMLCell($w, $h, $x, $y, $html, 0, 0, 0, true, $align, false);
        };

        // ==========================================
        // CABECERA A4 (IDÉNTICA A LA DEL A5 PERO CON AJUSTES)
        // ==========================================
        // Receta# bajado a la altura de Edad (Y=27)
        $writeAbs(12, 27, 45, 6, "<b>Receta#:</b> " . $idatencion, 'L', 12);
        
        // COLUMNA 1 (Izquierda: X=45)
        $writeAbs(45, 17, 60, 6, "<b>Paciente:</b> " . strtoupper($reg->paciente), 'L', 8);
        $writeAbs(45, 22, 60, 6, "<b>Cédula:</b> " . $reg->num_documento, 'L', 8);
        $writeAbs(45, 27, 60, 6, "<b>Edad:</b> " . $reg->edad, 'L', 8);
        
        // COLUMNA 2 (Centro: X=105)
        $writeAbs(105, 17, 50, 6, "<b>Peso:</b> " . $reg->peso . " kg", 'L', 8);
        $writeAbs(105, 22, 50, 6, "<b>Dirección:</b> " . ($reg->direccion ?: 'Guayaquil'), 'L', 8);
        $writeAbs(105, 27, 50, 6, "<b>HC#:</b> " . $reg->historia_clinica, 'L', 8);
        
        // COLUMNA 3 (Derecha: X=155)
        $writeAbs(155, 17, 50, 6, "<b>Sexo:</b> " . $reg->sexo, 'L', 8);
        $writeAbs(155, 22, 50, 6, "<b>Alergias:</b> " . ($reg->alergia ?: 'Ninguna'), 'L', 8);
        $writeAbs(155, 27, 50, 6, "<b>Fecha:</b> " . $reg->fecha, 'L', 8);

        // Medico alineado a X=12 (Mismo margen que Receta#)
        $writeAbs(12, 47, 140, 6, "<b>Medico Prescriptor:</b> " . $reg->especialista . " <span style=\"margin-left:15px;\"><b>Senescyt:</b> " . $reg->registro_senescyt . "</span>", 'L', 9);
        $writeAbs(155, 47, 50, 6, "<b>Vigencia:</b> " . $reg->vigencia, 'C', 9);
        
        // ==========================================
        // CUERPO DE MEDICAMENTOS (Formato Párrafo)
        // ==========================================
        $y = 58;
        
        $bloqueMedHTML = ''; 
        foreach ($listaMedicamentos as $m) {
            $desc = strtoupper($m->medicamento) . ' ' . $m->concentracion . ' (' . $m->presentacion . ')';
            $cantLetras = function_exists('numeroALetrasReceta') ? numeroALetrasReceta($m->cantidad) : "";
            $cantFull = $m->cantidad . ($cantLetras ? " ($cantLetras)" : "");
            
            $bloqueMedHTML .= '<b>• ' . $desc . '</b><br>';
            $bloqueMedHTML .= '<b>Cant:</b> ' . $cantFull . ' - <b>Vía:</b> ' . ($m->via_administracion ?: '-') . '<br>';
            $bloqueMedHTML .= '<b>Posología:</b> ' . ($m->posologia ?: '-') . '<br><br>';
        }
        // Usamos una sola columna ancha (Tamaño 6.5pt para asegurar que quepa todo)
        $writeAbs(12, $y, 186, 195, $bloqueMedHTML, 'L', 6.5);

        // ==========================================
        // INDICACIONES (Bajan dos espacios más -> Y=262)
        // ==========================================
        $yInd = 262; 
        $writeAbs(12, $yInd, 186, 5, "<b>Indicaciones:</b> " . str_replace("\n", " ", $reg->tratamiento), 'L', 7); $yInd += 6;
        $writeAbs(12, $yInd, 186, 5, "<b>Indicaciones No Farm.:</b> " . str_replace("\n", " ", $reg->Indicaciones_no_farmacologicas), 'L', 7); $yInd += 6;
        $writeAbs(12, $yInd, 186, 5, "<b>Signos de alarma:</b> " . ($reg->signnose_de_alarma ?: 'Ninguno'), 'L', 7); $yInd += 6;
        $writeAbs(12, $yInd, 130, 5, "<b>Diagnóstico:</b> " . $enfermedades, 'L', 7); $yInd += 6;
        $writeAbs(12, $yInd, 130, 5, "<b>CIE-10:</b> " . $codigosCie, 'L', 7);

        // FIRMA - A LA ALTURA DE INDICACIONES NO FARM. (Y=268)
        if ($estaFirmado) {
            $qrContent = "FIRMADO POR: " . strtoupper($nombreEspecialista) . "\nFECHA: " . $fechaFirma . "\nvalidar con firma ec";
            $pdf->write2DBarcode($qrContent, 'QRCODE,H', 140, 268, 15, 15, ['border' => 0, 'fgcolor' => [0,0,0], 'bgcolor' => false], 'N');
            $writeAbs(156, 268, 50, 15, 'FIRMADO DIGITALMENTE<br><b>' . substr($nombreEspecialista, 0, 22) . '</b><br>' . $fechaFirma . '<br>validar con firma ec', 'L', 6.5);
        }

        // FIX: Garantizar que el PDF A4 sea SIEMPRE exactamente 1 página
        while ($pdf->getNumPages() > 1) {
            $pdf->deletePage($pdf->getNumPages());
        }

        $pdf->Output($rutaPDF, 'F');
        return $rutaPDF;
    } catch (Exception $e) { 
        throw new Exception("Error interno al generar PDF (A4): " . $e->getMessage() . " - Ruta: " . $rutaPDF); 
    }
}