<?php

use App\Enums\KeyValue;
use Artisaninweb\SoapWrapper\SoapWrapper;
use Codedge\Fpdf\Fpdf\Fpdf;
use Illuminate\Support\Facades\Session;

function SOAP_WRAPPER($data, $result, $SoapService)
{
    $soapWrapper = new SoapWrapper;

    $wsdl = config('services.molina.online.wsdl');

    $soapWrapper->add('munimolina', fn ($service) => $service->wsdl($wsdl)
        ->options([
            'trace' => true,                 // MUY IMPORTANTE: Habilita el rastreo
            'connection_timeout' => 60,      // Previene timeouts tempranos de la conexión
            'exceptions' => true,            // Debe estar en true
        ])
    );

    // Intentamos la llamada dentro de un bloque try-catch para manejar el error
    try {
        return $soapWrapper->call("munimolina.$SoapService", $data);
    } catch (\SoapFault $e) {
        // Se requiere el objeto cliente nativo para obtener el trace
        $client = $soapWrapper->client('munimolina');

        // Lógica para obtener y loguear el cuerpo de la respuesta que falla:
        $lastResponse = $client->__getLastResponse();
        $lastRequest = $client->__getLastRequest();

        \Log::error("SOAP FAULT en {$SoapService}: " . $e->getMessage(), [
            'WSDL' => $wsdl,
            'Request_XML' => $lastRequest ?? 'No Request Captured',
            'Response_RAW' => $lastResponse ?? 'No Response Captured (Check network/timeout)'
        ]);

        // Relanzar la excepción para que el usuario la vea o la maneje Laravel
        throw $e;
    }

}

function generateXMLConsulta($merchantId, $eTicket): string
{
    $xmlIn = '<?xml version="1.0" encoding="UTF-8"?>';
    $xmlIn .= <<<XML
        <consulta_eticket>
            <parametros>
                <parametro id="CODTIENDA">$merchantId</parametro>
                <parametro id="ETICKET">$eTicket</parametro>
            </parametros>
        </consulta_eticket>
    XML;

    return $xmlIn;
}

function generateXMLLiquidacion($orderId, $amount): string
{
    $merchantId = config('constants.COMMERCE_CODE');

    $xmlIn = '<?xml version="1.0" encoding="UTF-8"?>';
    $xmlIn .= <<<XML
        <nuevo_eticket>
            <parametros>
                <parametro id="CANAL">3</parametro>
                <parametro id="PRODUCTO">1</parametro>

                <parametro id="CODTIENDA">$merchantId</parametro>
                <parametro id="NUMORDEN">$orderId</parametro>
                <parametro id="MOUNT">$amount</parametro>
            </parametros>
        </nuevo_eticket>
    XML;

    return $xmlIn;
}

function RecuperaEticket($xmlDoc): ?string
{
    $xpath = new DOMXPath($xmlDoc);

    $nodeList = $xpath->query("//registro/campo[@id='ETICKET']");

    $XmlNode = $nodeList->item(0);

    if ($XmlNode == null) {
        return '';
    }

    return $XmlNode->nodeValue;
}

function CantidadMensajes($xmlDoc): int
{
    $xpath = new DOMXPath($xmlDoc);

    $nodeList = $xpath->query('//mensajes', $xmlDoc);

    $XmlNode = $nodeList->item(0);

    if ($XmlNode == null) {
        return 0;
    }

    return $XmlNode->childNodes->length;
}

function RecuperaMensaje($xmlDoc, $iNumMensaje): ?string
{
    $xpath = new DOMXPath($xmlDoc);

    $nodeList = $xpath->query("//mensajes/mensaje[@id='".$iNumMensaje."']");

    $XmlNode = $nodeList->item(0);

    if (is_null($XmlNode)) {
        return '';
    }

    return $XmlNode->nodeValue;
}

function htmlRedirecFormEticket($eTicket)
{
    $URLVisa = config('constants.URL_FORMULARIO_VISA');

    return <<<HTML
        <html lang="es">
            <head>
                <title>Pagina Prueba | Visa</title>
            </head>
            <body onload="fm.submit();">
                <form name="fm" method="post" action="'.$URLVisa.'">
                    <input type="hidden" name="ETICKET" value="$eTicket" /><BR>
                </form>
            </body>
        </html>
    HTML;
}

function htmlRedirecFormAnt($merchantId, $orderId, $amount): string
{
    $URLVisa = config('constants.URL_FORMULARIO_VISA');

    return <<<HTML
        <html lang="es">
            <head>
                <title>Pagina Prueba | Visa</title>
            </head>
            <body onload="fm.submit();">
                <form name="fm" method="post" action="$URLVisa">
                    <input type="hidden" name="CODTIENDA" value="$merchantId" /><BR>
                    <input type="hidden" name="NUMORDEN" value="$orderId" /><BR>
                    <input type="hidden" name="MOUNT" value="$amount" /><BR>
                </form>
            </body>
        </html>
    HTML;
}

function CantidadOperaciones($xmlDoc, $eTicket): int
{
    $xpath = new DOMXPath($xmlDoc);

    $nodeList = $xpath->query('//pedido[@eticket="'.$eTicket.'"]', $xmlDoc);

    $XmlNode = $nodeList->item(0);

    if (is_null($XmlNode)) {
        return 0;
    }

    return $XmlNode->childNodes->length;
}

function RecuperaCampos($xmlDoc, $sNumOperacion, $nomCampo): ?string
{
    $strReturn = '';

    $xpath = new DOMXPath($xmlDoc);

    $nodeList = $xpath->query("//operacion[@id='".$sNumOperacion."']/campo[@id='".$nomCampo."']");

    $XmlNode = $nodeList->item(0);

    if (is_null($XmlNode)) {
        return '';
    }

    return $XmlNode->nodeValue;
}

function PresentaResultado($xmlDoc, $iNumOperacion): array
{
    $sNumOperacion = '';

    $sNumOperacion = $iNumOperacion;

    $result['cod_error'] = getMensajeError(RecuperaCampos($xmlDoc, $sNumOperacion, 'cod_accion'));

    $result['estado'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'estado');

    $result['num_pedido'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'nordent');

    $result['nombre_th'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'nombre_th');

    $result['num_tarjeta'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'pan');

    $result['imp_autorizado'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'imp_autorizado');

    $result['fecha'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'fechayhora_tx');

    $result['pan'] = RecuperaCampos($xmlDoc, $sNumOperacion, 'pan');

    return $result;
}

function getMensajeError($errorCode): string
{
    $errors = [
        '101' => 'Operación Denegada. Tarjeta Vencida. ',
        '102' => 'Operación Denegada. Contactar con emisor ',
        '104' => 'Operación Denegada. Operacion no permitida para esta tarjeta ',
        '106' => 'Operación Denegada. Intentos de pin excedidos ',
        '107' => 'Operación Denegada. Contactar con el emisor ',
        '108' => 'Operación Denegada. Exceso de actividad ',
        '109' => 'Operación Denegada. Identificación inválida de establecimiento ',
        '110' => 'Operación Denegada. Operacion no permitida para esta tarjeta ',
        '111' => 'Operación Denegada. El monto de la transacción supera el valor máximo permitido para operaciones virtuales ',
        '112' => 'Operación Denegada. Se requiere clave ',
        '116' => 'Operación Denegada. Fondos insuficientes. ',
        '117' => 'Operación Denegada. Clave incorrecta ',
        '118' => 'Operación Denegada. Tarjeta Inválida. ',
        '119' => 'Operación Denegada. Exceso de intentos de ingreso de PIN ',
        '121' => 'Operación Denegada. ',
        '126' => 'Operación Denegada. PIN inválido ',
        '129' => 'Operación Denegada. Tarjeta no operativa ',
        '180' => 'Operación Denegada. Tarjeta inválida ',
        '181' => 'Operación Denegada Tarjeta con restricciones de Débito ',
        '182' => 'Operación Denegada. Tarjeta con restricciones de Crédito ',
        '183' => 'Operación Denegada. Error de sistema ',
        '190' => 'Operación Denegada. Contactar con emisor ',
        '191' => 'Operación Denegada. Contactar con emisor ',
        '192' => 'Operación Denegada. Contactar con emisor ',
        '199' => 'Operación Denegada. ',
        '201' => 'Operación Denegada. Tarjeta Vencida. ',
        '202' => 'Operación Denegada. Contactar con emisor ',
        '204' => 'Operación Denegada. Operación no permitida para esta tarjeta ',
        '206' => 'Operación Denegada. Exceso de intentos de ingreso de PIN ',
        '207' => 'Operación Denegada. Contactar con emisor ',
        '208' => 'Operación Denegada. Tarjeta Perdida. ',
        '209' => 'Operación Denegada. Tarjeta Robada. ',
        '263' => 'Operación Denegada. Error en el envío de parámetros. ',
        '264' => 'Operación Denegada. Banco Emisor no esta disponible para realizar la autenticación. ',
        '265' => 'Operación Denegada. Password de tarjeta habiente incorrecto. ',
        '266' => 'Operación Denegada. Tarjeta Vencida. ',
        '280' => 'Operación Denegada. Clave errónea ',
        '290' => 'Operación Denegada. Contactar con emisor ',
        '300' => 'Operación Denegada. Número de pedido del comercio duplicado. Favor no atender. ',
        '306' => 'Operación Denegada. Contactar con emisor ',
        '401' => 'Operación Denegada. Tienda inhabilitada ',
        '402' => 'Operación Denegada. Tienda con rango de IP no valido. ',
        '403' => 'Operación Denegada. Tarjeta no autenticada ',
        '404' => 'Operación Denegada. El monto de la transacción supera el valor máximo permitido ',
        '405' => 'Operación Denegada. La tarjeta ha superado la cantidad máxima de transacciones en el día. ',
        '406' => 'Operación Denegada. La tienda ha superado la cantidad máxima de transacciones en el día. ',
        '407' => 'Operación Denegada. El monto de la transacción no llega al mínimo permitido. ',
        '408' => 'Operación Denegada. CVV2 no coincide ',
        '409' => 'Operación Denegada. CVV2 no procesado por Banco ',
        '410' => 'Operación Denegada. CVV2 no procesado por no ingresado ',
        '411' => 'Operación Denegada. CVV2 no procesado por Banco ',
        '412' => 'Operación Denegada. CVV2 no reconocido por Banco ',
        '413' => 'Operación Denegada. Contactar con emisor ',
        '414' => 'Operación Denegada. ',
        '415' => 'Operación Denegada. ',
        '416' => 'Operación Denegada. ',
        '417' => 'Operación Denegada. ',
        '418' => 'Operación Denegada. ',
        '419' => 'Operación Denegada. ',
        '420' => 'Operación Denegada. Tarjeta no es VISA ',
        '421' => 'Operación Denegada. Contactar con emisor ',
        '422' => 'Operación Denegada. El comercio no está configurado para usar este medio de pago. ',
        '423' => 'Operación Denegada. Se canceló el proceso de pago / Cancelled checkout. ',
        '424' => 'Operación Denegada. Contactar con emisor ',
        '425' => 'Operación Denegada. País emisor incorrecto ',
        '666' => 'Operación Denegada. Problemas de comunicación. Intente mas tarde. ',
        '667' => 'Operación Denegada. Transacción sin autenticación. ',
        '668' => 'Operación Denegada. ',
        '669' => 'Operación Denegada. ',
        '670' => 'Operación Denegada. ',
        '807' => 'Operación Denegada. Contactar con emisor ',
        '900' => 'Operación Denegada. Contactar con emisor ',
        '904' => 'Operación Denegada. Formato de mensaje erróneo ',
        '909' => 'Operación Denegada. Error de sistema ',
        '910' => 'Operación Denegada. Error de sistema ',
        '912' => 'Operación Denegada. Emisor no disponible ',
        '913' => 'Operación Denegada. Transmisión duplicada ',
        '916' => 'Operación Denegada. Contactar con emisor ',
        '928' => 'Operación Denegada. Contactar con emisor ',
        '940' => 'Operación Denegada. Transacción anulada previamente ',
        '941' => 'Operación Denegada. Transacción ya anulada previamente ',
        '942' => 'Operación Denegada. ',
        '943' => 'Operación Denegada. Datos originales distintos ',
        '945' => 'Operación Denegada. Referencia repetida ',
        '946' => 'Operación Denegada. Operación de anulación en proceso ',
        '947' => 'Operación Denegada. Comunicación duplicada ',
        '948' => 'Operación Denegada. Contactar con emisor ',
        '949' => 'Operación Denegada. Contactar con emisor ',
        '965' => 'Operación Denegada. Contactar con emisor ',
    ];

    if (array_key_exists($errorCode, $errors)) {
        return $errors[$errorCode];
    }

    return 'Operación Denegada. Error desconocido';
}

function generateHistorial(bool $condition, $arrRecibos): string
{
    $pdf = new Fpdf;

    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 8);
    $pdf->SetTextColor(0, 0, 0);

    $data = Session::get('pdfdata');

    $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
    $pdf->Image('assets/images/logo-molina.png', 10, 13, 55, 20);
    $pdf->Image('assets/images/dominioFiscal.png', -1, 42, 70, 7);
    $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
    $pdf->Image('assets/images/logo.png', 155, 221, 55, 70);

    $pdf->SetXY(9, 55);
    $pdf->Write(1, '                                 ');        /* RIF.J-30240664-1. NIT. 0026039266 */

    $pdf->SetXY(9, 60);
    $pdf->Write(1, '                                         '); /* Av. Julio Bailetti con Av. La Rosa Toro */

    $pdf->SetXY(9, 65);
    $pdf->Write(1, '             '); /* La Molina - Lima */

    // Cuadrado
    $pdf->Rect(10, 92, 186, 17.5);

    $pdf->SetXY(143, 60);
    $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
    $pdf->Write(1, $pdftext);

    $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
    $pdf->SetXY(128.7, 65);
    $pdf->Write(1, utf8_decode($pdftext));

    $pdf->Image('assets/images/historialdepagos.png', 7, 76, 192, 10);

    $pdf->SetXY(30, 95);
    $pdf->Write(1, utf8_decode($pdftext));

    $pdf->SetXY(51.8, 100);
    $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
    $pdf->Write(1, utf8_decode($pdftext));
    $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
    $pdf->SetXY(50.1, 105);
    $pdf->Write(1, utf8_decode($pdftext));

    $pdf->SetXY(10, 120);
    $pdf->Write(1, 'Numero de recibo');

    $pdf->SetXY(40, 120);
    $pdf->Write(1, 'Tipo de Tramite');

    $pdf->SetXY(93, 120);
    $pdf->Write(1, 'Periodo');

    $pdf->SetXY(107, 120);
    $pdf->Write(1, 'Total Pagado');

    $pdf->SetXY(130, 120);
    $pdf->Write(1, 'Fecha de transaccion');

    $anio = utf8_decode('Año');
    $pdf->SetXY(165, 120);
    $pdf->Write(1, $anio);

    $pdf->SetXY(189, 120);
    $pdf->Write(1, 'Lugar');

    $pdf->SetLineWidth(0.6);
    $pdf->Line(9, 123, 201, 123);

    $min = 123 + 6;
    $n = 13;

    $i = 0;
    $t = 0;

    foreach ($arrRecibos as $recibo) {
        $aux = preg_replace('/\s+/', ' ', $recibo->pagnumero);
        $pdf->SetXY(10, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $aux);

        $pdf->SetXY(40, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagtipotramite);

        $pdf->SetXY(96, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagperiodo);

        $pdf->SetXY(110, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagmonto);

        $pdf->SetXY(135, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagfecha); // Reajuste

        $pdf->SetXY(164, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->paganyo); // Interes

        $pdf->SetXY(180, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->paglugar);

        $pdf->SetLineWidth(0.8);
        $pdf->Line(9, $min + 6 * ($i), 201, $min + 6 * ($i));

        $i++;

        if ($i == $n) {
            $i = 0;

            $pdf->AddPage();
            $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
            $pdf->Image('assets/images/logo-molina.png', 7, 10, 45, 15);
            $pdf->Image('assets/images/dominioFiscal.png', 7, 42, 45, 6);
            $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
            $pdf->Image('assets/images/logo.png', 157, 230, 40, 50);

            $pdf->SetXY(9, 55);
            $pdf->Write(1, '                    '); /* RIF.J-30240664-1. NIT. 0026039266 */

            $pdf->SetXY(9, 60);
            $pdf->Write(1, '                           '); /* Av. Julio Bailetti con Av. La Rosa Toro */

            $pdf->SetXY(9, 65);
            $pdf->Write(1, '');                            /* La Molina - Lima */

            // Cuadrado
            $pdf->Rect(10, 92, 186, 17.5);

            $pdf->SetXY(143, 60);
            $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
            $pdf->Write(1, $pdftext);

            $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
            $pdf->SetXY(128.7, 65);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->Image('assets/images/historialdepagos.png', 7, 76, 192, 10);

            $pdf->SetXY(30, 95);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->SetXY(51.8, 100);
            $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
            $pdf->Write(1, utf8_decode($pdftext));
            $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
            $pdf->SetXY(50.1, 105);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->SetXY(10, 120);
            $pdf->Write(1, 'Numero de recibo');

            $pdf->SetXY(40, 120);
            $pdf->Write(1, 'Tipo de Tramite');

            $pdf->SetXY(70, 120);
            $pdf->Write(1, 'Periodo');

            $pdf->SetXY(90, 120);
            $pdf->Write(1, 'Total Pagado');

            $pdf->SetXY(115, 120);
            $pdf->Write(1, 'Fecha de transaccion');

            $anio = utf8_decode('Año');
            $pdf->SetXY(150, 120);
            $pdf->Write(1, $anio);

            $pdf->SetXY(173, 120);
            $pdf->Write(1, 'Lugar');

            $pdf->SetLineWidth(0.6);
            $pdf->Line(9, 123, 201, 123);

        }

    }

    $filename = 'recibo.pdf';

    if ($condition) {
        return $pdf->Output('I', $filename);
    }

    return $pdf->Output('S', $filename);
}

function generateEstadoCuenta(bool $condition, $arrRecibos): string
{
    $pdf = new Fpdf;

    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 8);
    $pdf->SetTextColor(0, 0, 0);

    $data = Session::get('pdfdata');

    $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
    $pdf->Image('assets/images/logo-molina.png', 5, 10, 24, 24);
    $pdf->Image('assets/images/dominioFiscal.png', -1, 42, 70, 7);
    $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
    $pdf->Image('assets/images/logo.png', 163, 250, 40, 40);

    $pdf->SetXY(9, 55);
    $pdf->Write(1, '');   /* RIF.J-30240664-1. NIT. 0026039266 */

    $pdf->SetXY(9, 60);
    $pdf->Write(1, '    ');  /* Av. Julio Bailetti con Av. La Rosa Toro */

    $pdf->SetXY(9, 65);
    $pdf->Write(1, 'La Molina - Lima'); /* La Molina - Lima */

    // Cuadrado
    $pdf->Rect(10, 92, 186, 17.5);

    $pdf->SetXY(143, 60);
    $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
    $pdf->Write(1, $pdftext);

    $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
    $pdf->SetXY(128.7, 65);
    $pdf->Write(1, utf8_decode($pdftext));

    $pdf->Image('assets/images/cuenta.png', 7, 76, 192, 10);

    $pdf->SetXY(30, 95);
    $pdf->Write(1, utf8_decode($pdftext));

    $pdf->SetXY(51.8, 100);
    $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
    $pdf->Write(1, utf8_decode($pdftext));
    $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
    $pdf->SetXY(50.1, 105);
    $pdf->Write(1, utf8_decode($pdftext));

    $aux = mb_convert_encoding('Tipo de Trámite', 'ISO-8859-1', 'UTF-8');
    $pdf->SetXY(10, 120);
    $pdf->Write(1, $aux);

    $aux = mb_convert_encoding('Año', 'ISO-8859-1', 'UTF-8');
    $pdf->SetXY(46, 120);
    $pdf->Write(1, $aux);

    $pdf->SetXY(55, 120);
    $pdf->Write(1, 'Periodo');

    $pdf->SetXY(74, 120);
    $pdf->Write(1, 'Fec. Venc.');

    $pdf->SetXY(105, 120);
    $pdf->Write(1, 'Situacion');

    $pdf->SetXY(130, 120);
    $pdf->Write(1, 'Reajuste');

    $pdf->SetXY(145, 120);
    $pdf->Write(1, 'Interes');

    $aux = mb_convert_encoding('Emisión', 'ISO-8859-1', 'UTF-8');
    $pdf->SetXY(160, 120);
    $pdf->Write(1, $aux);

    $pdf->SetXY(180, 120);
    $pdf->Write(1, 'Total');

    $pdf->SetLineWidth(0.8);
    $pdf->Line(9, 123, 201, 123);

    $min = 123 + 6;
    $n = 13;

    $i = 0;
    $t = 0;

    foreach ($arrRecibos as $recibo) {
        $aux = preg_replace('/\s+/', ' ', $recibo->tributario);
        $pdf->SetXY(10, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $aux);

        $pdf->SetXY(45.5, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->anyoimp);

        $pdf->SetXY(57, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->periodo);

        $pdf->SetXY(73, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->fechvenc);

        $situacion = substr($recibo->situacion, 0, 21);
        $pdf->SetXY(95, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $situacion);

        $pdf->SetXY(130, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->total); // Reajuste

        $pdf->SetXY(145, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->mora); // Interes

        $pdf->SetXY(160, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->costoemi);

        $pdf->SetXY(180, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->total);

        $pdf->SetLineWidth(0.8);
        $pdf->Line(9, $min + 6 * ($i), 201, $min + 6 * ($i));

        $i++;

        if ($i == $n) {
            $i = 0;

            $pdf->AddPage();
            $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
            $pdf->Image('assets/images/logo-molina.png', 5, 10, 24, 24);
            $pdf->Image('assets/images/dominioFiscal.png', -1, 42, 70, 7);
            $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
            $pdf->Image('assets/images/logo.png', 163, 250, 40, 40);

            $pdf->SetXY(9, 55);
            $pdf->Write(1, '');     /* RIF.J-30240664-1. NIT. 0026039266 */

            $pdf->SetXY(9, 60);
            $pdf->Write(1, '        '); /* Av. Julio Bailetti con Av. La Rosa Toro */

            $pdf->SetXY(9, 65);
            $pdf->Write(1, '');          /* La Molina - Lima */

            // Cuadrado
            $pdf->Rect(10, 92, 186, 17.5);

            $pdf->SetXY(143, 60);
            $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
            $pdf->Write(1, $pdftext);

            $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
            $pdf->SetXY(128.7, 65);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->Image('assets/images/cuenta.png', 7, 76, 192, 10);

            $pdf->SetXY(30, 95);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->SetXY(51.8, 100);
            $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
            $pdf->Write(1, utf8_decode($pdftext));
            $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
            $pdf->SetXY(50.1, 105);
            $pdf->Write(1, utf8_decode($pdftext));

            $aux = utf8_decode('Tipo de Trámite');
            $pdf->SetXY(10, 120);
            $pdf->Write(1, $aux);

            $aux = utf8_decode('Año');
            $pdf->SetXY(46, 120);
            $pdf->Write(1, $aux);

            $pdf->SetXY(55, 120);
            $pdf->Write(1, 'Periodo');

            $pdf->SetXY(74, 120);
            $pdf->Write(1, 'Fec. Venc.');

            $pdf->SetXY(105, 120);
            $pdf->Write(1, 'Situacion');

            $pdf->SetXY(130, 120);
            $pdf->Write(1, 'Reajuste');

            $pdf->SetXY(145, 120);
            $pdf->Write(1, 'Interes');

            $aux = mb_convert_encoding('Emisión', 'ISO-8859-1', 'UTF-8');
            $pdf->SetXY(160, 120);
            $pdf->Write(1, $aux);

            $pdf->SetXY(180, 120);
            $pdf->Write(1, 'Total');

            $pdf->SetLineWidth(0.8);
            $pdf->Line(9, 123, 201, 123);
        }
    }

    $filename = 'recibo.pdf';

    if ($condition) {
        return $pdf->Output('I', $filename);
    }

    return $pdf->Output('S', $filename);
}

function generateRecibo(bool $condition, $arrRecibos): string
{
    $pdf = new Fpdf;

    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 8);
    $pdf->SetTextColor(0, 0, 0);

    $data = Session::get('pdfdata');

    $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
    $pdf->Image('assets/images/logo-molina.png', 5, 10, 24, 24);
    $pdf->Image('assets/images/dominioFiscal.png', -1, 40, 70, 7);
    $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
    $pdf->Image('assets/images/logo.png', 163, 250, 40, 40);

    $pdf->SetXY(9, 55);
    $pdf->Write(1, '');    /* RIF.J-30240664-1. NIT. 0026039266 */

    $pdf->SetXY(9, 60);
    $pdf->Write(1, '');     /* Av. Julio Bailetti con Av. La Rosa Toro */

    $pdf->SetXY(9, 65);
    $pdf->Write(1, '');      /* La Molina - Lima */

    // Cuadrado
    $pdf->Rect(10, 92, 186, 17.5);

    $pdf->SetXY(143, 60);
    $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
    $pdf->Write(1, $pdftext);

    $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
    $pdf->SetXY(128.7, 65);
    $pdf->Write(1, mb_convert_encoding($pdftext, 'ISO-8859-1', 'UTF-8'));

    $pdf->Image('assets/images/reciboPago.png', 7, 76, 192, 10);

    $pdf->SetXY(30, 95);
    $pdf->Write(1, mb_convert_encoding($pdftext, 'ISO-8859-1', 'UTF-8'));

    $pdf->SetXY(51.8, 100);
    $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
    $pdf->Write(1, mb_convert_encoding($pdftext, 'ISO-8859-1', 'UTF-8'));
    $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
    $pdf->SetXY(50.1, 105);
    $pdf->Write(1, mb_convert_encoding($pdftext, 'ISO-8859-1', 'UTF-8'));

    $pdf->SetXY(10, 120);
    $pdf->Write(1, 'Numero de recibo');

    $pdf->SetXY(50, 120);
    $pdf->Write(1, 'Tipo de Tramite');

    $pdf->SetXY(88, 120);
    $pdf->Write(1, 'Periodo');

    $pdf->SetXY(130, 120);
    $pdf->Write(1, 'Fecha de transaccion');

    $pdf->SetXY(165, 120);
    $pdf->Write(1, 'Monto');

    $pdf->SetLineWidth(0.6);
    $pdf->Line(9, 123, 201, 123);

    $min = 123 + 6;
    $n = 13;

    $i = 0;
    $t = 0;

    foreach ($arrRecibos as $recibo) {
        $aux = preg_replace('/\s+/', ' ', $recibo->pagnumero);
        $pdf->SetXY(10, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $aux);

        $pdf->SetXY(50, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagconcepto);

        $pdf->SetXY(88, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagperiodo);

        $pdf->SetXY(140, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->paganyo);

        $pdf->SetXY(165, 119.5 + 6 * ($i + 1));
        $pdf->Write(1, $recibo->pagmonto);

        $pdf->SetLineWidth(0.8);
        $pdf->Line(9, $min + 6 * ($i), 201, $min + 6 * ($i));

        $i++;

        if ($i == $n) {
            $i = 0;

            $pdf->AddPage();
            $pdf->Image('assets/images/bartop.png', -1, 0, 211, 6);
            $pdf->Image('assets/images/logo-molina.png', 5, 10, 24, 24);
            $pdf->Image('assets/images/dominioFiscal.png', -1, 40, 70, 7);
            $pdf->Image('assets/images/bartop.png', -1, 291, 211, 6);
            $pdf->Image('assets/images/logo.png', 163, 250, 45, 45);

            $pdf->SetXY(9, 55);
            $pdf->Write(1, '');  /* RIF.J-30240664-1. NIT. 0026039266 */

            $pdf->SetXY(9, 60);
            $pdf->Write(1, '');   /* Av. Julio Bailetti con Av. La Rosa Toro */

            $pdf->SetXY(9, 65);
            $pdf->Write(1, '   '); /* La Molina - Lima */

            // Cuadrado
            $pdf->Rect(10, 92, 186, 17.5);

            $pdf->SetXY(143, 60);
            $pdftext = 'Fecha y Hora :  '.date('d-m-Y');
            $pdf->Write(1, $pdftext);

            $pdftext = 'Código del Contribuyente :  '.Session::get(KeyValue::TOKEN_API->value);
            $pdf->SetXY(128.7, 65);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->Image('assets/images/reciboPago.png', 7, 76, 192, 10);

            $pdf->SetXY(30, 95);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->SetXY(51.8, 100);
            $pdftext = 'Nombre : '.Session::get('Datos')['nomb'];
            $pdf->Write(1, utf8_decode($pdftext));
            $pdftext = 'Dirección : '.Session::get('Datos')['direccion'];
            $pdf->SetXY(50.1, 105);
            $pdf->Write(1, utf8_decode($pdftext));

            $pdf->SetXY(10, 120);
            $pdf->Write(1, 'Numero de recibo');

            $pdf->SetXY(50, 120);
            $pdf->Write(1, 'Tipo de Tramite');

            $pdf->SetXY(90, 120);
            $pdf->Write(1, 'Periodo');

            $pdf->SetXY(110, 120);
            $pdf->Write(1, 'Fecha de transaccion');

            $pdf->SetXY(145, 120);
            $pdf->Write(1, 'Monto');

            $pdf->SetLineWidth(0.6);
            $pdf->Line(9, 123, 201, 123);
        }
    }

    $filename = 'recibo.pdf';

    if ($condition) {
        return $pdf->Output('D', $filename);
    }

    return $pdf->Output('S', $filename);
}
