<?php
require_once "../modelos/Persona.php";

// Función auxiliar para fecha en palabras
function fechaEs($fecha)
{
    if (!$fecha)
        return "..............";
    $meses = ["", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
    $time = strtotime($fecha);
    return date('d', $time) . " de " . $meses[date('n', $time)] . " del " . date('Y', $time);
}

// Función para numero a letras (Simplificada)
function numeroALetras($num)
{
    $formatter = new NumberFormatter("es", NumberFormatter::SPELLOUT);
    return strtoupper($formatter->format($num));
}

function generarPDFCertificado($iddocumento, $idatencion, $idpersona, $tipo, $datos, $paramsFirma = [])
{
    if (ob_get_length())
        ob_clean();

    // Obtener datos del paciente
    $persona = new Persona();
    $reg = null;
    $diagnosticos = "";

    if (!empty($idatencion)) {
        // Modo Vinculado a Atención (Historia Clínica existente)
        $rspta = $persona->imprimirHistoria($idatencion);
        $reg = $rspta->fetch_object(); // Datos básicos atención y paciente

        // Diagnósticos de la atención
        $rspta3 = $persona->imprimirDetalleHistoria($idatencion);
        while ($diag = $rspta3->fetch_object()) {
            $diagnosticos .= "<li>" . strtoupper($diag->enfermedad) . " (CIE-10: " . strtoupper($diag->codigo) . ")</li>";
        }
    } else if (!empty($idpersona)) {
        // Modo Independiente (Solo Paciente)
        // CAMBIO: Usar metodo nuevo que no depende de atencion
        $reg = $persona->imprimirDatosPaciente($idpersona);
        $reg = (object) $reg; // Asegurar que sea objeto

        // En modo independiente, los diagn贸sticos deben venir en el JSON de datos
        if (isset($datos['diagnosticos_texto']) && !empty($datos['diagnosticos_texto'])) {
            $diagnosticos = $datos['diagnosticos_texto']; // Ya formateado o texto libre
        }
    }

    if (!$reg) {
        return false; // Error: No se encontraron datos
    }

    // Cargar TCPDF
    $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';
    
    $tcpdfFile = '';
    $rutasProbar = [
        $docRoot . '/tcpdf/tcpdf.php',
        $cpanelSharedPath,
        $baseDir . '/tcpdf/tcpdf.php',
        $baseDir . '/../tcpdf/tcpdf.php',
        $baseDir . '/public/tcpdf/tcpdf.php',
        $baseDir . '/../public/tcpdf/tcpdf.php'
    ];
    foreach ($rutasProbar as $ruta) {
        if (file_exists($ruta)) {
            $tcpdfFile = $ruta;
            break;
        }
    }
    if (!$tcpdfFile) {
        $busqueda = glob($baseDir . '/public/*/tcpdf.php');
        $tcpdfFile = !empty($busqueda) ? $busqueda[0] : '';
    }
    if (!$tcpdfFile)
        throw new Exception("TCPDF no encontrado.");
    require_once($tcpdfFile);

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetCreator('HC Medica');
    $pdf->SetTitle('Certificado Medico');
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->SetMargins(25.4, 30, 25.4); // 2.54 cm margins (approx APA)
    $pdf->SetAutoPageBreak(TRUE, 25);
    $pdf->AddPage();

    // BANNER
    $bannerPath = $baseDir . '/public/img/banner.png'; // Fix path logic just in case
    if (file_exists($bannerPath)) {
        $pdf->Image($bannerPath, 25, 10, 160, 0, 'PNG'); // Centered relative to margins
    }
    $pdf->Ln(25);

    // CSS STYLES (APA-ish)
    $html = '<style>
        body { font-family: "Times New Roman", serif; font-size: 12pt; color: #000; line-height: 1.5; }
        .titulo { text-align: center; font-weight: bold; font-size: 16pt; margin-bottom: 20px; }
        .contenido { text-align: justify; text-justify: inter-word; }
        .negrita { font-weight: bold; }
        ul { list-style-type: disc; }
    </style>';

    $html .= '<div class="titulo">CERTIFICADO MÉDICO</div><br><br>';

    // BLOQUE COMÚN: Identificación
    $fechaEmision = fechaEs(date('Y-m-d'));

    // Cálculo de edad preciso si está disponible, sino usar el del reg
    $textoEdad = $reg->edad;

    $textoInicio = 'Certifico haber atendido al paciente <span class="negrita">' . strtoupper($reg->paciente) . '</span>, 
    portador del documento de identidad N° <span class="negrita">' . $reg->num_documento . '</span>, 
    de <span class="negrita">' . $textoEdad . '</span> de edad, sexo ' . $reg->sexo . '.';

    if ($tipo == 'REPOSO') {
        $dias = isset($datos['dias']) ? $datos['dias'] : 1;
        $diasLetras = numeroALetras($dias);
        $fechaInicio = isset($datos['fecha_inicio']) ? fechaEs($datos['fecha_inicio']) : fechaEs(date('Y-m-d'));
        $fechaFin = isset($datos['fecha_fin']) ? fechaEs($datos['fecha_fin']) : '...............';
        $contingencia = isset($datos['contingencia']) ? $datos['contingencia'] : 'ENFERMEDAD GENERAL';

        $html .= '<div class="contenido">
            ' . $textoInicio . '<br><br>
            Quien presenta el siguiente diagnóstico CI-10:<br>
            <ul>' . $diagnosticos . '</ul>
            <br>
            Contingencia: <span class="negrita">' . strtoupper($contingencia) . '</span>.<br><br>
            Por lo cual prescribo <span class="negrita">' . $dias . ' (' . $diasLetras . ') DÍAS DE REPOSO OBLIGATORIO</span>, 
            a partir del ' . $fechaInicio . ' hasta el ' . $fechaFin . ' (inclusive).<br><br>
            Se recomienda seguir estrictamente el tratamiento prescrito.
        </div>';

    } else if ($tipo == 'PERSONALIZADO') {
        $textoLibre = isset($datos['texto_libre']) ? nl2br($datos['texto_libre']) : '';
        $html .= '<div class="contenido">
            ' . $textoInicio . '<br><br>
            ' . $textoLibre . '
        </div>';

    } else { // MEDICO GENERAL (CUS/ESTANDAR)
        $html .= '<div class="contenido">
            ' . $textoInicio . '<br><br>
            Al momento del examen físico, el paciente se encuentra:<br>
            <ul>' . $diagnosticos . '</ul>
            <br>
            Observaciones:<br>
            ' . (isset($datos['observaciones']) ? $datos['observaciones'] : 'Paciente clinicamente estable.') . '<br><br>
            Documento expedido a petición de la parte interesada para los fines pertinentes.
        </div>';
    }

    $html .= '<br><br><br>
    <div style="text-align: right;">Fecha de Emisión: ' . $fechaEmision . '</div>';

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

    // FIRMA ELECTRÓNICA
    if (!empty($paramsFirma)) {
        if (!isset($paramsFirma['rutaCert']) || !file_exists($paramsFirma['rutaCert'])) {
            throw new Exception("El archivo del certificado digital no se encuentra en la ruta temporal.");
        }

        $certificadoContent = file_get_contents($paramsFirma['rutaCert']);
        $certs = [];
        if (openssl_pkcs12_read($certificadoContent, $certs, $paramsFirma['password'])) {
            // 1. Firma Digital (Metadatos internos del PDF)
            $pdf->setSignature($certs['cert'], $certs['pkey'], $paramsFirma['password'], '', 2, $paramsFirma['info']);

            // QR oficial (Más denso y profesional)
            $x_firma = 50;
            $y_firma = $pdf->GetY() + 15; // Un poco más de espacio
            if ($y_firma > 230)
                $y_firma = 230;

            $styleQR = array(
                'border' => false,
                'vpadding' => 0,
                'hpadding' => 0,
                'fgcolor' => array(0, 0, 0),
                'bgcolor' => false,
                'module_width' => 1,
                'module_height' => 1,
                'position' => 'N'
            );
            // QR con datos de texto (Solicitud del usuario)
            $fechaFirma = date('Y-m-d H:i:s');
            $qrText = "FIRMADO POR: " . strtoupper($paramsFirma['info']['medico']) . "\n";
            $qrText .= "RAZON: " . $paramsFirma['info']['razon'] . "\n";
            $qrText .= "FECHA: " . $fechaFirma . "\n";
            $qrText .= "VALIDAR CON: firmadigital.gob.ec";

            $pdf->write2DBarcode($qrText, 'QRCODE,H', $x_firma, $y_firma, 24, 24, $styleQR, 'N');

            // 2. Dibujar Texto (Derecha del QR, fuente Courier)
            $pdf->SetTextColor(0, 0, 0);
            $pdf->SetFont('courier', '', 9);
            $pdf->SetXY($x_firma + 25, $y_firma + 2);
            $pdf->Cell(0, 0, "Firmado electrónicamente por:", 0, 0, 'L');

            $pdf->SetFont('courier', 'B', 13);
            $pdf->SetXY($x_firma + 25, $y_firma + 6);
            $pdf->MultiCell(110, 5, strtoupper($paramsFirma['info']['medico']), 0, 'L', false);

            $pdf->SetFont('courier', '', 8);
            $pdf->SetXY($x_firma + 25, $y_firma + 18);
            $pdf->Cell(0, 0, "Validar únicamente con FirmaEC", 0, 0, 'L');
        } else {
            throw new Exception("La contraseña del certificado digital es incorrecta o el archivo está dañado.");
        }
    }

    $baseDir = dirname(__DIR__);
    $carpetaCertificados = $baseDir . '/files/certificados';

    // Crear carpeta si no existe
    if (!file_exists($carpetaCertificados)) {
        mkdir($carpetaCertificados, 0755, true);
    }

    $rutaPDF = $carpetaCertificados . '/temp_cert_' . $iddocumento . '.pdf';
    $pdf->Output($rutaPDF, 'F');
    return $rutaPDF;
}
?>