<?php

namespace App\Danoral\Condominios;

use PDF;
use App\Danoral\Condominios\Condominio;
use App\Danoral\Cuotas\CuotaView;
use App\Danoral\Dolarizacion\TasaCambio;
use App\Danoral\Entidades\Entidad;
use App\Danoral\Entidades\SyncEntidades;
use App\Danoral\Entidades\EDatoType;
use App\Danoral\Transacciones\TransDT;

class Recibo
{
    public $montoR;

    public $items = [];
    public $sum_monto_comunes;

    public $monto_fondo_dolarizado;
    public $monto_cuota_dolarizado;
    public $monto_tasa_dolarizado;
    
    public $cuotav;
    public $cond;
    public $e_edif;
    public $e_apto;
    public $edifE;
    public $aptoE;
    public $tasa_cambio;

    public $cuotasPendientes;
    public $infoMontos = [];

    public $idE_edif_old;
    public $idE_apto_old;

    public $rg;

    public $idE;
    public $ano;
    public $mes;
    public $refCond;
    public $idCuota;
    public $idDTCuota;

    public $typeDolarizado;


    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct($idE, $idCuota, $ano, $mes)
    {
        $this->idE = $idE;
        $this->idCuota = $idCuota;
        $this->ano = $ano;
        $this->mes = $mes;
    }

    public function getPeriodo($YM = false) {
        if($this->cond->mesCond && $this->cond->anoCond){

            $Y = $this->cond->anoCond;
            $M = $this->cond->mesCond<10?'0'.$this->cond->mesCond: $this->cond->mesCond;

            return $YM?"$Y-$M":"$M-$Y";

        }else if($this->cond->refCond){
            return ('ref-' . $this->cond->refCond);
        }else{
            return '';
        }
    }

    public function getRecibo() {

        if($this->idE < 999999999){
            $this->idE = SyncEntidades::cambioID_apto($this->idE);
        }

        //Apto
        $this->aptoE = Entidad::find($this->idE);
        $this->aptoE->loadDatos();

        //Edificio
        $this->edifE = Entidad::find($this->aptoE->idESuper);
        $this->edifE->loadDatos();
        $isEdifDolarizado = !is_null($this->edifE->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO));

        if($isEdifDolarizado){
            $this->typeDolarizado = $this->edifE->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO);
            $dolarizadoDesde = $this->edifE->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO_DESDE);

            if(!isset($dolarizadoDesde)){
                return "<h2>error en fecha dolarizado desde<h2>";
            }else{
                $dolarizadoDesde_time = strtotime($dolarizadoDesde);
                //$anoDesde = date("Y", $dolarizadoDesde_time);
                //$mesDesde = date("m", $dolarizadoDesde_time);

                $fechaRecibo_time = strtotime("$this->ano-$this->mes-01");
                $isReciboDolarizado = ($fechaRecibo_time >= $dolarizadoDesde_time);

                if($isReciboDolarizado){

                    $this->cuotav = new CuotaView;
                    $this->cuotav->setSchema_ano($this->ano);
                    $this->cuotav = $this->cuotav->Where([
                        ['idE', $this->idE],
                        ['anoDT', $this->ano],
                        ['mesDT', $this->mes],
                        ['refCond', $this->refCond],
                    ])
                    ->get();

                    if(!$this->cuotav){
                        return '<h2>no se encontro la cuota<h2>';
                    }else{

                        $this->cond = new Condominio;
                        $this->cond->setSchema_ano($this->cuotav[0]->anoDT);
                        $this->cond = $this->cond->find($this->cuotav[0]->idCond);
                        
                        if(!$this->cond){
                            return '<h2>no se encontro el condominio (E001)<h2>';
                        }else{
                            if(isset($this->cuotav[0]->tcEmision_idTC)){
                                $this->tasa_cambio = TasaCambio::find($this->cuotav[0]->tcEmision_idTC);
                            }else{
                                $this->tasa_cambio = TasaCambio::find($this->cuotav[1]->tcEmision_idTC);
                            }
                            $this->infoMontos       = json_decode($this->cond->infoMontos);
                            $this->cuotasPendientes = json_decode($this->cond->cuotasPendientes);

                            $this->loadRelacionGastos();

                            $nameFile = 'recibo-'.$this->edifE->codE.'-'.$this->aptoE->codCliente.'-'.$this->getPeriodo(true).'.pdf';

                            $pdf = PDF::loadView('get_recibo', ['Recibo' => $this]);
                            $pdf->setPaper('letter', 'portrait'); //Carta
                            return $pdf->stream($nameFile);
                        }
                    }
                    return;
                }
            }
        }
        //Edificio Recibo NO Dolarizado
        $mes = $this->mes;
        $ano = $this->ano;
        $idE = SyncEntidades::cambioID_apto_R($this->idE);

        //$ipHost = "138.122.4.95";     //LanOnline
        //$ipHost = "45.185.17.85";     //TechPre
        //$ipHost = "3.137.144.98";     //aws01
        //$ipHost = "190.123.190.10";   //SuperCable
        $ipHost = "38.51.56.150";     //MegaLink
        //$ipHost = env('DB_HOST_DANORAL');


        //$url = "http://". env('DB_HOST_DANORAL', '45.185.17.85') .":7701/admin7/rPDF_v3?idEA=$idE&ano=$ano&mes=$mes";

        $url = "http://$ipHost:7701/admin7/rPDF_v4/$idE/$ano/$mes";
        
        //return "<h2>$url<h2>";

        //return "...";


        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30 );

        $file = curl_exec($ch);

        curl_close($ch);

        $nameFile = 'recibo-'.$this->aptoE->codCliente.'-'.$ano.($mes<10?'0'.$mes: $mes);
        
        header("Content-type: application/pdf") ; 
        header("Content-Disposition: inline; filename=$nameFile.pdf");
        echo $file;
        return;

    }

    public function loadRelacionGastos($item_cond = null) {
        if(is_null($item_cond)){
            $item_cond = new CondominioItems;
            $item_cond->setSchema_ano($this->cond->anoCond);

            $item_cond = $item_cond->Where([
                    ['idCond', $this->cond->idCond],
                ])
                ->orderBy('idMoneda', 'asc')
                ->orderBy('ctaDT', 'asc')
                ->get();
        
        }

        $i = [];
        $iComunVES  = [];
        $iComunUSD  = [];
        $iAptoVES   = [];
        $iAptoUSD   = [];
        $iFondoVES  = [];
        $iFondoUSD  = [];

        $sumComunVES    = 0;
        $sumComunUSD    = 0;
        $sumAptoVES     = 0;
        $sumAptoUSD     = 0;
        $sumFondoVES    = 0;
        $sumFondoUSD    = 0;

        $iCuotaPD_VES = null;
        $iCuotaPD_USD = null;

        foreach( $item_cond as $ic ){

            //cambio de signo en DEBE
            if($ic->dhDT == TransDT::$dhD){
                $ic->montoDT *= (-1);
            }

            // referencia y monto alicuota
            if($ic->idE == $this->edifE->idE){
                //comun
                $ref = '';
                $monto_alicuota = ($ic->montoDT * $this->aptoE->alicuota)/100;
            }else{
                //NO comun
                $ref = trim($this->aptoE->codE);
                $monto_alicuota = $ic->montoDT;
            }


            $i = [
                'idE'               => $ic->idE_item,
                'idDT'              => $ic->idDT,
                'cta'               => $ic->ctaDT,
                'typeDT'            => $ic->typeDT,
                'periodo'           => $ic->getPeriodo(),
                'descripcion'       => $ic->getDescripcion(),
                'ref'               => $ref,
                'ano'               => $ic->anoDT,
                'mes'               => $ic->mesDT,
                'monto'             => $ic->montoDT,
                'monto_str'         => number_format($ic->montoDT, 2, ',', '.') . ($ic->idMoneda==1002?'$':''),
                'monto_alicuota'    => $monto_alicuota,
                'monto_alicuota_str'=> number_format($monto_alicuota, 2, ',', '.') . ($ic->idMoneda==1002?'$':''),
                'moneda'            => $ic->idMoneda,
            ];

            switch($ic->typeDT){
                case TransDT::$TYPE_CUOTA_PROVISION_DOLARES_USD:
                    switch($ic->idE){
                        case $this->edifE->idE:
                            $iCuotaPD_comun_USD = $i;
                            $iCuotaPD_comun_USD['descripcion'] .= ' [tasa@' . number_format($this->tasa_cambio->valorTC, 4, ',', '.') . ']';
                            //$iCuotaPD_comun_USD['ref'] = number_format($this->tasa_cambio->valorTC, 4, ',', '.');
                            break;
                        case $this->aptoE->idE:
                            $iCuotaPD_apto_USD = $i;
                            $iCuotaPD_apto_USD['descripcion'] .= ' [tasa@' . number_format($this->tasa_cambio->valorTC, 4, ',', '.') . ']';
                            //$iCuotaPD_apto_USD['ref'] = number_format($this->tasa_cambio->valorTC, 4, ',', '.');
                            break;
                    }
                    break;

                case TransDT::$TYPE_CUOTA_PROVISION_DOLARES_VES:
                    switch($ic->idE){
                        case $this->edifE->idE:
                            $iCuotaPD_comun_VES = $i;
                            break;
                        case $this->aptoE->idE:
                            $iCuotaPD_apto_VES = $i;
                            break;
                    }
                    break;

                case TransDT::$TYPE_FONDO:
                    switch($ic->idMoneda){
                        case 1001: //VES
                            array_push($iFondoVES, $i);
                            $sumFondoVES += $ic->montoDT;
                            break;
                        case 1002: //USD
                            array_push($iFondoUSD, $i);
                            $sumFondoUSD += $ic->montoDT;
                            break;
                    }
                    break;

                default:
                    switch($ic->idE){
                        case $this->edifE->idE:
                            switch($ic->idMoneda){
                                case 1001: //VES
                                    array_push($iComunVES, $i);
                                    $sumComunVES += $ic->montoDT;
                                    break;
                                case 1002: //USD
                                    array_push($iComunUSD, $i);
                                    $sumComunUSD += $ic->montoDT;
                                    break;
                            }
                            break;

                        case $this->aptoE->idE:
                            switch($ic->idMoneda){
                                case 1001: //VES
                                    array_push($iAptoVES, $i);
                                    $sumAptoVES += $ic->montoDT;
                                    break;
                                case 1002: //USD
                                    array_push($iAptoUSD, $i);
                                    $sumAptoUSD += $ic->montoDT;
                                    break;
                            }
                            break;
                    }

            }
        }
        $sumComunVES_alicuota = ($sumComunVES * $this->aptoE->alicuota)/100;
        $sumComunUSD_alicuota = ($sumComunUSD * $this->aptoE->alicuota)/100;

        $montoCuotaPD_comun_VES_alicuota = isset($iCuotaPD_comun_VES)?$iCuotaPD_comun_VES['monto_alicuota']:0;
        $montoCuotaPD_comun_USD_alicuota = isset($iCuotaPD_comun_USD)?$iCuotaPD_comun_USD['monto_alicuota']:0;
        $montoCuotaPD_apto_VES =  isset($iCuotaPD_apto_VES)?$iCuotaPD_apto_VES['monto']:0;
        $montoCuotaPD_apto_USD =  isset($iCuotaPD_apto_USD)?$iCuotaPD_apto_USD['monto']:0;

        $sumComunUSD_alicuota += $montoCuotaPD_comun_USD_alicuota;


        $sumaCuota_VES =
            $sumComunVES_alicuota +
            $sumAptoVES;

        $totalCuota_VES =
            $sumComunVES_alicuota +
            $sumAptoVES +
            $montoCuotaPD_comun_VES_alicuota +
            $montoCuotaPD_apto_VES;

        $totalCuota_USD =
            $sumComunUSD_alicuota +
            $sumAptoUSD +
            //$montoCuotaPD_comun_USD_alicuota +
            $montoCuotaPD_apto_USD;

        $montoCuotaVES = 0;
        $montoCuotaUSD = 0;
        $montoTotalVES = 0;
        foreach( $this->cuotav as $icv ){//recorre las cuotas segun la moneda asigna totales
            
            switch($icv->idMoneda){
                case 1001: // VES Bs
                    $montoCuotaVES = $icv->montoDT;
                    $montoTotalVES += $montoCuotaVES;
                    break;
                case 1002: // USD $
                    $montoCuotaUSD = $icv->montoDT;
                    //$montoTotalVES += $icv->montoOrigen;
                    //reconversion 2021
                    if($icv->anoDT == 2021){
                        $montoTotalVES += ($icv->mesDT < 10)?round($icv->montoOrigen/10000)/100:$icv->montoOrigen;
                    }else{
                        $montoTotalVES += $icv->montoOrigen;
                    }
                    break;
            }
        }

        $isMensaje_dolarizacion = (
            $this->typeDolarizado == 3 ||
            ($this->edifE->idE >= 100100020000000893 && $this->edifE->idE <= 100100020000000909) || // 9201 $B CONJ.RESIDENCIAL LA COLONIA EDF.17
            $this->edifE->idE == 100100020000001070  // 3335 CARABALLEDA COUNTRY MAR
        );

       //$isMensaje_dolarizacion &= $this->edifE->idE != 100100020000001183;

        /*
        $isMensaje_dolarizacion = (
            $this->typeDolarizado > 1 ||
            ($this->edifE->idE >= 100100020000000893 && $this->edifE->idE <= 100100020000000909) || // 9201 $B CONJ.RESIDENCIAL LA COLONIA EDF.17
            $this->edifE->idE == 100100020000000629 || // 9886 CONJ.RES.LA VILLA DE PLAZA
            $this->edifE->idE == 100100020000001070 || // 3335 CARABALLEDA COUNTRY MAR
            $this->edifE->idE == 100100020000001122 || // 3344 $B ALTOSOL
            $this->edifE->idE == 100100020000000525 || // 8799 ARICHUNA
            $this->edifE->idE == 100100020000000401    // 7536 $B CONJUNTO PARQUE LA INDIA
        );
        */

        //reconversion 2021
        if($icv->anoDT == 2021){
            $tc_valor = ($icv->mesDT < 10)?round($this->tasa_cambio->valorTC/10000)/100:$this->tasa_cambio->valorTC;
        }else{
            $tc_valor = $this->tasa_cambio->valorTC;
        }

        //montoRef 3236
        $montoRefUSD = $montoCuotaUSD + ($montoCuotaVES/$tc_valor);

        $this->rg = [
            'tc_valor'                  => $tc_valor,
            'tc_date'                   => $this->tasa_cambio->dateValorTC,
            'cond_venceTC'              => $this->cond->dateVenTasa,
            'sumComunVES'               => $sumComunVES,
            'sumComunUSD'               => $sumComunUSD,
            'sumAptoVES'                => $sumAptoVES,
            'sumAptoUSD'                => $sumAptoUSD,
            'sumFondoVES'               => $sumFondoVES,
            'sumFondoUSD'               => $sumFondoUSD,
            'sumComunVES_alicuota'      => $sumComunVES_alicuota,
            'sumComunUSD_alicuota'      => $sumComunUSD_alicuota,
            'iComunVES'                 => $iComunVES,
            'iComunUSD'                 => $iComunUSD,
            'iAptoVES'                  => $iAptoVES,
            'iAptoUSD'                  => $iAptoUSD,
            'iFondoVES'                 => $iFondoVES,
            'iFondoUSD'                 => $iFondoUSD,
            'iCuotaPD_comun_VES'        => isset($iCuotaPD_comun_VES)?$iCuotaPD_comun_VES:null,
            'iCuotaPD_comun_USD'        => isset($iCuotaPD_comun_USD)?$iCuotaPD_comun_USD:null,
            'iCuotaPD_apto_VES'         => isset($iCuotaPD_apto_VES)?$iCuotaPD_apto_VES:null,
            'iCuotaPD_apto_USD'         => isset($iCuotaPD_apto_USD)?$iCuotaPD_apto_USD:null,
            'sumaCuota_VES'             => $sumaCuota_VES,
            'totalCuota_VES'            => $totalCuota_VES,
            'totalCuota_USD'            => $totalCuota_USD,
            'montoCuotaVES'             => $montoCuotaVES,
            'montoCuotaUSD'             => $montoCuotaUSD,
            'montoTotalVES'             => $montoTotalVES,
            'montoRefUSD'               => $montoRefUSD,
            'isMensaje_dolarizacion'    => $isMensaje_dolarizacion,
        ];
    }

    public static function getRecibosCond($idE, $ano, $mes) {
        $e = Entidad::find($idE);        
        if($e){
            //Edificio
            $e->loadDatos();
            $isEdifDolarizado = !is_null($e->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO));

            if($isEdifDolarizado){
                $typeDolarizado = $e->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO);
                $dolarizadoDesde = $e->getDato(EDatoType::$DATO_TYPE_EDIF_DOLARIZADO_DESDE);
    
                if(!isset($dolarizadoDesde)){
                    return "<h2>error en fecha dolarizado desde<h2>";
                }else{
                    $dolarizadoDesde_time = strtotime($dolarizadoDesde);
    
                    $fechaRecibo_time = strtotime("$ano-$mes-01");
                    $isReciboDolarizado = ($fechaRecibo_time >= $dolarizadoDesde_time);
    
                    $recibos = array();
                    $i = 1;
                    $item_cond = null;
                    if($isReciboDolarizado){
                        
                        $e->subE = $e->getSubEntidades();
                        foreach($e->subE as $a){
                            
                            $r = new Recibo($a->idE, null, $ano, $mes);

                            //Edif
                            $r->edifE = $e;
                            $r->typeDolarizado = $typeDolarizado;
                             //Apto
                            $r->aptoE = $a;
                            $r->aptoE->loadDatos();
                            //echo '<br>';
                            //echo $i++ ." ".$r->aptoE->codE." ";

                            //Cuotas
                            $r->cuotav = CuotaView::Where([
                                ['idE',     $r->idE],
                                ['anoDT',   $r->ano],
                                ['mesDT',   $r->mes],
                                ['refCond', $r->refCond],
                            ])
                            ->get();

                            if(!$r->cuotav){
                                return '<h2>no se encontro la cuota<h2>';
                            }else{
                                
                                if(!isset($cond)){
                                    $cond = Condominio::find($r->cuotav[0]->idCond);
                                    $item_cond = CondominioItems::Where([
                                        ['idCond', $cond->idCond],
                                    ])
                                    ->orderBy('idMoneda', 'asc')
                                    ->orderBy('ctaDT', 'asc')
                                    ->get();
                                }
                                $r->cond = $cond;
                                //echo ": C_OK / ";
                                
                                if(!$r->cond){
                                    return '<h2>no se encontro el condominio  (E002)<h2>';
                                }else{

                                    if(isset($r->cuotav[0]->tcEmision_idTC)){
                                        $r->tasa_cambio = TasaCambio::find($r->cuotav[0]->tcEmision_idTC);
                                    }else{
                                        $r->tasa_cambio = TasaCambio::find($r->cuotav[1]->tcEmision_idTC);
                                    }
                                    
                                    $r->loadRelacionGastos($item_cond);

                                    array_push($recibos, $r);
                                }
                            }                          
                        }

                        $pdf = PDF::loadView('get_recibo_lista', ['Recibos' => $recibos]);
                        $pdf->setPaper('letter', 'portrait'); //Carta
                        return $pdf->stream("$e->codE-$ano$mes-recibos.pdf");
    
                    }
                }
            }
        }
    }

    public static function getRecibosApto($idE_apto, $isDemanda=false, $ano=2024) {
        $cuotas = new CuotaView;
        $cuotas->setSchema_ano($ano);
        $cuotas = $cuotas->Where([
            ['idCond','!=', null],
            ['idE', $idE_apto],
            //['idDTCuotaCobro', null]
        ])
        ->orderBy('anoDT', 'asc')
        ->orderBy('mesDT', 'asc')
        ->orderBy('idMoneda', 'asc')
        ->get();

        if(!$cuotas){
            return '<h2>no se encontraron cuotas<h2>';
        }else{

            //apto
            $aptoE = Entidad::find($idE_apto);
            $aptoE->loadDatos();
            $codApto = $aptoE->codE;

            //edif
            $edifE = Entidad::find($aptoE->idESuper);
            $edifE->loadDatos();
            $codEdif = $edifE->codE;
            $idCond = -10;

            $recibos = array();
            foreach($cuotas as $c){

                if($idCond == $c->idCond) { continue; }
                $idCond = $c->idCond;

                if($c->anoDT == $ano) { 

                    $r = new Recibo(
                            $c->idE,
                            $c->idCuota,
                            $c->anoDT,
                            $c->mesDT
                        );

                    //echo "<h2>$c->anoDT.$c->mesDT<h2>";

                    $r->cuotav = new CuotaView;
                    $r->cuotav->setSchema_ano($ano);
                    $r->cuotav = $r->cuotav->Where([
                        ['idE', $c->idE],
                        ['anoDT', $c->anoDT],
                        ['mesDT', $c->mesDT],
                        ['refCond', $c->refCond],
                    ])
                    ->get();

                    $r->cond = new Condominio;
                    $r->cond->setSchema_ano($ano);
                    $r->cond = $r->cond->find($c->idCond);

                    $r->tasa_cambio = TasaCambio::find($c->tcEmision_idTC);

                    if(!$r->cond){
                        return '<h2>no se encontro el condominio  (E003)<h2>';
                    }else{

                        $r->edifE = $edifE;
                        $r->aptoE = $aptoE;

                        if(isset($r->cuotav[0]->tcEmision_idTC)){
                            $r->tasa_cambio = TasaCambio::find($r->cuotav[0]->tcEmision_idTC);
                        }else{
                            $r->tasa_cambio = TasaCambio::find($r->cuotav[1]->tcEmision_idTC);
                        }


                        $r->loadRelacionGastos();

                        array_push($recibos, $r);
                    }
                }
            }

            
            if($isDemanda){
                $pdf = PDF::loadView('get_recibo_demanda_lista', ['Recibos' => $recibos]);
            }else{
                $pdf = PDF::loadView('get_recibo_lista', ['Recibos' => $recibos]);
            }
            $pdf->setPaper('letter', 'portrait'); //Carta
            return $pdf->stream("$codEdif-$codApto-recibos-$ano.pdf");

        }
    }
}
