<?php

namespace Predial\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;

use Predial\Avaluo;
use Predial\Predio;
use Predial\TipoPredio;
use Predial\GrEstadoPredio;
use Predial\EstratoPredio;
use Predial\Ruta;
use Predial\ciudad;
use Predial\Barrio;
use Predial\DestinoEconomico;
use Predial\ParametrizacionAnio;

class PredioController extends Controller{

    private $path = 'predios';

    public function index(){
        if(!empty(session()->get('usuario'))){
            $tipos    = TipoPredio::all();
            $estados  = GrEstadoPredio::all();
            $estratos = EstratoPredio::all();
            $ruta     = Ruta::all();

            $ciudad   = ciudad::obtnerCiudades();
            $destino  = DestinoEconomico::all();

            $datausuario = DB::table("gs_usuario")
                        ->select(
                            'rol'
                        )
                        ->where('usuario',  '=',session()->get('usuario'))
                        ->first();
            return view($this->path.'.index')
            ->with('datausuario',    $datausuario)
            ->with('tipos',    $tipos)
            ->with('estados',  $estados)
            ->with('estratos', $estratos)
            ->with('rutas',    $ruta)
            ->with('ciudades', $ciudad)
            ->with('destino',  $destino);
        }else{
            return redirect("CerrarSesion");
        }
    }

    public function store(Request $request){
        try {
            $predio = new Predio();

            if(!empty($request->chkLey1775)){
                $ley = $request->chkLey1775;
            }else{
                $ley = 1;
            }

            $predio->timestamps                = false;
            $predio->tipo_predio               = $request->sltTipoPredio;
            $predio->estado                    = $request->sltEstadoPredio;
            $predio->codigo_catastral          = $request->txtCodigo;
            $predio->nombre                    = $request->txtNombre;
            $predio->codigoigac                = $request->txtCodigoI;
            $predio->aniocreacion              = $request->txtAnnoC;
            $predio->codigo_sig                = $request->txtCodigoS;
            $predio->matricula_inmobiliaria    = $request->txtMatriculaI;
            $predio->ciudad                    = $request->sltCiudad;
            $predio->barrio                    = $request->sltBarrio;
            $predio->direccion                 = $request->txtDireccion;
            $predio->estrato                   = $request->sltEstrato;
            // $predio->predioaso                 = $request->sltPredioAso;
            $predio->destino_economico         = $request->sltDestinoE;
            $predio->Ley_1175                  = $ley;
            $predio->codigo_catastral_anterior = $request->txtCodigoAnt;
            $predio->inicio_vigencia           = $request->txtInicioV;
            $predio->save();

            flash()->overlay('Información guardada correctamente', 'Información');

            return redirect('Predios');
        } catch (Exception $e) {
            return "Fatal Error = ".$e->getMessage();
        }
    }

    /*public function show($id_unico){
        try {
            if(!empty(session()->get('usuario'))){

                $id       = decrypt($id_unico);
                $datos    = Predio::find($id);
                if(!empty($datos->tipo_predio)){
                    $tipos = TipoPredio::find($datos->tipo_predio);
                }else{
                    $tipos = "";
                }

                if(!empty($datos->estado)){
                    $estado = GrEstadoPredio::find($datos->estado);
                }else{
                    $estado = "";
                }

                if(!empty($datos->ciudad)){
                    $ciudad = ciudad::find($datos->ciudad);
                }else{
                    $ciudad = "";
                }

                if(!empty($datos->barrio)){
                    $barrio = Barrio::find($datos->barrio);
                }else{
                    $barrio = "";
                }

                if(!empty($datos->estrato)){
                    $estrato = EstratoPredio::find($datos->estrato);
                }else{
                    $estrato = "";
                }

                if(!empty($datos->ruta)){
                    $ruta = Ruta::find($datos->ruta);
                }else{
                    $ruta = "";
                }

                if(!empty($datos->predioaso)){
                    $predio_a = DB::table('gp_predio1 as pre')
                            ->select(
                                'pre.id_unico',
                                'pre.codigoigac as codigoI',
                                'ter.nombres as propietario',
                                'ter.numero as numdoc'
                            )
                            ->leftJoin('gp_tercero_predio as tpr', 'pre.id_unico', '=', 'tpr.predio')
                            ->leftJoin('gr_propietarios as ter','tpr.tercero', '=', 'ter.id_unico')
                            ->where('pre.id_unico', '=', $datos->predioaso)
                            ->first();
                }else{
                    $predio_a = "";
                }

                if(!empty($datos->destino_economico)){
                    $destino = DestinoEconomico::find($datos->destino_economico);
                }else{
                    $destino = "";
                }

                $avaluo   = Avaluo::where('predio', '=', $id)->where('anno', '=', date('Y'))->orderBy('anno', 'desc')->first();

                $data     = DB::select('select  pre.id_unico,
                                                pre.nombre,
                                                pre.codigo_catastral as codigoC,
                                                pre.codigoigac as codigoI,
                                                ter.nombres as propietario,
                                                ter.numero as numdoc, 
                                                (SELECT rol from gs_usuario where id_unico = 1) as rol 
                                    from        gp_predio1 as pre 
                                    left join gp_tercero_predio tpr on pre.id_unico = tpr.predio
                                    left join   gr_propietarios ter on tpr.tercero  = ter.id_unico
                                    ')
                        ;

                $datausuario = DB::table("gs_usuario")
                        ->select(
                            'rol'
                        )
                        ->where('usuario',  '=',session()->get('usuario'))
                        ->first();

                $min    = encrypt(Predio::min('id_unico'));
                $max    = encrypt(DB::table('gp_predio1')->max('id_unico'));
                return view($this->path.'.view')
                       ->with('datos',   $datos)
                       ->with('data',    $data)
                       ->with('tipo',    $tipos)
                       ->with('estado',  $estado)
                       ->with('ciudad',  $ciudad)
                       ->with('barrio',  $barrio)
                       ->with('estrato', $estrato)
                       ->with('ruta',    $ruta)
                       ->with('predio_a',  $predio_a)
                       ->with('destino', $destino)
                       ->with('max', $max)
                       ->with('min', $min)
                       ->with('datausuario', $datausuario)
                       ->with('avaluo', $avaluo);
            }else{
                return redirect("CerrarSesion");
            }
        } catch (Exception $e) {
            return "Fatal Error = ".$e->getMessage();
        }
    }*/
    public function show($id_unico)
    {
        try {
            if (!empty(session()->get('usuario'))) {

                $id       = decrypt($id_unico);
                $datos    = Predio::find($id);
                if (!empty($datos->tipo_predio)) {
                    $tipos = TipoPredio::find($datos->tipo_predio);
                } else {
                    $tipos = "";
                }

                if (!empty($datos->estado)) {
                    $estado = GrEstadoPredio::find($datos->estado);
                } else {
                    $estado = "";
                }

                if (!empty($datos->ciudad)) {
                    $ciudad = ciudad::find($datos->ciudad);
                } else {
                    $ciudad = "";
                }

                if (!empty($datos->barrio)) {
                    $barrio = Barrio::find($datos->barrio);
                } else {
                    $barrio = "";
                }

                if (!empty($datos->estrato)) {
                    $estrato = EstratoPredio::find($datos->estrato);
                } else {
                    $estrato = "";
                }

                if (!empty($datos->ruta)) {
                    $ruta = Ruta::find($datos->ruta);
                } else {
                    $ruta = "";
                }

                if (!empty($datos->predioaso)) {
                    $predio_a = DB::table('gp_predio1 as pre')
                        ->select(
                            'pre.id_unico',
                            'pre.codigoigac as codigoI',
                            'ter.nombres as propietario',
                            'ter.numero as numdoc'
                        )
                        ->leftJoin('gp_tercero_predio as tpr', 'pre.id_unico', '=', 'tpr.predio')
                        ->leftJoin('gr_propietarios as ter', 'tpr.tercero', '=', 'ter.id_unico')
                        ->where('pre.id_unico', '=', $datos->predioaso)
                        ->first();
                } else {
                    $predio_a = "";
                }

                if (!empty($datos->destino_economico)) {
                    $destino = DestinoEconomico::find($datos->destino_economico);
                } else {
                    $destino = "";
                }

                $avaluo   = Avaluo::where('predio', '=', $id)->where('anno', '=', date('Y'))->orderBy('anno', 'desc')->first();

                $data     = DB::select('select  pre.id_unico,
                                                pre.nombre,
                                                pre.codigo_catastral as codigoC,
                                                pre.codigoigac as codigoI,
                                                ter.nombres as propietario,
                                                ter.numero as numdoc, 
                                                (SELECT rol from gs_usuario where id_unico = 1) as rol 
                                    from        gp_predio1 as pre 
                                    left join gp_tercero_predio tpr on pre.id_unico = tpr.predio
                                    left join   gr_propietarios ter on tpr.tercero  = ter.id_unico
                                    ');

                $datausuario = DB::table("gs_usuario")
                    ->select(
                        'rol'
                    )
                    ->where('usuario',  '=', session()->get('usuario'))
                    ->first();

                $min    = encrypt(Predio::min('id_unico'));
                $max    = encrypt(DB::table('gp_predio1')->max('id_unico'));
                #primera consulta sacar el id de detalle factura y de detalle pago, relacionando 
                #factura, detallefactura, detallepago,pago
                /*SELECT DISTINCT fp.id_unico as id_unico_factura, p.id_unico as id_unico_pago, fp.numero
                FROM gr_factura_predial as fp 
                LEFT JOIN gr_detalle_factura_predial dfp ON dfp.factura = fp.id_unico 
                LEFT JOIN gr_detalle_pago_predial dp ON dp.detallefactura = dfp.id_unico 
                LEFT JOIN gr_pago_predial p ON p.id_unico = dp.pago 
                WHERE p.tipopago = 4 AND fp.parametrizacionanno = $_SESSION['anno'] 
                AND fp.predio = $id 
                ORDER BY fp.id_unico desc*/

                $param = ParametrizacionAnio::find(session()->get('anno'));
                $valParamA = $param->id_unico;
                $resultado = DB::table('gr_factura_predial as fp')
                    ->select('fp.id_unico as id_unico_factura', 'p.id_unico as id_unico_pago', 'fp.numero')
                    ->leftJoin('gr_detalle_factura_predial as dfp', 'dfp.factura', '=', 'fp.id_unico')
                    ->leftJoin('gr_detalle_pago_predial as dp', 'dp.detallefactura', '=', 'dfp.id_unico')
                    ->leftJoin('gr_pago_predial as p', 'p.id_unico', '=', 'dp.pago')
                    ->where('p.tipopago', 4)
                    ->where('fp.parametrizacionanno', session('anno'))
                    ->where('fp.predio', $id)
                    ->orderBy('fp.id_unico', 'desc')
                    ->distinct()
                    ->get();
                $indicador = 2;
                $numFactura = 0;
                if ($resultado->isNotEmpty()) {

                    $idUnicoFactura = $resultado[0]->id_unico_factura;
                    $idUnicoPago = $resultado[0]->id_unico_pago;
                    $numFactura = $resultado[0]->numero;
                    /*
                    #segunda consulta = hacer sum de la tabla detalle factura con el id de la factura de la consulta
                    #anterior 
                        SELECT SUM(valor) as valor FROM `gr_detalle_factura_predial` where factura = $idUnicoFactura
                    */
                    $sumDfp = DB::table('gr_detalle_factura_predial')
                        ->select(DB::raw('SUM(valor) as valor'))
                        ->where('factura', $idUnicoFactura)
                        ->first();

                    $totalDfp = $sumDfp->valor;
                    #tercera consulta hacer sum de detalle pago con el pago de la primera consulta
                    /*  
                        SELECT sum(Valor) as valor FROM gr_detalle_pago_predial where pago = $idUnicoPago
                    */
                    $sumaDp = DB::table('gr_detalle_pago_predial')
                        ->select(DB::raw('SUM(Valor) as valor'))
                        ->where('pago', $idUnicoPago)
                        ->first();

                    $totalDp = $sumaDp->valor;

                    #lueg restar la consulta 2 y 3 
                    $diferencia = $totalDfp - $totalDp;
                    if ($diferencia > 0) {
                        $indicador = 1;
                    } else {
                        $indicador = 2;
                    }
                }

                $abono = array('indicador' => $indicador, 'numeroFactura' => $numFactura);

                #por ultimo validar si la resta > 0 entonces modal
                return view($this->path . '.view')
                    ->with('datos',   $datos)
                    ->with('data',    $data)
                    ->with('tipo',    $tipos)
                    ->with('estado',  $estado)
                    ->with('ciudad',  $ciudad)
                    ->with('barrio',  $barrio)
                    ->with('estrato', $estrato)
                    ->with('ruta',    $ruta)
                    ->with('predio_a',  $predio_a)
                    ->with('destino', $destino)
                    ->with('max', $max)
                    ->with('min', $min)
                    ->with('datausuario', $datausuario)
                    ->with('avaluo', $avaluo)
                    ->with('abono', $abono);
            } else {
                return redirect("CerrarSesion");
            }
        } catch (Exception $e) {
            return "Fatal Error = " . $e->getMessage();
        }
    }

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

        $queries = DB::table('gp_predio1 as pre')
                        ->select(
                            'pre.id_unico',
                            DB::raw('CONCAT_WS(" ", pre.codigo_catastral,ter.nombres, ter.numero,pre.codigo_catastral_anterior) 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.'%')
                        ->orWhere('ter.numero', 'LIKE', '%'.$term.'%')
                        ->orWhere('ter.nombres', 'LIKE', '%'.$term.'%')
                        ->orWhere('ter.nombres', 'LIKE', '%'.$term.'%')
                        ->orWhere('pre.codigo_catastral_anterior', '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 autoCompleteAsc(Request $request)
{
    $cartera = $request->get('cartera');

    $query = DB::table('gp_predio1 as pre')
        ->select(
            'pre.id_unico as id',
            DB::raw("CONCAT_WS(' ', TRIM(pre.codigo_catastral), TRIM(ter.nombres), TRIM(ter.numero), TRIM(pre.codigo_catastral_anterior)) AS value")
        )
        ->leftJoin('gp_tercero_predio as tpr', function($join) {
            $join->on('tpr.predio', '=', 'pre.id_unico')
                 ->where('tpr.orden', '=', '001');
        })
        ->leftJoin('gr_propietarios as ter', 'tpr.tercero', '=', 'ter.id_unico')
        ->join('gr_cartera_obligada as o', 'o.predio', '=', 'pre.id_unico')
        ->whereNotNull('pre.codigo_catastral');

    if ($cartera) {
        $query->where('o.fecha', $cartera);
    }

    $predios = $query->orderBy('pre.codigo_catastral', 'ASC')->distinct()->get();

    return response()->json($predios);
}

public function autoCompleteDesc(Request $request)
{
    $cartera = $request->get('cartera');

    $query = DB::table('gp_predio1 as pre')
        ->select(
            'pre.id_unico as id',
            DB::raw("CONCAT_WS(' ', TRIM(pre.codigo_catastral), TRIM(ter.nombres), TRIM(ter.numero), TRIM(pre.codigo_catastral_anterior)) AS value")
        )
        ->leftJoin('gp_tercero_predio as tpr', function($join) {
            $join->on('tpr.predio', '=', 'pre.id_unico')
                 ->where('tpr.orden', '=', '001');
        })
        ->leftJoin('gr_propietarios as ter', 'tpr.tercero', '=', 'ter.id_unico')
        ->join('gr_cartera_obligada as o', 'o.predio', '=', 'pre.id_unico')
        ->whereNotNull('pre.codigo_catastral');

    if ($cartera) {
        $query->where('o.fecha', $cartera);
    }

    $predios = $query->orderBy('pre.codigo_catastral', 'DESC')->distinct()->get();

    return response()->json($predios);
}
    public function autoCompleteCode(Request $request){
        $term = $request->term;
        $results = array();

        $queries = DB::table('gp_predio1 as pre')
                        ->select(
                            'pre.id_unico',
                            DB::raw('CONCAT_WS(" ", pre.codigo_catastral,ter.nombres, ter.numero,pre.codigo_catastral_anterior) 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.'%')
                        ->orWhere('pre.codigo_catastral_anterior', '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 autoCompleteName(Request $request){
        $term = $request->term;
        $results = array();

        $queries = DB::table('gp_predio1 as pre')
                        ->select(
                            'pre.id_unico',
                            DB::raw('CONCAT_WS(" ", pre.codigo_catastral,ter.nombres, ter.numero) 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.nombre', '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 autoCompleteIgac(Request $request){
        $term = $request->term;
        $results = array();

        $queries = DB::table('gp_predio1 as pre')
                        ->select(
                            'pre.id_unico',
                            DB::raw('CONCAT_WS(" ", pre.codigo_catastral,ter.nombres, ter.numero) 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.codigoigac', '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 modalAbono($numeroFactura)
    {
        flash()->overlay("La factura $numeroFactura ya tiene abono. Por favor registre el abono en esta misma.", "Información");
        return back();
    }
}
