<?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 ProcesarDTEs extends BaseCommand
{
    protected $group       = 'DET Manager';
    protected $name        = 'procesardtes';
    protected $description = 'Busca ventas pendientes de enciar a API y las procesa';
    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);
                $unprocessedSales = $ventasModel->getMS1UnprocessedSales($feStartDate, $cantDte);

                if($unprocessedSales)
                {
                    CLI::write('Ventas no procesadas encontradas: ' . count($unprocessedSales));
                    $feEnv = $client->getFeEnv($isc);
                    $facturacionElectronica = new FacturacionElectronica($feEnv);
                    foreach($unprocessedSales as $sale)
                    {
                        CLI::write('Procesando '.$sale['id_venta'], 'green');
                        $feTipoDocumento = null;
                        if($sale['documento_venta'] == 1 || $sale['documento_venta'] == 3){
                            $feTipoDocumento = '01'; /**Factutura, Ticket -> CFE*/
                        }
                       
                        if($feTipoDocumento){
                            CLI::write('Preparando DTE');
                            $feCliente = $facturacionElectronica->prepararReceptor(null, $feTipoDocumento);
                            CLI::write('- Cliente listo');
                            $productosVenta = [];
                            foreach($sale['productos'] as $producto){
                                    $productosVenta[] = [
                                        'cant' => $producto['cant_salida'],
                                        'costo' => $producto['costo_salida'],
                                        'tipoprod' => 1,
                                        'descuento' => $producto['descuento_salida'],
                                        'sku' => $producto['sku_presentacion'],
                                        'desc' => isset($producto['ref_presentacion']) ? $producto['ref_presentacion'].' - '.$producto['desc_presentacion'] : $producto['desc_presentacion']
                                ];
                            }
                            $feCuerpoDocumento = $facturacionElectronica->prepararCuerpoDocumento($productosVenta, $feTipoDocumento);
                            CLI::write('- Cuerpo documento listo');
                            $feResumen = $facturacionElectronica->prepararResumenDocumento($feCuerpoDocumento, null, $feTipoDocumento);
                            CLI::write('- Resumen listo');
                            CLI::write('Intentando envio a API');
                            $envioDte = $facturacionElectronica->procesarDTE($feCliente, $feCuerpoDocumento, $feResumen, $feTipoDocumento);
                         
                            if($envioDte->success)
                            {
                               CLI::write('DTE: '.$envioDte->data->numeroControl.' procesado correctamente', 'green');

                               if($ventasModel->setMS1SaleDTEInfo($sale['id_venta'], $envioDte->data->numeroControl)){
                                      CLI::write('DTE: '.$envioDte->data->numeroControl.' actualizado correctamente', 'green');
                                 }
                                 else{
                                      CLI::write('Error al actualizar DTE: '.$envioDte->message, 'red');
                               }
                            }
                            else{
                                CLI::write('Error al procesar DTE: '.$envioDte->message, 'red');
                            }
                        }
                        else{
                            CLI::write('Tipo de documento no soportado', 'red');
                        }
                    }
                }
                else
                {
                    CLI::write('No se encontraron ventas sin procesar');
                }
            }
            else 
            {
                $isc = CLI::error('Identificador del sistema de cliente invalido');
            }
        }
        else 
        {
            $isc = CLI::error('Identificador del sistema de cliente invalido');
        }
    }

}