<?php

namespace App\Danoral\Bancos\sysOLD;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
//use Illuminate\Database\Query\Builder;
use Illuminate\Database\Eloquent\Builder;

use App\Danoral\Cobranzas\NotiPago;
use App\Danoral\Cobranzas\Cobros\CobroFormaPago;
use App\Danoral\Bancos\Banco;
use App\Danoral\Transacciones\TransDT;
use App\Danoral\Bancos\Ingreso;
use App\Danoral\Entidades\SyncEntidades;

class Planilla extends Model
{
    protected $connection = 'mysql_danoral';
    protected $table = 'planillas';
    protected $primaryKey = 'id_Planilla';
    public $incrementing = false;
    public $timestamps = false;

    public $isUsed = false;

    public function getIngresoView(): Ingreso {
        $ingreso = new Ingreso;
        $ingreso->idPlanilla    = $this->id_Planilla;
        $ingreso->dateIngreso   = $this->fecha_Planilla;
        $ingreso->ctaSysOld     = $this->cta_Planilla;
        $ingreso->refIngreso    = $this->num_Planilla;
        $ingreso->montoDT       = $this->montoDT;

        return $ingreso;
    }

    public static function getPlanillas_notiPago($np){

        $dateD  = date("Y-m-d",strtotime($np->datePagoNP." - 1 days"));
        $dateH  = date("Y-m-d",strtotime($np->datePagoNP." + 1 days"));      
        
        $planillas = Planilla::select([
            'planillas.*',
            'itemsdt.ctaDT',
            'itemsdt.tipoDT',
            'itemsdt.dhDT',
            'itemsdt.montoDT',
            DB::raw('false as isUsed')
        ])
        ->leftJoin('itemsdt', 'itemsdt.idDT', '=', 'planillas.idDT_Planilla')
        
        ->where(
            function (Builder $query) use ($np) {
                $query
                    ->orWhere('planillas.num_Planilla', 'like', '%'.substr($np->nroRefNP, -4).'%')
                    ->orWhere([
                        ['itemsdt.montoDT', '<=', $np->montoNP + 30],
                        ['itemsdt.montoDT', '>=', $np->montoNP - 30],
                    ]);
            }
        )
        
        ->where([
            ['planillas.cta_Planilla', $np->BancoView->ctaSysOld],
            ['planillas.fecha_Planilla', '>=', $dateD],
            ['planillas.fecha_Planilla', '<=', $dateH],
            ['planillas.num_Planilla', 'like', '%'.substr($np->nroRefNP, -4).'%'],
        ])
        ->orderBy('itemsdt.montoDT', 'asc')
        ->get();

        if($planillas) {

            return $planillas;
        }


        $psSend = array();
        foreach($planillas as $i=>$p){
            $pU = CobroFormaPago::firstWhere('idDT', $p->idDT_Planilla);

            if($pU){
                $p['isUsed'] = true;
            }else{
                $p['isUsed'] = false;
            }

            $psSend[$i] = $p;

        }


        return $psSend;

    }

    public static function migrarPlanillas(){
        echo "Inicio migrar planillas" . PHP_EOL;

        $bancos = DB::connection('mysql_danoral')
            ->table('bancos')
            ->Join('lista_bancos', 'bancos.id_Banco', '=', 'lista_bancos.id_Banco')
            ->Join('cuentas', 'bancos.cod_Cuenta', '=', 'cuentas.cod_Cuenta')
            ->orderBy('bancos.cod_Cuenta', 'asc')
            ->get();

        foreach($bancos as $b){
            echo "$b->cod_Cuenta | $b->id_EntidadFamilia | $b->nombre_Banco | " ;
            $banco = Banco::firstWhere('ctaSysOld', $b->cod_Cuenta);

            if(!$banco) {
                echo "no se encontro el banco $b->cod_Cuenta" . PHP_EOL;
                continue;
            }

            echo $banco->idBanco . PHP_EOL ;

            //if($b->cod_Cuenta < 4){ continue; }
        
            $planillas = Planilla::select([
                'planillas.*',
                'itemsdt.ctaDT',
                'itemsdt.tipoDT',
                'itemsdt.dhDT',
                'itemsdt.montoDT',
            ])
            ->leftJoin('itemsdt', 'itemsdt.idDT', '=', 'planillas.idDT_Planilla')
            ->Where([
                ['planillas.cta_Planilla', $b->cod_Cuenta],
                ['planillas.fecha_Planilla', '>=', '2023-01-01'],
                // ['planillas.fecha_Planilla', '<=', $dateH]
            ])
            ->orderBy('planillas.fecha_Planilla', 'asc')
            ->get();

            $iP_update = 0;
            $iP_insert = 0;

            $iP = 1;
            $countP = count($planillas);
            echo "Planillas count: $countP" . PHP_EOL;

            $countPorc = ($countP>20)?$countP/20:1;

            foreach($planillas as $i=>$p){
                //echo "$p->fecha_Planilla | $p->tipo_Planilla | $p->num_Planilla | $p->montoDT " . PHP_EOL ;

                if(($iP%$countPorc)==0){
                    echo "--->" . $iP ." | ". round(($iP*100)/$countP) ."%  I:$iP_insert / U:$iP_update". PHP_EOL;
                }

                $ingreso = Ingreso::firstWhere([
                    ['idBanco', $banco->idBanco],
                    ['dateIngreso', $p->fecha_Planilla],
                    ['typeIngreso', $p->tipo_Planilla],
                    ['refIngreso', $p->num_Planilla],                    
                ]);

                if($ingreso){
                    //echo "*";
                    $iP_update++;

                    $ingreso->idDTIngresoCobro = $p->idDT_CajaPlanilla;
                    $ingreso->idPlanilla = $p->id_Planilla;

                }else{
                    //echo "+";
                    $iP_insert++;
    
                    $ingreso = new Ingreso;
                    $ingreso->fill([
                        'idBanco'             => $banco->idBanco,
                        'dateIngreso'         => $p->fecha_Planilla,
                        'refIngreso'          => $p->num_Planilla,
                        'typeIngreso'         => $p->tipo_Planilla,
                        'idDTIngresoCobro'    => $p->idDT_CajaPlanilla,           
                        'idPlanilla'          => $p->id_Planilla,
                    ]);
                    
                }
                $ingreso->monto = $p->montoDT;
                $ingreso->setBanco($banco);
                $ingreso->saveTrans();

                $iP++;

                //echo $ingreso->idIngreso . PHP_EOL;
                //return;
            }
            echo "Ok | I:$iP_insert / U:$iP_update" . PHP_EOL;

            //return;
        }
    }
}
