<?php

namespace App\Commands;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use Config\Clients;
use Config\Database;
use App\Models\VentasModel;
use App\Libraries\FacturacionElectronica;

class EnviarDTEsAPI extends BaseCommand
{
    protected $group       = 'DET Manager';
    protected $name        = 'enviardtesapi';
    protected $description = 'Genera y envía los DTE legible y json que han sido procesados correctamente desde el api';
    protected $arguments   = ['isc' => 'Identificador del sistema de cliente'];
    protected $options     = [
                                '--desde' => 'Fecha desde. YYYY-MM-DD',
                                '--hasta' => 'Fecha hasta. YYYY-MM-DD',
                                '--tipo' => 'Tipo de DTE a enviar'
                            ];
    

    
    public function run(array $params)
    {
        date_default_timezone_set('America/El_Salvador');
        $isc = $params[0] ?? null;
        $desde = CLI::getOption('desde') ?? (new \DateTime())->format('Y-m-d');
        $hasta = CLI::getOption('hasta') ?? (new \DateTime('+1 day'))->format('Y-m-d');
        $tipo  = CLI::getOption('tipo')  ?? null;

        if ($isc && $tipo) {
            $client = new Clients();
            $feEnv = $client->getFeEnv($isc);
            if ($feEnv) 
            {
                CLI::write(date('Y-m-d H:i:s').' '.$isc.' Consultado DTE: ' . $tipo . ' desde: ' . $desde . ' hasta: ' . $hasta);

                $fe = new FacturacionElectronica($feEnv);
                $dtes = $fe->consularRango($desde, $hasta, $tipo);

                if($dtes){
                    foreach ($dtes as $dte) {
                        CLI::write(date('Y-m-d H:i:s').' '.$isc.' DTE: ' . $dte['numeroControl']);
                        $dteEstado = $dte['estado'];
                        $color = 'white';
                        switch($dteEstado){
                            case 'PROCESADO':  $color = 'green'; break;
                            case 'EN_PROCESO': $color = 'yellow'; break;
                            case 'FALLIDO':    $color = 'red'; break;
                        }
                        CLI::write(date('Y-m-d H:i:s').' '.$isc.' '.$dteEstado, $color);

                        if($dteEstado == 'PROCESADO'){
                            $dteAnulado = $dte['anulado'];
                            if($dteAnulado == 'SI'){
                                CLI::write(date('Y-m-d H:i:s').' '.$isc.' DTE ANULADO, no se enviará por correo', 'red');
                                continue;
                            }
                            CLI::write(date('Y-m-d H:i:s').' '.$isc.' procesando envio DTE');
                            $dteJson = isset($dte['json']) ? $dte['json'] : null;
                            if($dteJson){
                                $dteCorreo = isset($dteJson['receptor']['correo']) ? $dteJson['receptor']['correo'] : '';
                                if($dteCorreo == '' || $dteCorreo == null){
                                   $dteCorreo = isset($dteJson['sujetoExcluido']['correo']) ? $dteJson['sujetoExcluido']['correo'] : '';

                                }
                                if( $dteCorreo != null && $dteCorreo != ''){
                                    CLI::write(date('Y-m-d H:i:s').' '.$isc.' Enviando DTE a: ' . $dteCorreo);
                                    if(filter_var($dteCorreo, FILTER_VALIDATE_EMAIL)){
                                         $dteCorreo = strtolower($dteCorreo);

                                         $mailSender = $fe->enviarDTE(
                                            $dte, 
                                            $dteCorreo,
                                            $client->getOutbound($isc),
                                            [
                                                'logo' => $client->getLogo($isc),
                                                'comercial' => $client->getComercial($isc),
                                                'nombre' => $client->getNombre($isc)
                                            ]
                                        );

                                        if($mailSender['send']){
                                            CLI::write('Correo enviado a: ' . $dteCorreo, 'green');
                                            $mailSend = true;
                                            $correoEstado = "Correo enviado a: " . $dteCorreo;
                                        }
                                        else{
                                            CLI::error('Error al enviar correo: ' . $mailSender['msg']);
                                            $correoEstado = "Error al enviar correo: " . $mailSender['msg'];
                                        } 

                                    }
                                    else{
                                        CLI::error(date('Y-m-d H:i:s').' '.$isc.' Correo del receptor invalido');
                                    }
                                }
                                else{
                                    CLI::error(date('Y-m-d H:i:s').' '.$isc.' Dir. Correo no disponible');
                                }

                            }
                            else{
                                CLI::error(date('Y-m-d H:i:s').' '.$isc.' DTE no tiene formato esperado: [\'json\'] no presente');
                            }
                        }
                        CLI::write(date('Y-m-d H:i:s').' '.$isc.' ****************************************');
                    }
                }
                else{
                    CLI::write(date('Y-m-d H:i:s').' '.$isc.' No se encontraron DTEs en el rango especificado.');
                }

                $pendingSales = false;
                if($pendingSales){
                    CLI::write(date('Y-m-d H:i:s').' Iniciando consultas de DTEs');
                    $feEnv = $client->getFeEnv($isc);
                    $facturacionElectronica = new FacturacionElectronica($feEnv);

                    foreach ($pendingSales as $sale) {
                        CLI::write(date('Y-m-d H:i:s').' '.$isc.' Consultando dte: ' . $sale['dteCodGeneracion']);
                        //consultar DTE en API
                        $dte = $facturacionElectronica->consultarDTE($sale['dteCodGeneracion']);
                        if($dte)
                        {
                            $dteJson = isset($dte['json']) ? $dte['json'] : null;
                            if($dteJson)
                            {
                                $dteEstado = $dte['estado'];
                                $color = 'white';
                                switch($dteEstado){
                                    case 'PROCESADO':    $color = 'green'; break;
                                    case 'EN_PROCESO':   $color = 'yellow'; break;
                                    case 'FALLIDO':  	$color = 'red'; break;
                                }
                                CLI::write($dteEstado, $color);
                                //actualizar estado
                                $updated = false;
                                if($dteEstado == 'PROCESADO' || $dteEstado == 'FALLIDO'){
                                    //actualizar estado
                                    //$updated = $ventasModel->setDTEState($sale['id'], $dteEstado);
                                    $dteSello = isset($dte['recepcionHaciendaResponse']['selloRecibido']) ? $dte['recepcionHaciendaResponse']['selloRecibido'] : null;
                                    $dteFhProcesado = isset($dte['recepcionHaciendaResponse']['fhProcesamiento']) ? $dte['recepcionHaciendaResponse']['fhProcesamiento'] : null;
                                    if($dteFhProcesado){
                                        $dteFhProcesado = \DateTime::createFromFormat('d/m/Y H:i:s', $dteFhProcesado);
                                        $dteFhProcesado = $dteFhProcesado->format("Y-m-d H:i:s");
                                    }
                                    $dteError = isset($dte['error']) ? $dte['error'] : null;

                                    $updated = $ventasModel->setDTEInfo($sale['id'], $dteEstado, $dteSello, $dteFhProcesado, $dteError);
                                }
                                if($updated)
                                {
                                    CLI::write('ESTADO ACTUALIZADO', 'green');
                                    if($dteEstado == 'PROCESADO')
                                    {
                                        CLI::write(date('Y-m-d H:i:s').' Iniciando envio de correo electronico');
                                        $dteCorreo = isset($dteJson['receptor']['correo']) ? $dteJson['receptor']['correo'] : '';
                                        $correoEstado = "";
                                        $mailSend = false;
                                        if( $dteCorreo != null && $dteCorreo != ''){
                                            if(filter_var($dteCorreo, FILTER_VALIDATE_EMAIL)){
                                                $dteCorreo = strtolower($dteCorreo);

                                                $mailSender = $facturacionElectronica->enviarDTE(
                                                    $dte, 
                                                    $dteCorreo,
                                                    $client->getOutbound($isc),
                                                    [
                                                        'logo' => $client->getLogo($isc),
                                                        'comercial' => $client->getComercial($isc),
                                                        'nombre' => $client->getNombre($isc)
                                                   ]
                                                );

                                                if($mailSender['send']){
                                                    CLI::write('Correo enviado a: ' . $dteCorreo, 'green');
                                                    $mailSend = true;
                                                    $correoEstado = "Correo enviado a: " . $dteCorreo;
                                                }
                                                else{
                                                    CLI::error('Error al enviar correo: ' . $mailSender['msg']);
                                                    $correoEstado = "Error al enviar correo: " . $mailSender['msg'];
                                                } 
                                            }
                                            else{
                                                CLI::error('Correo del receptor invalido');
                                                $correoEstado = "Dir. Correo no valida";
                                            }
                                        }
                                        else{
                                            CLI::error('Dir. Correo no disponible');
                                            $correoEstado = "Dir. Correo no disponible";
                                        }
                                        $mailInfoUpdate = $ventasModel->setEmailInfo($sale['id'], $mailSend, $correoEstado);
                                    }
                                }
                                else
                                {
                                    CLI::error('No se pudo actualizar el estado del DTE: ' . $sale['dteNControl']);
                                }
                            }
                            else
                            {
                                CLI::error('DTE ' . $sale['dteNControl'] . ' no tiene formato esperado: [\'json\'] no presente');
                            }
                        }
                        else
                        {
                            CLI::error('No se pudo obtener el DTE: ' . $sale['dteNControl']);
                        }
                        
                    }
                }
              
            }
            else 
            {
                $isc = CLI::error('Identificador del sistema de cliente invalido');
            }
        }
        else
        {
            $isc = CLI::error('Identificador del sistema de cliente invalido o tipo de DTE invalido');
        }
    }
}