<?php

namespace Predial\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
use Predial\FacturaPredial;
use Predial\PagosAnteriores;
use Predial\Predio;
use Predial\Http\Controllers\LiquidadorInteresesController;
use Predial\Tarifa;
use Predial\InteresDescuento;
use Predial\ConceptoPredial;
use Predial\DetalleFacturaPredial;
class PagosAnterioresController extends Controller{

    public function buscarPredioCodigo(Request $request){
        $term = $request->term;
        $results = array();

        $queries = DB::table('gp_predio1 as pre')
            ->select(
                'pre.id_unico',
                'pre.codigo_catastral as valor'
            )
            ->leftJoin('gp_tercero_predio as tpr', 'pre.id_unico', '=', 'tpr.predio')
            ->leftJoin('gr_propietarios as ter', 'tpr.tercero', '=', 'ter.id_unico')
            ->where('pre.codigo_catastral', 'LIKE', '%'.$term.'%')
            ->take(10)
            ->get();
        foreach ($queries as $query) {
            $id_unico  = encrypt($query->id_unico);
            $results[] = ['id' => $id_unico, 'value' => $query->valor];
        }

        return Response::json($results);
    }

    public function index(){
        if(!empty(session()->get('usuario')) AND !empty(session()->get('compania')) ){
            $bancos = DB::table('gf_cuenta_bancaria as cta')
                ->select(
                    'cta.id_unico',
                    'cta.numerocuenta as cod',
                    'cta.descripcion'
                )
                ->leftJoin('gf_cuenta_bancaria_tercero as cter', 'cter.cuentabancaria', '=', 'cta.id_unico')
                ->where('cter.tercero', '=', session()->get('compania'))
                ->where('cta.parametrizacionanno', '=', session()->get('anno'))
                ->get();
            return view("PagosAnteriores.index", compact("bancos"));
        }else{
            return redirect("CerrarSession");
        }
    }

    public function store(Request $request){
        $predio    = Predio::where('codigo_catastral', '=', $request->txtPredio)->first();
        $fecha_lig = explode("/", $request->txtFechaLiq);
        $fecha_lig = "$fecha_lig[2]-$fecha_lig[1]-$fecha_lig[0]";
        $fecha_pag = explode("/", $request->txtFechaPag);
        $fecha_pag = "$fecha_pag[2]-$fecha_pag[1]-$fecha_pag[0]";
        $banco     = empty($request->sltBanco)?NULL:$request->sltBanco;
        $avaluos = DB::table('gr_avaluo as ava')
            ->select('ava.*')
            ->leftJoin('gr_detalle_factura_predial as dtf', 'dtf.avaluo', '=', 'ava.id_unico')
            ->Where('ava.predio', '=', $predio->id_unico)
            ->WhereBetween('ava.anno', [$request->txtAnoI, $request->txtAnoF])
            ->orderBy('ava.anno', 'asc')
            ->distinct()
            ->get();
        PagosAnterioresController::creacionFactura($fecha_lig, $predio->id_unico, $avaluos, $fecha_pag, $banco);
        flash()->overlay("Información guardada correctamente", "Información");
        return back();
    }

    public static function creacionFactura($fechaLiq, $predio, $avaluos, $fechaPago, $banco){
        $numero = FacturaPredialController::getNumberParam(session()->get('anno'));
        $factura = FacturaPredialController::guardarCabezaFactura($numero, $fechaLiq, $fechaLiq, $predio);
        PagosAnterioresController::registrarDetallesFactura($factura, $fechaLiq, $predio, $avaluos);
        if(!empty($banco) || $banco != NULL){
            $pago = PagoPredialController::guardarPago($fechaPago, $banco, NULL, 1, $factura);
        }else{
            $pago = NULL;
        }
        PagosAnterioresController::guardarSeguimiento($fechaLiq, $fechaPago, $banco, $factura, $pago);
    }

    public static function registrarDetallesFactura($factura, $fechaLiq, $predio, $avaluos){
        try {
            $Liquidador = new LiquidadorInteresesController();
            $data       = FacturaPredial::find($factura);
            foreach ($avaluos as $value){
                $venc   = DB::table('gr_vencimiento as ven')
                    ->leftJoin('gf_mes as mes', 'ven.mes', '=', 'mes.id_unico')
                    ->where('ven.anno', '=', $value->anno)
                    ->where('tipo', '=', 1)
                    ->max('fecha');
                $vend   = DB::table('gr_vencimiento as ven')
                    ->leftJoin('gf_mes as mes', 'ven.mes', '=', 'mes.id_unico')
                    ->where('ven.anno', '=', $value->anno)
                    ->where('tipo', '=', 2)
                    ->where('mes.numero', '=', date("m"))
                    ->first();
                $id_ava = $value->id_unico;
                $tarifa = Tarifa::where('id_unico', '=', $value->tarifa)->first();#Datos de la tarifa
                $v_tar  = $tarifa->valor;#Valor de la tarifa relacionada al avaluo
                $data_des = InteresDescuento::where('tipo', '=', 2)->where('anio', '=', $value->anno)->first();
                if($tarifa->tipobaserango == 1){
                    $baseC = $value->valor;
                }

                if($tarifa->tipobasecalculo == 10){
                    $baseC = $value->valor;
                }
                $corporacion = 0;
                $dataCto  = ConceptoPredial::where('anno', '=', $value->anno)->get();
                $impuesto = 0;
                $descuento = 0;
                foreach ($dataCto as $row) {
                    $valor = 0;
                    switch ($row->id_concepto) {
                        case 1:
                            #Calculo de impuesto predial
                            $valor       = ($baseC * $v_tar) / 1000;
                            $impuesto    = $valor;
                            break;
                        case 3:
                            $base = 0; $por = 0;
                            if($tarifa->tipobaseambiental == 6 || $tarifa->tipobaseambiental == 1){
                                $base = $value->valor;
                                $por  = 1000;
                            }else
                                if($tarifa->tipobaseambiental == 7){
                                    $base = $impuesto;
                                    $por  = 100;
                                }
                            #Calculo de corporación regional o sobretasa ambiental
                            if(!empty($tarifa->porcentajeimpuestoambiental)){
                                $valor       = ($base * $tarifa->porcentajeimpuestoambiental) / $por;
                                $corporacion = $valor;
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 4:
                            #Calculo de Intereses de mora
                            if(empty($venc)){
                                $xvn = Carbon::createFromDate($value->anno, 01, 01);
                                $xvn = $xvn->lastOfMonth();
                                $xven = $xvn->format("Y-m-d");
                            }else{
                                $xven = $venc;
                            }
                            #Calculo de Intereses de mora
                            $valor = $Liquidador->liquidar_intereses($impuesto, $xven, $fechaLiq, $fechaLiq);
                            $valor = FacturaPredialController::redondear100($valor);
                            if($data->fechafactura > $xven){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 5:
                            #Calculo de descuento
                            if(!empty($vend)){
                                $ffd     = explode("-", $vend->fecha);
                                $fechaVV = Carbon::createFromDate($ffd[0], $ffd[1], $ffd[2]);
                                $xint    = LiquidadorInteresesController::obtenerPorcentaje($fechaVV->format('Y'), $fechaVV->format('m'), 2);
                                if(!empty($xint)){
                                    $valor = ($impuesto * $xint) / 100;
                                }else{
                                    $valor = 0;
                                }
                            }else{
                                $valor = 0;
                            }
                            $descuento = $valor * -1;
                            $valor = $descuento;
                            break;
                        case 6:
                            #Calculo de papalerio o otros
                            $valor       = $row->formula;
                            break;
                        case 7:
                            if(!empty($tarifa->porcentajesobretasa)){
                                #Calculo de sobretasa bomberil
                                $valor       = ($impuesto * $tarifa->porcentajesobretasa) / 100;
                            }else{
                                $valor       = 0;
                            }
                            break;
                        case 8:
                            if(empty($venc)){
                                $xvn  = Carbon::createFromDate($value->anno, 01, 01);
                                $xvn  = $xvn->lastOfMonth();
                                $xved = $xvn->format("Y-m-d");
                            }else{
                                $xved = $venc;
                            }
                            $valor = $Liquidador->liquidar_intereses($corporacion, $xved, $fechaLiq, $fechaLiq);
                            $valor = FacturaPredialController::redondear100($valor);
                            if($data->fechafactura > $xved){
                            }else{
                                $valor = 0;
                            }
                            break;
                        case 9:
                            $dd = DB::table('gr_debido_valor')
                                ->select('valor')
                                ->where('predio', '=', $predio)
                                ->first();
                            if(count($dd) > 0){
                                $valor = $dd->valor;
                            }else{
                                $valor = 0;
                            }
                            break;
                    }
                    $ddias   = 0;

                    $valor = ExtractoController::convertirPeso($valor);
                    $valor = FacturaPredialController::ValidarValorAbono($valor, $predio, $row->id_concepto, $value->anno);
                    $valor = ExcensionesController::ExcencionCabezaFactura($predio, $value->anno, $row->id_concepto, $valor);
                    $detalle = new DetalleFacturaPredial();
                    $detalle->valor    = $valor;
                    $detalle->factura  = $factura;
                    $detalle->concepto = $row->id_unico; #Concepto de impuesto
                    $detalle->avaluo   = $id_ava;
                    $detalle->dias     = $ddias;
                    $detalle->save();
                }
            }
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public static function guardarSeguimiento($fecha_liq, $fecha_pag, $banco, $factura, $pago){
        $data              = new PagosAnteriores();
        $data->fecha_liq   = $fecha_liq;
        $data->fecha_pag   = $fecha_pag;
        $data->banco       = $banco;
        $data->responsable = session()->get('usuario_tercero');
        $data->fecha       = date("Y-m-d");
        $data->factura     = $factura;
        $data->pago        = $pago;
        $data->save();
        return $data;
    }
}
