<?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 ColocarInfoDTEs extends BaseCommand
{
    protected $group       = 'DET Manager';
    protected $name        = 'colocarInfoDTEs';
    protected $description = 'Consulta los DTEs en la plataforma de FE y actualiza la informacion de sello y codigo de generacion en el sistema de cliente.';
    protected $arguments   = ['isc' => 'Identificador del sistema de cliente'];
    protected $options     = ['--cant' => 'Cantidad maxima de DTE a tomar de la cola.'];

    public function run(array $params)
    {
        $isc = $params[0] ?? null;
        $cantDte = CLI::getOption('cant') ?? 5;

        if ($isc) {
            $client = new Clients();
            $dbgroup = $client->getDBGroup($isc);
            if ($dbgroup) 
            {
                $database = new Database();
                $dbConf = $database->getDatabaseConfig($dbgroup);
                $db = \Config\Database::connect($dbConf);

                $systemVersion = $client->getSystem($isc);
                $feStartDate = $client->getFeStartDate($isc);

                $ventasModel = new VentasModel($systemVersion, $db);

                $uncompleteInfoSales = $ventasModel->getUncompleteInfoSales($feStartDate, $cantDte);

                CLI::write(date('Y-m-d H:i:s').' Ventas incompletas encontradas: ' . count($uncompleteInfoSales));

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

                    foreach ($uncompleteInfoSales as $sale) {
                        //CLI::write(date('Y-m-d H:i:s').' Consultando dte: ' . $sale['dteNControl']);
                        CLI::write(date('Y-m-d H:i:s').' Consultando dte: ' . $sale['dteNControl']);
                        //consultar DTE en API
                        $dte = $facturacionElectronica->consultarDTE($sale['dteCodGeneracion']);
                        if($dte)
                        {
                            $dteCodigoGeneracion = isset($dte['recepcionHaciendaResponse']['codigoGeneracion']) ? $dte['recepcionHaciendaResponse']['codigoGeneracion'] : null;
                            $dteSello = isset($dte['recepcionHaciendaResponse']['selloRecibido']) ? $dte['recepcionHaciendaResponse']['selloRecibido'] : null;
                            $dteFhProcesado = isset($dte['recepcionHaciendaResponse']['fhProcesamiento']) ? $dte['recepcionHaciendaResponse']['fhProcesamiento'] : null;
                            CLI::write('DTE fecha src: ' . $dteFhProcesado);
                            if($dteFhProcesado){
                                $dteFhProcesado = \DateTime::createFromFormat('d/m/Y H:i:s', $dteFhProcesado);
                                $dteFhProcesado = $dteFhProcesado->format("Y-m-d H:i:s");
                            }


                            CLI::write('DTE fecha: ' . $dteFhProcesado);
                            if($dteCodigoGeneracion){
                                $updateInfo = $ventasModel->setCompleteInfoSale($sale['id'], [
                                    'dte_codigogeneracion' => $dteCodigoGeneracion,
                                    'dte_sello' => $dteSello,
                                    'dte_fhprocesado' => $dteFhProcesado,
                                ]);
                                if($updateInfo)
                                {
                                    CLI::write('Informacion de DTE actualizada', 'green');
                                }
                                else
                                {
                                    CLI::error('No se pudo actualizar la informacion del DTE: ' . $sale['dteNControl']);
                                }
                            }
                            else
                            {
                                CLI::error('DTE ' . $sale['dteNControl'] . ' no tiene formato esperado: [\'recepcionHaciendaResponse\'] no presente');
                            }
                        }
                        else
                        {
                            CLI::error('No se pudo obtener el DTE: ' . $sale['dteNControl']);
                        }
                        
                    }
                }
                else
                {
                    CLI::write('No se encontraron ventas pendientes');
                }
            }
            else 
            {
                $isc = CLI::error('Identificador del sistema de cliente invalido');
            }
        }
        else
        {
            $isc = CLI::error('Identificador del sistema de cliente invalido');
        }
    }
}