<?php

namespace App\Http\Controllers;

use App\Model\Permission;
use App\Model\Role;
use App\Model\TipoBibliografia;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Facade;
use Session;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Yajra\Datatables\Facades\Datatables;
use App\Model\Reserva;
use App\Model\Ejemplar;

class ReservaController extends Controller{

    public function getIndex(){

        try{

            $tipo_bibliografia = TipoBibliografia::all();

            $id = config('constants.ROLES.ADMINISTRADOR');

            if(Auth::user()->hasRole('Profesor')){
                $id = config('constants.ROLES.PROFESOR');
            }
            else if(Auth::user()->hasRole('Alumno')){
                $id = config('constants.ROLES.ALUMNO');
            }



            $dias_pretamo= DB::table('config_prestamo')
                ->where('rolid', $id)
                ->value('cant_dias_reserva');


            $reservas = DB::select(DB::raw("select b.id as 'id', 
                                              tb.nombre as 'type',
                                              b.nombre as 'Bibliografia', 
                                              b.materia as 'Materia', 
                                              b.editorial as 'Editorial', 
                                              a.nombres as 'Autor',
                                              b.path as 'path',
                                              COUNT(e.id) as 'Disponibles'
                                            from bibliografia b
                                                left join ejemplar e on b.id = e.id_bibliografia and e.estado = 1
                                                join autor a on b.id_autor = a.id
                                                join tipo_bibliografia tb on tb.id = b.id_tipo_bibliografia
                                                GROUP BY b.id, tb.nombre, b.nombre, b.materia, b.editorial, a.nombres, b.path
                                                order by 3"));



            return view('pages.reserva.index',compact("tipo_bibliografia","dias_pretamo","reservas"));

        }catch (QueryException $e){

            $error = "Ocurrio un error al consultar las bibliografias";
            return view('pages.index',compact('error'));
        }



    }

    public function getDetalle($id){

        try{

            $idrol = config('constants.ROLES.ADMINISTRADOR');

            if(Auth::user()->hasRole('Profesor')){
                $idrol = config('constants.ROLES.PROFESOR');
            }
            else if(Auth::user()->hasRole('Alumno')){
                $idrol = config('constants.ROLES.ALUMNO');
            }


            $dias_pretamo= DB::table('config_prestamo')
                ->where('rolid',$idrol)
                ->value('cant_dias_reserva');

            $ejemplares = DB::table('ejemplar')
                ->rightJoin('bibliografia','ejemplar.id_bibliografia','=','bibliografia.id')
                ->join('autor','bibliografia.id_autor','=','autor.id')
                ->join('tipo_bibliografia','tipo_bibliografia.id','=','bibliografia.id_tipo_bibliografia')
                ->where('bibliografia.id','=',$id)
                ->select('bibliografia.id',
                    'tipo_bibliografia.nombre as type',
                    'bibliografia.nombre as Bibliografia',
                    'bibliografia.materia as Materia',
                    'bibliografia.editorial as Editorial',
                    'bibliografia.imgurl as Image',
                    'autor.nombres as Autor',
                    'ejemplar.codigo_CS as code',
                    'ejemplar.id as IDejemplar',
                    'ejemplar.anio as Anio',
                    'ejemplar.edicion as Edicion',
                    'ejemplar.estado as Estado'
                )
                ->get();


            if(empty($ejemplares)){
                $error = "La bibliografia no posee ejemplares";
                return view('pages.index',compact('error'));
            }
            return view('pages.reserva.detalle',compact("ejemplares","dias_pretamo"));
        }catch (QueryException $e){
            $error = "Ocurrio un error al consultar los ejemplares";
            return view('pages.index',compact('error'));
        }
    }

    public function postReserva(Request $request){

        $ejemplarID = DB::table('ejemplar')
            ->where([
                ['estado', '=', 1],
                ['id_bibliografia', '=', (int)$request['bibliografia']]
            ])
            ->get()[0]->id;

        $var = DB::table('reserva')
            ->join('usuario','usuario.id','=','reserva.id_usuario')
            ->join('ejemplar','ejemplar.id','=','reserva.id_ejemplar')
            ->where('usuario.id','=',Auth::user()->id)
            ->where('ejemplar.id_bibliografia','=',(int)$request['bibliografia'])
            ->where('reserva.estado','!=',0)
            ->select('ejemplar.id_bibliografia')->get()->toArray();

        if($var != []){
            foreach ($var as $t){
                if($t->id_bibliografia == (int)$request['bibliografia']){
                    return response()->json(500);
                }
            }
        }


        $var = DB::table('reserva')
            ->join('usuario','usuario.id','=','reserva.id_usuario')
            ->join('ejemplar','ejemplar.id','=','reserva.id_ejemplar')
            ->where('usuario.id','=',Auth::user()->id)
            ->where('reserva.id_ejemplar','!=',(int)$ejemplarID)
            ->where('ejemplar.id_bibliografia','=',(int)$request['bibliografia'])
            ->where('reserva.estado','!=',0)
            ->select('ejemplar.id_bibliografia')->get()->toArray();

        if($var != []){
            foreach ($var as $t){
                if($t->id_bibliografia == (int)$request['bibliografia']){
                    return response()->json(500);
                }
            }
        }


        try{



            DB::table('ejemplar')
                ->where('id',$ejemplarID)
                ->update(['estado' => 2]);


            $arr = [
                'estado' => 1,
                'fecha_reserva' => date($request['FI']),
                'fecha_fin_reserva' => date($request['FF']),
                'id_usuario' => Auth::user()->id,
                'id_ejemplar' => (int)$ejemplarID
            ];

            $data = Reserva::create($arr);

            return response()->json($var);
        }catch (QueryException $e){
            return redirect('reservar');
        }
    }

    public function postReservaDetalle(Request $request){

        $var = DB::table('reserva')
            ->join('usuario','usuario.id','=','reserva.id_usuario')
            ->join('ejemplar','ejemplar.id','=','reserva.id_ejemplar')
            ->where('usuario.id','=',Auth::user()->id)
            ->where('ejemplar.id_bibliografia','=',(int)$request['IdBibliografia'])
            ->where('reserva.estado','!=',0)
            ->select('ejemplar.id_bibliografia')->get()->toArray();

        if($var != []){
            foreach ($var as $t){
                if($t->id_bibliografia == (int)$request['IdBibliografia']){
                    return response()->json(500);
                }
            }
        }
        $var = DB::table('reserva')
            ->join('usuario','usuario.id','=','reserva.id_usuario')
            ->join('ejemplar','ejemplar.id','=','reserva.id_ejemplar')
            ->where('usuario.id','!=',Auth::user()->id)
            ->where('reserva.id_ejemplar','=',(int)$request['IDE'])
            ->where('ejemplar.id_bibliografia','=',(int)$request['IdBibliografia'])
            ->where('reserva.estado','!=',0)
            ->select('ejemplar.id_bibliografia')->get()->toArray();

        if($var != []){
            foreach ($var as $t){
                if($t->id_bibliografia == (int)$request['IdBibliografia']){
                    return response()->json(500);
                }
            }
        }

        try{
            DB::table('ejemplar')
                ->where('id',(int)$request['IDE'])
                ->update(['estado' => 2]);


            $arr = [
                'estado' => 1,
                'fecha_reserva' => date($request['FI']),
                'fecha_fin_reserva' => date($request['FF']),
                'id_usuario' => Auth::user()->id,
                'id_ejemplar' => (int)$request['IDE']
            ];


            $data =  Reserva::create($arr);

            return response()->json($arr);
        }catch (QueryException $e){
            return redirect('reservar');
        }
    }


}
