<?php

namespace App\Danoral\Cuotas;

use App\Danoral\ModelBase;
use Illuminate\Support\Facades\DB;

use App\Danoral\Entidades\Entidad;
use App\Danoral\Transacciones\TransDT;
use App\Danoral\Dolarizacion\TasaCambio;
use App\Danoral\Cobranzas\Cobros\CobroItem;
use App\Danoral\Transacciones\Trans;
use App\Danoral\Entidades\SyncEntidades;
use App\Danoral\U;
use App\Danoral\Cuotas\CuotaView;

class Cuota extends ModelBase implements CobroItem
{
    protected $tableName = 'cuotas';
    protected $primaryKey = 'idCuota';
    public $incrementing = false;
    public $timestamps = false;

    
    protected $fillable = [
        'idCond',
        'idE',
        'idDTCuota',
        'montoOrigen',
        'tcEmision_idTC',
        'tcEmision_dateVen',
    ];
    
    function __construct() {
        $this->table = parent::$SCHEMA .'.'. $this->tableName;
    }
    //public $tDT = new TransDT;

    public function transdt(){
        return $this->hasOne('App\Danoral\Transacciones\TransDT', 'idDT', 'idDTCuota');
    }
    public function transdt_cobro(){
        return $this->hasOne('App\Danoral\Transacciones\TransDT', 'idDT', '	idDTCuotaCobro');
    }
    public function condominio(){
        return $this->belongsTo('App\Danoral\Condominios\Condominio','idCond', 'idCond');
    }

    //implementacion CobroItem
    public function getIdE()        { return $this->idE; }
    public function getTypeDT()     { return 21; }

    /* CAMBIO DE FECHA
        UPDATE "admin"."cuotas"
        SET "tcEmision_dateVen"='2021-12-05 00:00:00'
        WHERE "idCond" = '100100000000000330'

        Eliminar Cuotas iniciales de un mes
        SELECT * 
        FROM "admin24"."cuotas" 
        WHERE "idDTCuota" IN (
            SELECT "idDT" 
            FROM "admin24"."transdt" 
            WHERE "anoDT" = '2024' 
            AND "mesDT" = '9' 
            AND "idT" = '100100240000001278'
        )        
    */

    public function setSchema($schema) {
        $this->table = $schema .'.cuotas';
    }

    public static function createCuota($cuotaData){
        DB::beginTransaction();
        try{            
            $iDT_cuota = new TransDT;
            $iDT_cuota->fill([
                'ctaDT'         => 130,
                'dhDT'          => 0,
                'montoDT'       => $cuotaData['montoDT'],
                'typeDT'        => TransDT::$TYPE_CUOTA,
                'anoDT'         => $cuotaData['anoDT'],
                'mesDT'         => $cuotaData['mesDT'],
                'idE'           => $cuotaData['idE'],
                'idT'           => $cuotaData['idT'],
                'idMoneda'      => $cuotaData['idMoneda'],
            ]);
            $iDT_cuota->save();

            $cuota = new Cuota;
            $cuota->fill([
                'idCond'        => $cuotaData['idCond'],
                'idE'           => $cuotaData['idE'],
                'idDTCuota'     => $iDT_cuota->idDT,
                'montoOrigen'   => $cuotaData['montoOrigen'],
            ]);
            $cuota->save();

            DB::commit();

            return 'OK123';

        }catch (\Exception $e) {
            DB::rollback();
            return 'ERROR: '.$e->getMessage();
        }

    }

    public function createTransDTCobro($cuota){
        $iDT_cuota = new TransDT;
        $iDT_cuota->fill([
            'ctaDT'         => 130,
            'dhDT'          => TransDT::$dhH,
            'montoDT'       => $cuota['monto'],
            'typeDT'        => TransDT::$TYPE_CUOTA_COBRO,
            'anoDT'         => $cuota['ano'],
            'mesDT'         => $cuota['mes'],
            'idE'           => $cuota['idE'],
          //  'idT'           => $trans->idT,
            'idMoneda'      => $cuota['idMoneda']
        ]);
        //$iDT_cuota->save();

        //$cuota = Cuota::find($cuota['idCuota']);
        $cuota->idDTCuotaCobro = $iDT_cuota->idDT;
        //$cuota->save();

    }

    public static function updateIdDTCuotaCobro($idCuota, $idDTCuotaCobro){
        Cuota::where([
            ['idCuota', $idCuota],
        ])
        ->update(['idDTCuotaCobro' => $idDTCuotaCobro]);
    }

    /**
     *  
     */
    public static function migrarDeuda($codEdif, $dateT){
        
        // Variables de Configuracion
        $is_cambioDolarizado = false;        //realiza el cambio a $ a la tasa del mes para cada cuota en Bs.
        $is_cambioEdif = false;              //cuando hay cambio de edificio
        $is_dolarizado = false;              //si el monto en origen esta dolarizado
        $type_trans = 2002;                  //inicial    
        $idE_edif_cambio_origen = 102000508; // solo aplica cuando hay cambio de codigo de edificio
        $tcEmision_dateVen = null; // "2025-03-17";   //fecha de gracia, si aplica, si no null


        $fechaTasa = [
            2023 => [ 
                1  => '2023-01-10',
                2  => '2023-02-10',
                3  => '2023-03-10',
                4  => '2023-04-11',
                5  => '2023-05-09',
                6  => '2023-06-12',
                7  => '2023-07-13',
                8  => '2023-08-10',
                9  => '2023-09-10',
                10 => '2023-10-10',
                11 => '2023-11-09',
                12 => '2023-12-12',
            ],
            2024 => [
                1  => '2024-01-11',
                2  => '2024-02-09',
                3  => '2024-03-12',
                4  => '2024-04-12',
                5  => '2024-05-10',
                6  => '2024-06-11',
                7  => '2024-07-10',
                8  => '2024-08-12',
                9  => '2024-09-10',
                10 => '2024-10-10',
                11 => '2024-11-12',
                12 => '2024-12-12',                
            ],
            2025 => [
                1  => '2025-01-10',
                2  => '2025-02-10',
                3  => '2025-03-10',
                4  => '2025-04-15',
                5  => '2025-05-12',
                6  => '2025-06-13',
                7  => '2025-07-10',
                8  => '2025-08-04',
            ]
        ];

        
        //---------------------------------

        if($is_cambioDolarizado){ $is_dolarizado = true;}

        if(empty($codEdif) || empty($dateT)){return 0;}

        $timestamps = strtotime($dateT);
        $ano = date('Y', $timestamps);
        $mes = date('m', $timestamps);

        $cnDanoral = (new Cuota)->getCN_jsys($ano, $mes);

        //Edificio
        $e_edif = DB::connection($cnDanoral)
        ->table('entidades')
        ->leftJoin('entidadesedif', 'entidades.id_Entidad', '=', 'entidadesedif.id_Entidad')
        ->Where([
            ['id_TipoEntidad', 2],
            ['cod_Entidad', 'LIKE', "%$codEdif%"],
        ])
        ->first();
    
        //actualizar dolarizado_EE
        if($e_edif){
            $idE_edif = $e_edif->id_Entidad;
            $ref_trans = $codEdif;

            echo print_r($e_edif);
            echo PHP_EOL;

        }else{
            return 0;
        }

        echo "INICIO: migrar deuda: $ref_trans | dolarizado: $is_cambioDolarizado | idE: $idE_edif | dateT: $dateT" . PHP_EOL;

        //Carga o crea la Trans Inicial
        
        $trans = Trans::myLoad([
            ['typeT', $type_trans],
            ['refT',$ref_trans]
        ],[
            'ctaT'          => null,
            'typeT'         => $type_trans,
            'refT'          => $ref_trans,
            'dateT'         => $dateT, //'2023-02-27 00:00:00',
            'descT'         => 'Inicial ' . $ref_trans,
            'enableT'       => true,
            'idU'           => 1,
        ], $ano);

        $recibos = DB::connection($cnDanoral)
            ->table('recibos')
            ->leftJoin('itemsdt', 'itemsdt.idDT', '=', 'recibos.idDT_Recibo')
            ->leftJoin('entidades', 'entidades.id_Entidad', '=', 'recibos.id_Entidad')
            ->where([
                ['entidades.id_EntidadPadre', $is_cambioEdif? $idE_edif_cambio_origen : $idE_edif], 
                ['recibos.idDT_ReciboCobrado', null],
            ])
            ->orderBy('recibos.ano_Recibo', 'asc')
            ->orderBy('recibos.mes_Recibo', 'asc')
            ->orderBy('entidades.cod_Entidad', 'asc')
            ->get();

        $mes_actual = -1;
        $tasa = new TasaCambio;
        foreach($recibos as $r){
            
            //if($r->ano_Recibo < 2020){ continue; }
            //if(!($r->id_Entidad != 103001593)){ continue; }
            //if(($r->ano_Recibo == 2025 && $r->mes_Recibo == 9)){ continue; }            
            //if($r->ano_Recibo != 2024 && $r->mes_Recibo != 8){ continue; }
            //$is_dolarizado = ($r->ano_Recibo == 2025 && $r->mes_Recibo == 3);
            /*
            $is_dolarizado = true;
            if($r->id_Entidad == 103062693){
                $is_dolarizado = !($r->ano_Recibo == 2025 && $r->mes_Recibo == 3);
            }
            */
            
            //INICIO - Cambio monto dolarizado
            if($is_cambioDolarizado || $is_dolarizado){

                if($mes_actual != $r->mes_Recibo){

                    $date = $r->ano_Recibo.'-'.$r->mes_Recibo.'-28';

                    echo $r->ano_Recibo.'-'.$r->mes_Recibo.' : ';
                    /*
                    //Calcula la tasa segun las fechas en $fechaTasa
                    if($r->ano_Recibo >= 2023){
                        $date = $fechaTasa[$r->ano_Recibo][$r->mes_Recibo];
                    }
                    */
                    echo $date .' *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* '.PHP_EOL;

                    $tasa = TasaCambio::getTasaFecha($date);

                    if($r->ano_Recibo < 2021) {
                        $tasa->valorTC = round($tasa->valorTC/10000,6)/100;
                    }elseif($r->ano_Recibo == 2021){
                        $tasa->valorTC = ($r->mes_Recibo < 10)?round($tasa->valorTC/10000,6)/100:$tasa->valorTC;
                    }

                    echo 'Tasa actualizada : ' . $tasa->dateValorTC . ' | ' . $tasa->valorTC . PHP_EOL;
                    $mes_actual = $r->mes_Recibo;

                }

                if($is_cambioDolarizado){
                    $montoUSD = round($r->montoDT / $tasa->valorTC,2);

                    echo $r->cod_Entidad . ' : ' . 
                        $r->ano_Recibo . ' / ' . $r->mes_Recibo . 
                        ' ->  ( ' . $r->montoDT . 'Bs ) @ ' . $date . ' : ' . 
                        $tasa->valorTC . ' : ' .
                        $montoUSD. '$ ';
                }else{
                    echo $r->cod_Entidad . ' : ' . $r->ano_Recibo . ' / ' . $r->mes_Recibo . ' ->  ( ' . $r->montoDT . ' ) ';
                }
            }else {
                echo $r->cod_Entidad . ' : ' . $r->ano_Recibo . ' / ' . $r->mes_Recibo . ' ->  ( ' . $r->montoDT . ' ) ';
            }
            
            //cambio cod_Entidad para cambios de edificio
            if($is_cambioEdif) {
                $idE_nueva = DB::connection($cnDanoral)
                    ->table('entidades')
                    ->where([
                        ['entidades.id_EntidadPadre', $idE_edif],
                        ['entidades.cod_Entidad', $r->cod_Entidad],
                ])
                ->first();
                $idE_apto = SyncEntidades::cambioID_apto($idE_nueva->id_Entidad);
                echo "ID Cambio: $r->id_Entidad -> $idE_apto" . PHP_EOL;
            }else{
                $idE_apto = SyncEntidades::cambioID_apto($r->id_Entidad); 
            }            

            /*
            $is_dolarizado = true;
            if($r->ano_Recibo <= 2021) {
                if($r->mes_Recibo <= 5) {
                    $is_dolarizado = false;
                }
            }
            */

            echo "++++++: OK" . PHP_EOL;

            DB::beginTransaction();
            try{
                //crear 130  - Cuotas
                $iDT_cuota = new TransDT;
                $iDT_cuota->setSchema_ano($ano);
                $iDT_cuota->fill([
                    'ctaDT'         => 130,
                    'dhDT'          => 0,
                    'montoDT'       => $is_cambioDolarizado? $montoUSD : $r->montoDT,
                    'typeDT'        => TransDT::$TYPE_CUOTA,
                    'anoDT'         => $r->ano_Recibo,
                    'mesDT'         => $r->mes_Recibo,
                    'idE'           => $idE_apto,
                    'idT'           => $trans->idT,
                    'idMoneda'      => $is_dolarizado? 1002 : 1001,
                ]);
                $iDT_cuota->save();

                echo 'idDT : ' . $iDT_cuota->idDT . PHP_EOL;

                $cuota = new Cuota;
                $cuota->setSchema_ano($ano);
                $cuota->fill([
                    'idCond'        => null,
                    'idE'           => $idE_apto,
                    'idDTCuota'     => $iDT_cuota->idDT,
                ]);
                if($is_cambioDolarizado) {
                    $cuota->montoOrigen = $r->montoDT; //se utiliza solo para los recibos migrados a dolares para mantener el monto origen en Bs
                }
                if($is_dolarizado){
                    echo 'montoOrigen is_dolarizado: '. $tasa->idTC .' | '. $tasa->dateValorTC .' | '. $tasa->valorTC . PHP_EOL;
                    $cuota->montoOrigen = round($r->montoDT * $tasa->valorTC,2); //establece monto origen en Bs para cuotas en $
                    $cuota->tcEmision_idTC = $tasa->idTC;
                    echo 'montoOrigen: '. $cuota->montoOrigen . PHP_EOL;

                    //fecha de gracia si aplica
                    if(!is_null($tcEmision_dateVen)){
                        $cuota->tcEmision_dateVen = $tcEmision_dateVen;
                    }
                }
                $cuota->save();

                DB::commit();

            }catch (\Exception $e) {
                DB::rollback();

                echo '+++++++++++++++++++++++++++++++++++++++++++++++  rollback'.PHP_EOL ;
                var_dump($e->getMessage());
            }

        }

        //print_r($recibos);
    }
    /* Para Eliminar
        SELECT * 
        FROM admin24.cuotas
        WHERE "idCuota" >= 100100240000047217 AND "idCuota" <= 100100240000047404

        SELECT *
        FROM admin24.transdt
        WHERE "idDT" >= 100100240000136216 AND "idDT" <= 100100240000136403



        */

    public static function dolarizarCuotasIniciales($codEdif){
        $u = new U;
        $u->isEcho = true;
        $u->eLinea("<--- dolarizarCuotasIniciales: $codEdif");
                
        $type_trans = 2002;

        if(empty($codEdif)){
            $u->eLinea("codEdif vacio");
            return 0;
        }

        //Edificio
        $e_edif = Entidad::getEdif_cod($codEdif);

        if($e_edif){
            $idE_edif = $e_edif->idE;
            $ref_trans = $codEdif;

            $u->eLinea("Edificio Encontrado: idE => $idE_edif");

        }else{
            return 0;
        }

        $u->eLinea("INICIO: dolarizarCuotasIniciales:codE: $codEdif | $idE_edif | refTrans: $ref_trans ");

        //Carga o crea la Trans Condominio
        $trans = Trans::firstWhere([
            ['typeT', $type_trans],
            ['refT',$ref_trans]
        ]);

        if($trans){
            $u->eLinea("trans encontrada: $type_trans | $ref_trans | idT => $trans->idT");
        }else{
            return 0;
        }

        //Cuotas
        $cuotaV = CuotaView::where([
            ['idT', $trans->idT],
        ])
        ->get();

        $u->eLinea("count cuotaV: ". count($cuotaV));

        $tasa = new TasaCambio;
        foreach($cuotaV as $cv){
            $u->eLinea("$cv->idCuota ($cv->mesDT/$cv->anoDT) => $cv->montoDT");

            $date = "$cv->anoDT-$cv->mesDT-28";
            $u->eLinea("fecha emision: $date");

            $tasa = TasaCambio::getTasaFecha($date);

            if($cv->anoDT < 2021) {
                $tasa->valorTC = round($tasa->valorTC/10000,6)/100;
            }elseif($cv->anoDT == 2021){
                $tasa->valorTC = ($cv->mesDT < 10)?round($tasa->valorTC/10000,6)/100:$tasa->valorTC;
            }

            $u->eLinea("Tasa actualizada : $tasa->dateValorTC | $tasa->valorTC");


            $montoUSD = round($cv->montoDT / $tasa->valorTC, 2);
            $montoOrigen = $cv->montoDT;

            $u->eLinea("$cv->idE : ($cv->mesDT/$cv->anoDT) | [$montoOrigen Bs]@$date:$tasa->valorTC => [$montoUSD $]");

            
            DB::beginTransaction();
            try{
                $cuota = Cuota::find($cv->idCuota);
                $cuota->montoOrigen	= $montoOrigen;
                $cuota->save();

                $tDT = TransDT::find($cv->idDTCuota);
                $tDT->montoDT = $montoUSD;
                $tDT->idMoneda = 1002;
                $tDT->save();
        
                DB::commit();



            }catch (\Exception $e) {
                DB::rollback();

                echo '+++++++++++++++++++++++++++++++++++++++++++++++  rollback'.PHP_EOL ;
                var_dump($e->getMessage());
            }

            $u->eLinea('');
        }
    }

    public static function eliminarCuotas($cuotas, $schema){
        $u = new U;
        $u->isEcho = true;

        $arrCuotas_idCuota = $cuotas->select('idCuota');
        $arrCuotas_idDTCuota = $cuotas->select('idDTCuota');

        $u->eLinea('arrCuotas_idCuota : '.$arrCuotas_idCuota);
        $u->eLinea('arrCuotas_idDTCuota : '.$arrCuotas_idDTCuota);

        //return $u->logList; //para testeo

        //transdt_cambio cuotas (vinculos) select
        $u->eLinea('transdt_cambio cuotas');
        $transDT_cambio_cuotas = DB::table("$schema.transdt_cambio")
            ->whereIn('idDT_base', $arrCuotas_idDTCuota)
            ->get();
        $u->eLinea(count($transDT_cambio_cuotas)); 

        $arrTransDT_cambio_cuotas_idDT_quote = $transDT_cambio_cuotas->select('idDT_quote');

        $u->eLinea('arrTransDT_cambio_cuotas_idDT_quote : '.$arrTransDT_cambio_cuotas_idDT_quote);

        //DELETE CUOTAS
        $u->eLinea('* DELETE CUOTAS --------------------------------------------');

        //NotiPagoCuotas delete
        $u->eLinea('NotiPagoCuotas');
        $noti_pagos_cuotas_d =  DB::table('admin.noti_pagos_cuotas')
            ->whereIn('idCuota', $arrCuotas_idCuota)
            ->delete();
        $u->eLinea($noti_pagos_cuotas_d);

        //Cuotas delete
        $u->eLinea('cuotas');
        $cuotas_d = DB::table("$schema.cuotas")
            ->whereIn('idCuota', $arrCuotas_idCuota)
            ->whereNull('idDTCuotaCobro')
            ->delete();
        $u->eLinea($cuotas_d);

        //transdt_cambio cuotas (vinculos) delete
        $u->eLinea('transdt_cambio cuotas');
        $transdt_cambio_d = DB::table("$schema.transdt_cambio")
            ->whereIn('idDT_base', $arrCuotas_idDTCuota)
            ->delete();
        $u->eLinea($transdt_cambio_d);

        //transdt quote cuotas delete
        $u->eLinea('transdt cuotas quote');
        $transdt_quote_d = DB::table("$schema.transdt")
            ->whereIn('idDT', $arrTransDT_cambio_cuotas_idDT_quote)
            ->delete();
        $u->eLinea($transdt_quote_d);

        //transdt delete
        $u->eLinea('transdt cuotas');
        $transdt_d = DB::table("$schema.transdt")
            ->whereIn('idDT', $arrCuotas_idDTCuota)
            ->delete();
        $u->eLinea($transdt_d);

        return $u->logList;

    }

    public static function eliminarCuotaInicial($idE){
        $type_trans = 2002;
        
        $u = new U;
        $u->isEcho = true;
        $u->eLinea('<--- eliminar cuotas iniciales ' . $idE);

        $entidad = Entidad::find($idE);

        if($entidad){
            $schema = $entidad->getSchema_ano(2025);
            $datose = json_decode($entidad->datose); 
            if(!isset($datose->cod->value)){
                $u->eLinea('La entidad no tiene codigo');
                return;
            }

            $codE = $datose->cod->value;
            $u->eLinea('codE: ' . $codE);

            //Trans Inicial
            $trans = Trans::where([
                ['typeT', $type_trans],
                ['refT', $codE]
            ])
            ->first();
            
            if($trans){
                $u->eLinea('trans encontrada: ' . $trans->idT);

                DB::beginTransaction();
                try {
        
                    //Cuotas-----------------------------------------------------------
                    //SELECT CUOTAS
                    $u->eLinea('* SELECT CUOTAS --------------------------------------------');

                    //Cuotas
                    $u->eLinea('Cuotas');
                    $cuotasTransDT = DB::table("$schema.transdt")
                        ->where([
                            ['transdt.idT', $trans->idT],
                            //['transdt.anoDT', 2025],
                            //['transdt.mesDT', "<", 4],
                            //['transdt.idE', 100100030000062453],

                        ])
                        ->Join("$schema.cuotas as cu", 'transdt.idDT', '=', 'cu.idDTCuota')
                        ->whereNull('idDTCuotaCobro')
                        ->get();
                    $u->eLinea(count($cuotasTransDT));


                    $logList = Cuota::eliminarCuotas($cuotasTransDT, $schema);
                    $u->addLogList($logList);


                    DB::commit();
                    $u->eLinea('*commit');
                
                }catch (\Exception $e) {
                    DB::rollback();
        
                    $u->eLinea('+++++++++++++++++++++++++++++++++++++++++++++++  rollback');
                    var_dump($e->getMessage());
                }
            }
        }
        return $u->logList;
    }

    public static function getCuotasInicial($idE){
        $type_trans = 2002;

        $u = new U;
        $u->isEcho = false;
        $u->eLinea('<--- cuotas iniciales ' . $idE);

        $entidad = Entidad::find($idE);

        if($entidad){
            $datose = json_decode($entidad->datose); 
            if(!isset($datose->cod->value)){
                $u->eLinea('La entidad no tiene codigo');
                return;
            }

            $codE = $datose->cod->value;
            $u->eLinea('codE: ' . $codE);

            //Trans Inicial
            $trans = Trans::firstWhere([
                ['typeT', $type_trans],
                ['refT',$codE]
            ]);
            
            if($trans){
                $u->eLinea('trans encontrada: ' . $trans->idT);

                //Cuotas
                //$cuotas = CuotaView::getCuotasView_trans($trans->idT);

            }
        }
        return $u->logList;
    }

    


}
