<?php

namespace App\Http\Controllers\Adecuacion;

use App\{Captacion, Bitacora,AnioVigencia};
use App\PartidaRestringida;
use App\{AENormalTemporal, AERestringidaTemporal};
use App\{PresupuestoDetalle, PresupuestoDetalleRestringida};
use App\Exports\AdecuacionExternaExport;
use Maatwebsite\Excel\Facades\Excel;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\{Departamento, DepartamentoLimite};
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class AETemporalController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index() {
        $sql = "select *, null as servicio from view_aetemp_normal where estado = 1 union 
                select captacion_id,estado,contador,autorizado_mov,adecuadoAntes_mov,disponible_mov,reduccion_mov,ampliacion_mov,adecuacionDespues_mov,justificacion_mov,fecha_creacion_mov,presupuestoDetalleRestringida_id,ejercido_det,disponible_det,partida,presupuesto_id,departamento_id,nombre_dep,abreviatura_dep,clave_completa,accion_descripcion,partida_descripcion, servicio from view_aetemp_restringida where estado=1 order by clave_completa, partida";
        $movimientos = DB::select($sql);
        
        return view('adecuacion.externa.temp.listado')
                ->with('adecuacion', Captacion::where('contador', '!=', '0')->get())
                ->with('movimientos', $movimientos)
                ->with('departamentos', Departamento::whereHas('presupuestos')->orderBy('nombre')->get())
                ->with('no_pag', false);
    }

    public function filtro(Request $request){
        $data = $request->all();
        $cond = "";
        if ($data['filtro_departamento']!=null){ $cond.= " and departamento_id=" . $data['filtro_departamento'] . " "; }
        if ($data['filtro_captacion'] != null) { $cond.=" and captacion_id='" . $data['filtro_captacion'] . "'"; }
        if ($data['filtro_partida'] != null ) { $cond.= "and partida='" . $data['filtro_partida'] . "'"; }

        $sql = "select *, null as servicio from view_aetemp_normal where estado in (0,1) " . $cond . " union 
                select captacion_id,estado,contador,autorizado_mov,adecuadoAntes_mov,disponible_mov,reduccion_mov,ampliacion_mov,adecuacionDespues_mov,justificacion_mov,fecha_creacion_mov,presupuestoDetalleRestringida_id,ejercido_det,disponible_det,partida,presupuesto_id,departamento_id,nombre_dep,abreviatura_dep,clave_completa,accion_descripcion,partida_descripcion, servicio from view_aetemp_restringida where estado in (0,1) " . $cond . " order by clave_completa, partida";
                
        $movimientos = DB::select($sql);

        return view('adecuacion.externa.temp.contenido')
                ->with("movimientos", $movimientos );
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $anio = AnioVigencia::orderBy('anio','desc')->first();
        return view('adecuacion.externa.temp.nueva')
                    ->with('departamentos', Departamento::whereHas('presupuestos', function($query) use ($anio){ 
                                                $query->where('anio_id',$anio->anio); 
                                            })->orderBy('nombre')->get())
                    ->with('captacion', Captacion::where('estado', '1')->first());
    }

    /**
     * Consulta las claves que tiene el departamento
     * @return [json] 
     */
    public function showClave($idDepto)
    {   
        $anio = AnioVigencia::orderBy('anio','desc')->first();
        $sql = "select i.id, substr(clave_completa,1,8) as clave, indicador from presupuesto p join accion a on p.accion_id = a.id join indicador i on i.id=a.fk_idIndicador where p.departamento_id=? and p.anio_id=? group by i.id";
        $datos = DB::select($sql,array($idDepto,$anio->anio));
        return $datos;
    }

    public function showFormulario(Request $request)
    {   

        $data = $request->all();
        $sql = "select clave_completa, a.descripcion as accion_descripcion, pd.id, autorizado, adecuado, requisicion, ejercido, disponible, estado, partida_id, partida.descripcion as partida_descripcion from indicador i join accion a on a.fk_idIndicador=i.id join presupuesto p on p.accion_id=a.id join presupuesto_detalle pd on pd.presupuesto_id=p.id join partida on partida.id=pd.partida_id where departamento_id=? and i.id=?";
        $partidas = DB::select($sql,array( $data['depto'], $data['indicador'] ));

        $sql = "select clave_completa, a.descripcion as accion_descripcion, pd.id, autorizado, adecuado, requisicion, ejercido, disponible, estado, partida_id, partida.descripcion as partida_descripcion, servicio from indicador i join accion a on a.fk_idIndicador=i.id join presupuesto p on p.accion_id=a.id join presupuesto_detalle_restringidas pd on pd.presupuesto_id=p.id join partida on partida.id=pd.partida_id where departamento_id=? and i.id=?";
        $restringidas = DB::select($sql,array( $data['depto'], $data['indicador'] ));

        $sql = "select p.id, clave_completa, a.descripcion as accion_descripcion from indicador i join accion a on a.fk_idIndicador=i.id join presupuesto p on p.accion_id=a.id where departamento_id=? and i.id=?";
        $claves = DB::select($sql,array( $data['depto'], $data['indicador'] ));

        $partidas_nuevas = null;
        if (count($claves)==1) { //Solo tiene una accion
            $sql = "select * from partida where id not like '5%' and id not in (select partida_id from partida_restringida) and id not in (select partida_id from presupuesto_detalle  where presupuesto_id=?);";
            $partidas_nuevas = DB::select($sql,array( $claves[0]->id ));
        }

        $restringidas_nuevas = PartidaRestringida::select('descripcion', 'partida_id')->get();
        
        return view('adecuacion.externa.temp.formulario')
                    ->with('detalles', $partidas)
                    ->with('restringidas', $restringidas)
                    ->with('claves', $claves)
                    ->with('partidas', $partidas_nuevas)
                    ->with('new_restringidas', $restringidas_nuevas);
    }

    public function showPartida($idPresupuesto){
        $sql = "select * from partida where id not like '5%' and id not in (select partida_id from partida_restringida) and id not in (select partida_id from presupuesto_detalle  where presupuesto_id=?);";
        $partidas_nuevas = DB::select($sql,array( $idPresupuesto ));
        return $partidas_nuevas;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $data = $request->all();
        //dd(($data['movimientos']));

        $persona = json_decode(session('persona'));
        $depto = json_decode(session('departamento'));

        if ( Hash::check(md5($data['password']), $persona->password) ) {    
            $aux = DB::transaction(function () use ($data, $persona) {
                
                $captacion = Captacion::where('estado', '1')->first();
                $total_reduccion=0; $total_ampliacion=0;
                
                //movimientos partidas normales nuevas
                $ms = json_decode($data['nuevas']);
                foreach ($ms as $m) {
                    $d = PresupuestoDetalle::create(['autorizado'=>0, 'adecuado'=>$m->ampliacion, 'requisicion'=>0, 'ejercido'=>0, 'disponible'=>$m->ampliacion, 'estado'=>1, 'partida_id'=>$m->partida, 'presupuesto_id'=>$m->presupuesto]);
                    $ai = AENormalTemporal::create([ 'autorizado'=>0, 'adecuadoAntes'=>0, 'disponible'=>$m->ampliacion, 'reduccion'=>0, 'ampliacion'=>$m->ampliacion, 'adecuacionDespues'=>$m->ampliacion, 'justificacion'=>$m->justificacion, 'presupuestoDetalle_id'=>$d->id, 'personal_id'=>$persona->id, 'captacion_id'=>$captacion['id']]);

                    $total_ampliacion = $total_ampliacion+$m->ampliacion;
                }

                //movimientos partidas normales
                $ms = json_decode($data['movimientos']);
                foreach ($ms as $m) {
                    $d = PresupuestoDetalle::find($m->id);
                    $ai = AENormalTemporal::create([ 'autorizado'=>$d->autorizado, 'adecuadoAntes'=>$d->adecuado, 'disponible'=>$d->disponible, 'reduccion'=>$m->reduccion, 'ampliacion'=>$m->ampliacion, 'adecuacionDespues'=>$d->adecuado+$m->ampliacion-$m->reduccion, 'justificacion'=>$m->justificacion, 'presupuestoDetalle_id'=>$m->id, 'personal_id'=>$persona->id, 'captacion_id'=>$captacion['id']]);

                    $d->adecuado = $d->adecuado+$m->ampliacion-$m->reduccion;
                    $d->disponible = $d->disponible+$m->ampliacion-$m->reduccion;
                    $d->save();

                    $total_reduccion = $total_reduccion+$m->reduccion;
                    $total_ampliacion = $total_ampliacion+$m->ampliacion;
                }

                //movimientos partidas restringidas
                $ms = json_decode($data['nueva_restringida']);
                foreach ($ms as $m) {
                    $d = PresupuestoDetalleRestringida::create(["autorizado"=>0, "adecuado"=>$m->ampliacion, "subpresupuesto"=>0, "requisicion"=>0, "ejercido"=>0, "disponible"=>$m->ampliacion, "servicio"=>$m->servicio, "sede"=>$m->sede, "fecha_inicio"=>$m->fecha_inicio, "fecha_termino"=>$m->fecha_termino, "justificacion"=>$m->justificacion, "poblacion"=>$m->poblacion, "objetivo"=>$m->objetivo, "costo"=>$m->costo, "participantes"=>$m->participantes, "riesgos"=>$m->riesgos, "desglose"=>$m->desglose, "estado"=>1, "cucop_id"=>null, "partida_id"=>$m->partida, "presupuesto_id"=>$m->presupuesto]);
                    $ai = AERestringidaTemporal::create([ 'autorizado'=>0, 'adecuadoAntes'=>0, 'disponible'=>$m->ampliacion, 'reduccion'=>0, 'ampliacion'=>$m->ampliacion, 'adecuacionDespues'=>$m->ampliacion, 'justificacion'=>$m->justificacion_movimiento, 'presupuestoDetalleRestringida_id'=>$d->id, 'personal_id'=>$persona->id, 'captacion_id'=>$captacion['id']]);

                    $total_ampliacion = $total_ampliacion+$m->ampliacion;
                }

                //movimientos partidas restringidas
                $ms = json_decode($data['restringidas']);
                foreach ($ms as $m) {
                    $d = PresupuestoDetalleRestringida::find($m->id);
                    $ai = AERestringidaTemporal::create([ 'autorizado'=>$d->autorizado, 'adecuadoAntes'=>$d->adecuado, 'disponible'=>$d->disponible, 'reduccion'=>$m->reduccion, 'ampliacion'=>$m->ampliacion, 'adecuacionDespues'=>$d->adecuado+$m->ampliacion-$m->reduccion, 'justificacion'=>$m->justificacion, 'presupuestoDetalleRestringida_id'=>$m->id, 'personal_id'=>$persona->id, 'captacion_id'=>$captacion['id']]);

                    $d->adecuado = $d->adecuado+$m->ampliacion-$m->reduccion;
                    $d->disponible = $d->disponible+$m->ampliacion-$m->reduccion;
                    $d->save();

                    $total_reduccion = $total_reduccion+$m->reduccion;
                    $total_ampliacion = $total_ampliacion+$m->ampliacion;
                }

                //Llevar la cuenta de el total de las reducciones y total de ampliaciones para la diferencia sumarla o restarla en 
                $deptoLimite = DepartamentoLimite::where('departamento_id', $data['departamento'])->where('anio_id', date('Y'))->first();
                if ($total_ampliacion>$total_reduccion) { //La difrencia sumarla al autorizado por departamento
                    $diff = $total_ampliacion-$total_reduccion;
                    $deptoLimite->autorizado = $deptoLimite->autorizado+$diff;
                    $captacion->capturado_poa_nuevo = $captacion->capturado_poa_nuevo+$diff;
                } elseif( $total_reduccion>$total_ampliacion){ // la diferencia restarla al autorizado por departamento
                    $diff = $total_reduccion - $total_ampliacion;
                    $deptoLimite->autorizado = $deptoLimite->autorizado-$diff;
                    $deptoLimite->limite = $deptoLimite->limite-$diff;
                    $captacion->capturado_poa_nuevo = $captacion->capturado_poa_nuevo-$diff;
                }
                $deptoLimite->save();
                $captacion->save();
                
                Bitacora::create(['operacion'=>'Se guardo un movimiento de adecuacion externa', 'idPersonal'=>$persona->id ]);
                
            });
            return response()->json(['status'=>'success', 'message'=>'Registro exitoso!!']);
        } else { return response()->json(['status'=>'error', 'message'=>'Las contraseñas no coinciden.']); }


    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

    public function exportar($filtro_departamento, $filtro_captacion, $filtro_partida){
        $cond = "";
        if ($filtro_departamento!=0){ $cond.= " and departamento_id=" . $filtro_departamento . " "; }
        if ($filtro_captacion != 0) { $cond.=" and captacion_id='" . $filtro_captacion . "'"; }
        if ($filtro_partida != 0 ) { $cond.= "and partida='" . $filtro_partida . "'"; }
        $sql = "select *, null as servicio from view_aetemp_normal where estado=1 " . $cond . " union 
                select captacion_id,estado,contador,autorizado_mov,adecuadoAntes_mov,disponible_mov,reduccion_mov,ampliacion_mov,adecuacionDespues_mov,justificacion_mov,fecha_creacion_mov,presupuestoDetalleRestringida_id,ejercido_det,disponible_det,partida,presupuesto_id,departamento_id,nombre_dep,abreviatura_dep,clave_completa,accion_descripcion,partida_descripcion, servicio from view_aetemp_restringida where estado=1 " . $cond . " order by clave_completa, partida";
        $movimientos = DB::select($sql);
        return new AdecuacionExternaExport($movimientos);
    }
}
