<?php

namespace App\Libraries;
use CodeIgniter\CLI\CLI;
use App\Models\CatalogosMHModel;
use App\Libraries\Tcpdf_lib;

class FacturacionElectronica{

    protected $apiEndpoint;
    protected $apiKey;
    protected $apiSecret;

    const MHCAT_TIPODUCUMENTO 		= 'CAT-002';
	const MHCAT_MODELOFACTURACION 	= 'CAT-003';
	const MHCAT_TIPOTRANSMISION		= 'CAT-004';
	const MHCAT_DEPARTAMENTO		= 'CAT-012';
	const MHCAT_MUNICIPIO			= 'CAT-013';
	const MHCAT_CONDICIONOPERACION	= 'CAT-016';
	const MHCAT_TIPODOCRECEPTOR		= 'CAT-022';

    public function __construct($env)
    {
        $this->MHenv = $env['mhenv'];
        $this->apiEndpoint = $env['apiendpoint'];
        $this->apiKey = $env['apikey'];
        $this->apiSecret = $env['apisecret'];
    }
    //
    /*public function consultarDTE($numControl)*/
    public function consultarDTE($codigoGeneracion)
    {
        $ch = curl_init();
        //$apiUrl =  $this->apiEndpoint.'cda/dte/documento/'.$numControl;
        $apiUrl =  $this->apiEndpoint.'cda/dte/documento/'.$codigoGeneracion;
        curl_setopt($ch, CURLOPT_URL, $apiUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "X-API-KEY: $this->apiKey",
            "X-API-SECRET: $this->apiSecret",
        ]);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $response = curl_exec($ch);
        $dte = null;
        if ($response === false) {
            $error = curl_error($ch);
            throw new \Exception($error);
        } else {
            $strError = "org.facturasv.api.excepcion.ErrorDeRecepcionException:";
		    $strClean = str_replace($strError, '', $response);
            $dteAPI = json_decode($strClean, true);
            
            if (json_last_error() === JSON_ERROR_NONE) {
                $dte = $dteAPI;
            }
            //$dte = json_decode($response, true);
        }
    
        return $dte;
    }
    public function consularRango($desde, $hasta, $tipo)
    {
        $ch = curl_init();
        $apiUrl =  $this->apiEndpoint.'cda/dte/documentosPorRango?desde='.$desde.'&hasta='.$hasta.'&tipoDte='.$tipo;
        curl_setopt($ch, CURLOPT_URL, $apiUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "X-API-KEY: $this->apiKey",
            "X-API-SECRET: $this->apiSecret",
        ]);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $response = curl_exec($ch);
        $dte = null;
        if ($response === false) {
            $error = curl_error($ch);
            throw new \Exception($error);
        } else {
            $strError = "org.facturasv.api.excepcion.ErrorDeRecepcionException:";
		    $strClean = str_replace($strError, '', $response);
            $dteAPI = json_decode($strClean, true);
            
            if(json_last_error() === JSON_ERROR_NONE){
                $dte = $dteAPI;
            }
        }
    
        return $dte;
    }
    //
    public function generarArchivosDTE($dte, $custom = null, $fileType = 'ALL')
    {
        $files = [];
        if($dte){
            $baseName = $dte['json']['identificacion']['numeroControl'];
            if(isset($dte['codigoDeGeneracion']) && $dte['codigoDeGeneracion'] != ""){
                $baseName = $dte['codigoDeGeneracion'];
            }
            $dteJson = $dte['json'];
            $dteJson['selloRecibido'] = $dte['recepcionHaciendaResponse']['selloRecibido'] ?? null;
            if(isset($custom['nombre'])){
                $dteJson['emisor']['nombre'] = $custom['nombre'];
            }
            if(isset($custom['comercial'])){
                $dteJson['emisor']['nombreComercial'] = $custom['comercial'];
            }
            if(isset($dteJson['emisor']['nit']) && $dteJson['emisor']['nit'] === '02100509881105'){
                $dteJson['emisor']['nit'] = '040223664';
            }

            //Hack LTV
            if($dte['json']['identificacion']['codigoGeneracion'] == 'FE6CEBA4-B30D-76C9-24EF-4A2AB150A77A'){
                $dte['json']['receptor']['nombre'] = 'INNOVACION EN TECNOLOGIA, S.A. DE C.V.';
                $dteJson['receptor']['nombre'] = 'INNOVACION EN TECNOLOGIA, S.A. DE C.V.';
            }

            if($fileType == 'JSON' || 'ALL'){
                $files['json'] = [
                    'name' => $baseName.'.json',
                    'type' => 'application/json',
                    'content' => json_encode($dteJson, JSON_PRETTY_PRINT)
                ];
            }
            if($fileType == 'PDF' || 'ALL'){
                $mhCatModel = new CatalogosMHModel();
                $fecEmi = $dte['json']['identificacion']['fecEmi'];
                $ambiente = $dte['json']['identificacion']['ambiente'];
                $tipoDTE = $dte['tipoDte'];
                /** */
                $gralData = [
                    'tipoDte'				=> strToUpper($mhCatModel->getValue(self::MHCAT_TIPODUCUMENTO, $dte['tipoDte'])),
                    'codigoDeGeneracion' 	=> $dte['codigoDeGeneracion'],
                    'numeroControl'		 	=> $dte['numeroControl'],
                    'selloRecibido'			=> $dte['recepcionHaciendaResponse']['selloRecibido'],
                    'tipoModelo'			=> str_replace("Modelo Facturación ", "",$mhCatModel->getValue(self::MHCAT_MODELOFACTURACION, $dte['json']['identificacion']['tipoModelo'])),
                    'tipoOperacion'			=> str_replace("Transmisión ", "",$mhCatModel->getValue(self::MHCAT_TIPOTRANSMISION, $dte['json']['identificacion']['tipoOperacion'])),
                    'fecEmi'				=> date("d-m-Y", strtotime($fecEmi)),
                    'horEmi'				=> date("h:i:s A", strtotime($dte['json']['identificacion']['horEmi'])),
                    'ambiente'              => $ambiente,
                ];
                /**Emisor */
                $dteEmisor = $dte['json']['emisor'] ?? null;
                $emisorData = null;
                $emisorDoc = $dteEmisor['nit'] ?? '';
                if($emisorDoc === '02100509881105'){
                    $emisorDoc = '040223664';
                }
                if($emisorDoc === '06020207861017'){
                    $emisorDoc = '035762726';
                }
                
                if($dteEmisor) {
                    $emisorData = [
                        'nombre'    => isset($custom['nombre']) ? $custom['nombre'] : $dteEmisor['nombre'],
                        //'nit'       => $dteEmisor['nit'],
                        'nit'       => $emisorDoc,
                        'nrc'       => $dteEmisor['nrc'],
                        'actividad' => $dteEmisor['descActividad'],
                        'nombreComercial' => isset($custom['comercial']) ? $custom['comercial'] : $dteEmisor['nombreComercial'],
                        'direccion' => ucwords(mb_strtolower($dteEmisor['direccion']['complemento'], 'UTF-8')) . '. ' . ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_MUNICIPIO, $dteEmisor['direccion']['municipio'], $dteEmisor['direccion']['departamento']), 'UTF-8')) . ' ' . ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_DEPARTAMENTO, $dteEmisor['direccion']['departamento']),'UTF-8')).'.',
                        'telefono'  => isset($custom['telefono']) ? $custom['telefono'] : ""/*$dteEmisor['telefono']*/,
                        'correo'    => isset($custom['correo']) ? $custom['correo'] : ""/*$dteEmisor['correo']*/,
                        'sitioWeb'  => isset($custom['sitioWeb']) ? $custom['sitioWeb'] : "",
                        'logo'      => isset($custom['logo']) ? $custom['logo'] : "",
                    ];
                    //hack Minisuper clarita
                    if($emisorDoc === '13211405901013' && $dteEmisor['nrc'] === '3627309'){
                        $emisorData['direccion'] = "2a Av. Norte Bo El Centro, Distrito de San Simón, Municipio de Morazán Sur, Morazán";
                    }
                }
                /** O Donatario */
                $dteDonatario = $dte['json']['donatario'] ?? null;
                $donatarioData = null;
                if($dteDonatario){
                    $donatarioData = [
                        'nombre'    => isset($custom['nombre']) ? $custom['nombre'] : $dteDonatario['nombre'],
                        'nombreComercial' => isset($custom['comercial']) ? $custom['comercial'] : $dteDonatario['nombreComercial'],
                        'actividad' => $dteDonatario['descActividad'],
                        'tipoDocumento' => isset($dteDonatario['tipoDocumento']) && $dteDonatario['tipoDocumento'] != "" ? $mhCatModel->getValue(self::MHCAT_TIPODOCRECEPTOR, $dteDonatario['tipoDocumento']) : '',
                        'numDocumento'  => $dteDonatario['numDocumento'],
                        'nrc'           => $dteDonatario['nrc'],
                        'direccion' => ucwords(mb_strtolower($dteDonatario['direccion']['complemento'], 'UTF-8')) . '. ' . ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_MUNICIPIO, $dteDonatario['direccion']['municipio'], $dteDonatario['direccion']['departamento']), 'UTF-8')) . ', ' . ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_DEPARTAMENTO, $dteDonatario['direccion']['departamento']),'UTF-8')).'.',
                        'telefono'  => isset($custom['telefono']) ? $custom['telefono'] : $dteDonatario['telefono'],
                        'correo'    => isset($custom['correo']) ? $custom['correo'] : $dteDonatario['correo'],
                        'sitioWeb'  => isset($custom['sitioWeb']) ? $custom['sitioWeb'] : "",
                        'logo'      => isset($custom['logo']) ? $custom['logo'] : ""
                    ];
                }



                /**Receptor*/
                $dteReceptor = $dte['json']['receptor'] ?? $dte['json']['donante'] ?? null;
                $receptorData = [];
                if($dteReceptor){
                    $receptorDireccion = "";
                    if(isset($dteReceptor['direccion'])){
                        $receptorDireccion = isset($dteReceptor['direccion']['complemento']) ? ucwords(mb_strtolower($dteReceptor['direccion']['complemento'], 'UTF-8')) : "";
                        $receptorDireccion .= isset($dteReceptor['direccion']['municipio']) ? ". ".ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_MUNICIPIO, $dteReceptor['direccion']['municipio'], $dteReceptor['direccion']['departamento']), 'UTF-8')) : "";
                        $receptorDireccion .= isset($dteReceptor['direccion']['departamento']) ? ", ".ucwords(strtolower($mhCatModel->getValue(self::MHCAT_DEPARTAMENTO, $dteReceptor['direccion']['departamento']))) : "";
                    }
                    if(isset($dteReceptor['complemento'])){
                        $receptorDireccion = $dteReceptor['complemento'];
                    }
                    $receptorData = [
                        'nombre'    => $dteReceptor['nombre'] ?? null,
                        'nit'		=> isset($dteReceptor['nit']) ? $dteReceptor['nit'] : null,
                        'nrc'		=> isset($dteReceptor['nrc']) ? $dteReceptor['nrc'] : null,
                        'descActividad' => isset($dteReceptor['descActividad']) ? $dteReceptor['descActividad'] : null,
                        'direccion' => $receptorDireccion,
                        'correo' 	=> $dteReceptor['correo'],
                        'telefono'  => $dteReceptor['telefono'],
                        'tipoDocumento' => isset($dteReceptor['tipoDocumento']) && $dteReceptor['tipoDocumento'] != "" ? $mhCatModel->getValue(self::MHCAT_TIPODOCRECEPTOR, $dteReceptor['tipoDocumento']) : '',
                        'numDocumento'	=> isset($dteReceptor['numDocumento']) ? $dteReceptor['numDocumento'] : null,
                        'tipoDte' => $tipoDTE,
                    ];
                }
                /**HACK CP DR MELVIN HERNANDEZ - ISSS */
                if(isset($dteReceptor['numDocumento']) && $dteReceptor['numDocumento'] === '06140312530021' && $emisorDoc === '14042111741023' && $dteEmisor['nrc'] === '1894073') {
                    $receptorData['descActividad'] = "Actividades de planes de seguridad social de afiliación obligatoria";
                }

                /**HACK FLORILUZ PASTORE SALMERON && ULISES VILLATORO*/
                $docReceptor = $dteReceptor['numDocumento'] ?? null;
                if($docReceptor === '06140101150042'){
                    if($emisorDoc === '13191010610015' && $dteEmisor['nrc'] === '1023985'){
                        $emisorData['nombreComercial'] = "FLORILUZ PASTORE SALMERON";
                        $emisorData['logo'] = null;
                        $emisorData['actividad'] = "Actividades inmobiliarias realizadas con bienes propios o arrendados n.c.p.";
                    }
                    elseif ($emisorDoc === '14122809480012' && $dteEmisor['nrc'] === '492825'){
                        $emisorData['actividad'] = "Actividades inmobiliarias realizadas con bienes propios o arrendados n.c.p.";
                    }
                }
                

                /**Sujeto Excluido */
                $dteSujetoExcluido = $dte['json']['sujetoExcluido'] ?? null;
                $sujetoExcluidoData = [];
                if($dteSujetoExcluido){
                    $sujetoExcluidoDireccion = isset($dteSujetoExcluido['direccion']['complemento']) ? ucwords(mb_strtolower($dteSujetoExcluido['direccion']['complemento'], 'UTF-8')) : "";
                    $sujetoExcluidoDireccion .= isset($dteSujetoExcluido['direccion']['municipio']) ? ". ".ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_MUNICIPIO, $dteSujetoExcluido['direccion']['municipio'], $dteSujetoExcluido['direccion']['departamento']), 'UTF-8')) : "";
                    $sujetoExcluidoDireccion .= isset($dteSujetoExcluido['direccion']['departamento']) ? ", ".ucwords(mb_strtolower($mhCatModel->getValue(self::MHCAT_DEPARTAMENTO, $dteSujetoExcluido['direccion']['departamento']), 'UTF-8')) : "";
                    $sujetoExcluidoData = [
                        'nombre'        => $dteSujetoExcluido['nombre'] ?? null,
                        'tipoDocumento' => isset($dteSujetoExcluido['tipoDocumento']) && $dteSujetoExcluido['tipoDocumento'] != "" ? $mhCatModel->getValue(self::MHCAT_TIPODOCRECEPTOR, $dteSujetoExcluido['tipoDocumento']) : '',
                        'numDocumento'  => isset($dteSujetoExcluido['numDocumento']) ? $dteSujetoExcluido['numDocumento'] : null,
                        'direccion'     => $sujetoExcluidoDireccion,
                        'descActividad' => "",
                        'correo' 	=> $dteSujetoExcluido['correo'],
                        'telefono'  => $dteSujetoExcluido['telefono'],
                        'tipoDte'   => $tipoDTE
                    ];
                }
                /**Documentos relacionados */
                $dteDocRelacionados = isset($dte['json']['documentoRelacionado']) ? $dte['json']['documentoRelacionado'] : null;
                /**Productos */
                $productosData = [
                    'productos' => $dte['json']['cuerpoDocumento'],
                    'tipoDte' => $tipoDTE
                ];
                /**Totales */
                $totalesData = $dte['json']['resumen'];
                if($dte['json']['identificacion']['codigoGeneracion'] == '9CECE68F-A1DE-0106-0E8D-E791FBBD3816'){
                    $totalesData['totalGravada'] = 663.50;
                    $totalesData['subTotalVentas'] = 686.00;
                    $totalesData['subTotal'] = 686.00;
                    $totalesData['totalPagar'] = 686.00;
                    $totalesData['totalLetras'] = "Seiscientos Ochenta y Seis  00/100 Dólares";
                    $totalesData['montoTotalOperacion'] = 686.00;

                }
                if(isset($totalesData['condicionOperacion'])){
                    $totalesData['condicionOperacion'] = $mhCatModel->getValue(self::MHCAT_CONDICIONOPERACION,$totalesData['condicionOperacion']);
                }
                /**Extension */
                $extensionData = isset($dte['json']['extension']) ? $dte['json']['extension'] : null;
                /**CONSTRUIR PDF */
                $headerData = [
                    'general'  => $gralData,
                    'emisor' => $emisorData ?? $donatarioData,
                    'receptor' => $receptorData
                ];
                $resumenData = [
                    'totales' => $totalesData,
                    'extension' => $extensionData,
                    'tipoDte' => $tipoDTE
                ];
                $titleHtml = view('dte/dte_factura_title_view', $headerData);
                $headerHtml = view('dte/dte_factura_header_view', $headerData);
                $receptorHtml = view('dte/dte_factura_receptor_view', $receptorData);
                $sujetoExcluidoHtml = view('dte/dte_factura_sujeto_excluido_view', $sujetoExcluidoData);   

                $docRelacionadoHtml = view('dte/dte_factura_documentos_relacionados_view', ['docRelacionados' =>$dteDocRelacionados]);
                $tHeaderHtml = view('dte/dte_factura_productos_header_view',['tipoDte' => $tipoDTE]);
                $productosHtml = view('dte/dte_factura_productos_view',$productosData);
                $resumenHtml = view('dte/dte_factura_resumen_view', $resumenData);

                $pdf = new Tcpdf_lib();

                $pdf->AddPage();
			    $pdf->SetFont('Helvetica', '', 10);
			  
                /*Title */
                $pdf->setCellHeightRatio(0.8);
                //$pdf->writeHTML($titleHtml, true, false, true, false, '');
                /**Header */
                $pdf->setCellHeightRatio(1.2);
                $pdf->writeHTML($headerHtml, true, false, true, false, '');
                
                /**---CODIGOS QR---*/
                $urlConsulta = "https://admin.factura.gob.sv/consultaPublica?ambiente={$ambiente}&codGen={$gralData['codigoDeGeneracion']}&fechaEmi={$fecEmi}";
                $codigoGeneracion = $gralData['codigoDeGeneracion'];
                $numeroControl = $gralData['numeroControl'];
                $selloRecibido = $gralData['selloRecibido'];
                $QRstyle = array(
                    'border' => 1,
                    'padding' => 2,
                    'fgcolor' => array(0,0,0),
                    'bgcolor' => array(255,255,255)
                );
                /**QR Portal Hacienda */
                $pdf->write2DBarcode($urlConsulta, 'QRCODE,H', 91, 37, 21, 21, $QRstyle, 'N');
                /**QR codigo de generacion*/
                if($codigoGeneracion && $codigoGeneracion != ""){  
                    $pdf->write2DBarcode($codigoGeneracion, 'QRCODE,H', 123, 43, 15, 15, $QRstyle, 'N');
                }
                /**QR numero de control*/
                if($numeroControl && $numeroControl != ""){  
                    $pdf->write2DBarcode($numeroControl, 'QRCODE,H', 151.5, 43, 15, 15, $QRstyle, 'N');
                }
                /**QR sello recibido*/
                if($selloRecibido && $selloRecibido != ""){  
                    $pdf->write2DBarcode($selloRecibido, 'QRCODE,H', 180, 43, 15, 15, $QRstyle, 'N');
                }
                $pdf->SetY(63);
                /**RECEPTOR */
                $pdf->writeHTML($receptorHtml, true, false, true, false, '');
                /**SUJETO EXCLUIDO */
                $pdf->writeHTML($sujetoExcluidoHtml, true, false, true, false, '');
                /**Doc Relacionado */
                $pdf->writeHTML($docRelacionadoHtml, true, false, true, false, '');
                /**Productos */
                $TableStarY = $pdf->GetY();
                $pdf->setCellHeightRatio(1.2);
                $pdf->writeHTML($tHeaderHtml, false, false, true, false, '');
                $pdf->SetFont('Courier', '', 8);
                $pdf->writeHTML($productosHtml, false, false, true, false, '');
                $pdf->SetFont('Helvetica', '', 10);
                $tableEndY = $pdf->GetY();
                /**Ajusta para pagina completa */
                if(($tipoDTE == '01' || $tipoDTE == '03' || $tipoDTE == '04' || $tipoDTE == '05' || $tipoDTE == '06') && $tableEndY < 200){
                  
                    $productosHtml = view('dte/dte_factura_productos_view', [
                        'productos' => ['item' => null],
                        'tipoDte' => $tipoDTE
                    ]);
                    do{
                        $pdf->writeHTML($productosHtml, false, false, true, false, '');
                        $tableEndY = $pdf->GetY();
                    } while($tableEndY < 200);
                    
                }

                /**Resumen */
                $pdf->setCellHeightRatio(1.4);
                $pdf->writeHTML($resumenHtml, true, false, true, false, '');
                /**Marca de agua de pruebas */
                if($ambiente == '00'){
                    $pdf->SetFont('helvetica', 'B', 40);
                    $pdf->SetTextColor(255, 150, 150);
                    $pdf->SetAlpha(0.3);
                    $pdf->StartTransform();
                    $pdf->Rotate(45, 105, 105);
                    $pdf->Text(30, 100, 'DOCUMENTO DE PRUEBA', false, false, true, 0, 0, 'C');
                    $pdf->SetFont('helvetica', 'B', 25);
                    $pdf->Text(40, 115, 'No válido para fines tributarios', false, false, true, 0, 0, 'C');
                    $pdf->StopTransform();
                    $pdf->SetAlpha(1);  
                }

                $files['pdf'] = [
                    'name' => $baseName.'.pdf',
                    'type'=> 'application/pdf',
                    'content' => $pdf->Output("$baseName.pdf", 'S')
                ];
            }
        }
        return $files;
    }
    //
    public function enviarDTE($dte, $correo, $outBound = null, $custom = null)
    {
        $files = $this->generarArchivosDTE($dte, $custom, 'ALL');
        
        $mailFrom = isset($outBound['email']['from']) ? $outBound['email']['from'] : 'dte.delivery@dte.factuexpress.com.sv';
        $mailFromName = isset($custom['comercial']) ? $custom['comercial'] : 'Notificación de Factura Electrónica';
        $mailSubject = isset($outBound['email']['subject']) ? $outBound['email']['subject'] : 'Notificación de Factura Electrónica';

        $receptor = isset($dte['json']['receptor']['nombre']) ? $dte['json']['receptor']['nombre'] : '';
        $bcc = isset($outBound['email']['bcc']) ? $outBound['email']['bcc'] : null;

        $codigoGeneracion = isset($dte['codigoDeGeneracion']) ? $dte['codigoDeGeneracion'] : null;
        if($codigoGeneracion){
            $mailSubject .= " $codigoGeneracion";
        }
        $email = new \SendGrid\Mail\Mail(); 
        $email->setFrom($mailFrom, $mailFromName);
        $email->setSubject($mailSubject);
		$email->addTo($correo,$receptor);
        if($bcc){
            $email->addBcc($bcc);
        }
        $email->addContent("text/html", "Estimado cliente  $receptor, adjunto a este correo encontrar&aacute; su Documento Tributario Electr&oacute;nico. <br><br>Saludos cordiales.");

        foreach($files as $file){
            $email->addAttachment(
                $file['content'],
                $file['type'],
                $file['name'],
                'attachment'
            );
        }
        $sendgrid = new \SendGrid('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');
        $return =  [
			'status' =>  null,
			'msg' =>  null
		];
        try {
            $response = $sendgrid->send($email);
            $return['send'] = true;
            $return['status'] = $response->statusCode();
			$return['msg'] = $response->body();
        } catch (Exception $e) {
            $return['send'] = false;
            $return['status'] = "ERROR";
			$return['msg'] = $e->getMessage();
        }
        return $return;
    }
    //------------------ GENERAR UN DTE ---------------------
    public function prepararReceptor($clienteData, $dte)
    {
        $receptor['tipoDocumento'] = null;
        $receptor['numDocumento'] = null;
        $receptor['nombre'] = null;
        $receptor['codActividad'] = null;
        $receptor['descActividad'] = null;
        $receptor['direccion'] = null;
        $receptor['telefono'] = null;
        $receptor['correo'] = null;

        return $receptor;
    }
    //
    public function prepararCuerpoDocumento($productos, $dte)
    {
        $items = null;
        $itemCont = 1;
        if($productos && is_array($productos) && count($productos)){
            $items = [];
            foreach($productos as $prod){
                $prodCant = round($prod['cant'],8);
                $prodPrecio = round($prod['costo'],8);
                $prodTotalGrabado = round($prodCant * $prodPrecio,8);
                
                
                $tipo_prod = 1;
                if(isset($prod['tipoprod']) && $prod['tipoprod'] == 1){
                    $tipo_prod = 2; 
                }

                $productoDescuento = round($prod['descuento'], 8) ?? 0.0;
                $totalUnitario = round($prodTotalGrabado - $productoDescuento, 8);

                $prodTotalNeto = $dte == '03' ? $totalUnitario : round(($totalUnitario / 1.13),8);
                $prodIva = round($prodTotalNeto * 0.13,8);

                $item['numItem']            = $itemCont;
                $item['tipoItem']           = $tipo_prod;
                $item['numeroDocumento']    = null;
                $item['codigo']             = $prod['sku'];
                $item['codTributo']         = null;
                $item['descripcion']        = mb_convert_encoding($prod['desc'], 'UTF-8', 'auto');
				$item['cantidad']           = $prodCant;
				$item['uniMedida']          = 22;
                $item['precioUni']          = round($prodPrecio,8);
                $item['montoDescu']         = $productoDescuento;
                $item['ventaNoSuj']         = 0.0;
                $item['ventaExenta']        = 0.0;
                $item['ventaGravada']       = $totalUnitario;
				if($dte == '01'){
					$item['tributos']           = null;
				}
				else if($dte == '03'){
					$item['tributos']           = ['20'];
				}
                $item['psv']                = 0.0;
                $item['noGravado']          = 0.0;
				if($dte == '01'){
					$item['ivaItem'] 		= (string) $prodIva;
				}
                    
                $items[] = $item;

                $itemCont ++;
            }
        }
        return $items;
    }
    //
    public function prepararResumenDocumento($items, $totales, $dte)
    {
        $resumen =  null;
        if($items && is_array($items) && count($items)){
            //$this->CI->load->library('enletras');
            //$enLentras = new EnLetras();
            $resumen = [
                'totalNoSuj'    => 0.00,
                'totalExenta'   => 0.00,
                'totalGravada'  => 0.00,
                'totalIva'      => 0.00
            ];
				

            foreach($items as $item){
                $resumen['totalNoSuj']      += round((float) $item['ventaNoSuj'], 2);
                $resumen['totalExenta']     += round((float) $item['ventaExenta'], 2);
                $resumen['totalGravada']    += round((float) $item['ventaGravada'], 2);
				if($dte == '01')
					$resumen['totalIva']    += round((float) $item['ivaItem'], 2);
            }
            $resumen['totalIva'] = round($resumen['totalIva'], 2);
            
            $resumen['subTotalVentas']      = round($resumen['totalNoSuj'] + $resumen['totalExenta'] + $resumen['totalGravada'], 2);
            $resumen['descuNoSuj']          = 0;
            $resumen['descuExenta']         = 0;
            $resumen['descuGravada']        = 0;
            $resumen['porcentajeDescuento'] = 0;
            $resumen['totalDescu']          = 0;
			
			$ivaVenta = round(($resumen['totalGravada'] * 0.13),2);
			
            if($dte == '01'){
                $resumen['tributos']            = null;
				$ivaVenta = 0;
            }
            else if($dte == '03'){
                $resumen['tributos'] =[
                   0 => [
                        "codigo"        => '20',
                        "descripcion"   => 'Impuesto al Valor Agregado 13%',
                        "valor"         =>  $ivaVenta
                    ]
                ];
            }
				
            $resumen['subTotal']            = $resumen['subTotalVentas'];
            if($dte == '03'){
				unset($resumen['totalIva']);
                $resumen['ivaPerci1']       = 0;
            }
			$tatalOp = $resumen['subTotalVentas'] + $ivaVenta;
            $resumen['ivaRete1']            = (isset($totales['totalIVAretenido'])?$totales['totalIVAretenido']:0.00);
            $resumen['reteRenta']           = 0;
            $resumen['montoTotalOperacion'] = $tatalOp;
            $resumen['totalNoGravado']      = $resumen['totalNoSuj'] + $resumen['totalExenta'];
			$totalPagar = round($tatalOp -  $resumen['ivaRete1'], 2);
            $resumen['totalPagar']          = $totalPagar;
            $resumen['totalLetras']         = mb_convert_encoding($this->numeroALetras($totalPagar)." Dólares", 'UTF-8', 'auto');
            $resumen['saldoFavor']          = 0;
            $resumen['condicionOperacion']  = 1;
            $resumen['pagos']               = [
                0 =>[
                    "codigo" => "01",
                    "montoPago" => round($totalPagar, 2),
                    "referencia" => null,
                    "plazo" => null,
                    "periodo" => null
                ]
            ];
            $resumen['numPagoElectronico'] = null;
        
        }
        return $resumen;
    }
    //
    public function procesarDTE($receptor,$cuerpo,$resumen, $tipoDte)
    {
        $dte_version = [
            '01' => 1,/*Factura*/
		    '03' => 3,/*CCF*/
        ];
		$version = $dte_version[$tipoDte];
		$cuerpoDocumento = $cuerpo;
			
        $dte = array(
            "dteJson" => array(
                "identificacion" => [
                    "version" => $version,
                    "ambiente" => $this->MHenv,
                    "tipoDte" => $tipoDte
                ],
				"receptor" => $receptor,
                "documentoRelacionado" => null,
                "otrosDocumentos" => null,
                "ventaTercero" => null,
                "cuerpoDocumento" => $cuerpoDocumento,
                "resumen" => $resumen,
                "extension" => null,
                "apendice" => null
            ), 
            "dte" =>  $tipoDte
        );
        
		$dte = json_encode($dte, JSON_UNESCAPED_UNICODE);

		$ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->apiEndpoint."cda/dte/transmision");
        curl_setopt($ch, CURLOPT_POST, true);

        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Content-Type: application/json",
            "X-API-KEY: ".$this->apiKey,
            "X-API-SECRET: ".$this->apiSecret
        ]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $dte);

        $apiRes = curl_exec($ch);
	
		$res = array(
			"success" => false
		);
        if(curl_errno($ch)) {
            $res["error"] = curl_error($ch);
            curl_close($ch);
        }else{
			curl_close($ch);
			$res["success"] = true;
			$res["data"] = json_decode($apiRes);
		}
		return (Object) $res;
    }


    //
    private function numeroALetras($numero) {
        $formatter = new \NumberFormatter("es", \NumberFormatter::SPELLOUT);
        
        $partes = explode('.', number_format($numero, 2, '.', ''));
        $entero = (int)$partes[0];
        $centavos = (int)$partes[1];
    
        $texto = ucfirst($formatter->format($entero));

        if ($centavos > 0) {
            $texto .= " {$centavos}/100";
        }
        return $texto;
    }
   
}