<?php

namespace App\Models;

use CodeIgniter\Model;
use CodeIgniter\CLI\CLI;

class VentasModel extends Model
{
    protected $table;
    protected $primaryKey;
    protected $allowedFields;

    protected $db;

    protected $columnMap = [];

   public function __construct(string $systemVersion, $db)
   {
        $versionConf = [
            'ms1' => [
                'table'     => 'ventas',
                'columns'   => [
                    'id'                => 'id_venta',
                    'fecha'             => 'fecha_venta',
                    'documento'         => 'documento_venta',
                    'dteNControl'       => 'dte_ncontrol',
                    'dteEstado'         => 'dte_estado',
                    'dteCodGeneracion'  => 'dte_codigogeneracion',
                    'dteFechaProcesado' => 'dte_fhprocesado',
                    'dteSelloRecepcion' => 'dte_sello',
                    'dteError'          => 'dte_errormsg',
                    'emailEnviado'      => 'dte_mailenviado',
                    'emailEstado'       => 'dte_mailestado',
                ],
                'documents' => [
                    'factura'   => 1,
                    'ccf'       => 2,
                    'ticket'   => 3,
                ]
            ],
            'ignix' => [
                'table'     => 'ventas',
                'columns'   => [
                    'id'            => 'id_venta',
                    'fecha'         => 'fecha_venta',
                    'dteNControl'   => 'dte_ncontrol',
                    'dteEstado'     => 'dte_estado',
                ]
            ]
        ];

        if (!isset($versionConf[$systemVersion])) {
            throw new \Exception("Versión de sistema no soportada");
        }

        $this->db = $db;

        $this->table = $versionConf[$systemVersion]['table'];
        $this->columnMap = $versionConf[$systemVersion]['columns'];
        $this->documentMap = $versionConf[$systemVersion]['documents'] ?? [];
        $this->allowedFields = array_values($this->columnMap);
   }
   //
   protected function mapToStandard(array $row): array
   {
       $mapped = [];
       foreach ($this->columnMap as $standard => $real) {
           $mapped[$standard] = $row[$real] ?? null;
       }
       return $mapped;
   }
    //
    public function getPendingSales($startDate, $cantDte)
    {
        $query = $this->db->table($this->table);
        $query->where([(String) $this->columnMap['dteEstado'] => NULL, (String) $this->columnMap['fecha'] . ' >= ' => $startDate]);
        $query->groupStart()
            ->where((String) $this->columnMap['documento'], $this->documentMap['factura'])
            ->orWhere((String) $this->columnMap['documento'], $this->documentMap['ccf'])
            ->orWhere((String) $this->columnMap['documento'], $this->documentMap['ticket']) // Considerar ticket si es necesario
            ->groupEnd();
        $query->where((String) $this->columnMap['dteCodGeneracion'] . ' IS NOT ', NULL); //codigo de generacion no null
        $query->limit($cantDte);
        
        $result = $query->get()->getResultArray();

        return array_map(fn($row) => $this->mapToStandard($row), $result);
    }
    //
    public function getSaleByNControl($ncontrol)
    {
        $query = $this->db->table($this->table)
            ->where(['dte_ncontrol' => $ncontrol])
            ->get();

        $result = $query->getRowArray();
        if ($result) {
            return $this->mapToStandard($result);
        }

        return null;
    }
    public function getSaleByCodGeneracion($codGen)
    {
        $query = $this->db->table($this->table)
            ->where(['dte_codigogeneracion' => $codGen])
            ->get();

        $result = $query->getRowArray();
        if ($result) {
            return $this->mapToStandard($result);
        }

        return null;
    }
    // 
    public function getMS1UnprocessedSales($startDate, $cantDte)
    {
        $query = $this->db->table('ventas')
            ->where(['dte_ncontrol' => NULL, 'fecha_venta >= ' => $startDate, 'estado_venta' => 1, 'documento_venta >=' => 1, 'documento_venta <='  => 3])
            ->join('clientes', 'clientes.id_cliente = ventas.id_cliente', 'LEFT')
            ->limit($cantDte)
            ->get();

        $ventas = $query->getResultArray();
        if($ventas && count($ventas) > 0)
        {
           for($i = 0; $i < count($ventas); $i++)
           {
               $ventas[$i]['productos'] = $this->db->table('salida_productos')
                                            ->join('presentaciones', 'presentaciones.id_presentacion = salida_productos.id_presentacion')
                                            ->where('salida_productos.id_venta', $ventas[$i]['id_venta'])
                                            ->get()->getResultArray();
           }
        }

        return $ventas;
    }
    public function setMS1SaleDTEInfo($id, $dteNControl)
    {
        $data = [
            'dte_ncontrol' => $dteNControl,
        ];

        $this->db->table('ventas')
            ->where('id_venta', $id)
            ->update($data);

        return $this->db->affectedRows() > 0;
    }
    //
    public function setDTEState($id, $state)
    {
        $data = [
            $this->columnMap['dteEstado'] => $state
        ];

        $this->db->table($this->table)
            ->where($this->columnMap['id'], $id)
            ->update($data);

        return $this->db->affectedRows() > 0;
    }
    //
    public function setDTEInfo($id, $dteEstado, $dteSelloRecepcion, $dteFechaProcesado, $dteError = NULL)
    {
        $data = [
            $this->columnMap['dteEstado'] => $dteEstado,
            $this->columnMap['dteSelloRecepcion'] => $dteSelloRecepcion,
            $this->columnMap['dteFechaProcesado'] => $dteFechaProcesado,
            $this->columnMap['dteError'] => $dteError
        ];

        $this->db->table($this->table)
            ->where($this->columnMap['id'], $id)
            ->update($data);

        return $this->db->affectedRows() > 0;
    }

    public function setEmailInfo($id, $enviado, $estado)
    {
        $data = [
            $this->columnMap['emailEnviado'] => $enviado,
            $this->columnMap['emailEstado'] => $estado
        ];

        $this->db->table($this->table)
            ->where($this->columnMap['id'], $id)
            ->update($data);

        return $this->db->affectedRows() > 0;
    }

    /** */
    public function getUncompleteInfoSales($startDate, $cantDte)
    {
        $query = $this->db->table($this->table)
            ->where(['dte_ncontrol !=' => NULL, 'dte_sello' => NULL,'fecha_venta >= ' => $startDate])
            ->limit($cantDte)
            ->get();

        $result = $query->getResultArray();

        return array_map(fn($row) => $this->mapToStandard($row), $result);
    }
    /** */
    public function setCompleteInfoSale($id, $data)
    {
        $this->db->table($this->table)
            ->where($this->columnMap['id'], $id)
            ->update($data);

        return $this->db->affectedRows() > 0;

    }
}
