<?php

namespace App\Http\Controllers;

use App\BibliografiaPrestamo;
use App\Model\Ciclo;
use App\Model\Ejemplar;
use App\Model\ConfigPrestamo;
use App\Model\Mora;
use App\Model\Prestamo;
use App\Providers\SweetAlertServiceProvider;
use App\Model\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use App\Model\Reserva;

class PrestamoController extends Controller
{
    private $path = 'Prestamos';

    public function configuracionIndex()
    {
        $prestamoadm = ConfigPrestamo::find(config('constants.ROLES.ADMINISTRADOR'));
        $prestamoalum = ConfigPrestamo::find(config('constants.ROLES.ALUMNO'));
        $prestamoprf = ConfigPrestamo::find(config('constants.ROLES.PROFESOR'));

        return view('pages.prestamo.configprestamo')->with('prestamoadm', $prestamoadm)->with('prestamoalum', $prestamoalum)->with('prestamoprf', $prestamoprf);
    }


    public function configuracionPrestamoRol(Request $request, $id)
    {

        $this->validate($request, [
            'cant_dias_reserva' => 'required|regex:/^[+]?\d+([.]\d+)?$/',
            'cant_dias_prestamo' => 'required|regex:/^[+]?\d+([.]\d+)?$/',
            'cant_libros_dia' => 'required|regex:/^[+]?\d+([.]\d+)?$/',
            'moraxdia' => 'required|regex:/^\d{0,10}(\.\d{0,2})?$/',
            'cant_dias_penalidad' => 'required|regex:/^[+]?\d+([.]\d+)?$/',
        ]);

        $result = ConfigPrestamo::find($id);
        $result->cant_dias_reserva = Input::get('cant_dias_reserva');
        $result->cant_dias_prestamo = Input::get('cant_dias_prestamo');
        $result->cant_libros_dia = Input::get('cant_libros_dia');
        $result->moraxdia = Input::get('moraxdia');
        $result->cant_dias_penalidad = Input::get('cant_dias_penalidad');
        $result->save();


        Alert()->success('Se actualizo correctamente!', 'Cambio realizado!')->persistent('Cerrar');
        return Redirect('prestamos/configuracion');

    }

    public function devolucionIndex()
    {
        return view('pages.prestamo.devolucion');
    }

    public function getDniUsuario($dniUsuario)
    {
        $dnisUsuarios = User::where('dni', 'LIKE', "%{$dniUsuario}%")
            ->where('estado','=',1)->get();

        return Response()->json(['data' => $dnisUsuarios]);
    }

    public function validarBusqueda(Request $request)
    {
        $dniUsuario = $request->input('dniUsuario');

        $data = DB::table('usuario')
            ->where('dni', '=', $dniUsuario)
            ->select('id')
            ->get();

        if ($data->isEmpty()) {
            alert()->error('No se encontro ningun usuario.', 'Por favor , ingrese un DNI valido.')->confirmButton('ok');
            return Redirect('prestamos/devolucion');
        } else {
            return redirect()->action('PrestamoController@devolucionLibro', [$data[0]->id]);
        }
    }

    public function validarBusquedaPrestamo(Request $request)
    {
        $dniUsuario = $request->input('dniUsuario');

        $data = DB::table('usuario')
            ->where('dni', '=', $dniUsuario)
            ->where('estado','=',1)
            ->select('id')
            ->get();

        if ($data->isEmpty()) {
            alert()->error('No se encontro ningun usuario.', 'Por favor , ingrese un DNI valido.')->confirmButton('Ok');
            return Redirect('/prestamos/validarbusquedaprestamo');
        } else {

            $prestamos = DB::table('prestamo')
                ->where('id_usuario', '=', $data[0]->id)
                ->where('fecha_devolucion', '!=', null)
                ->select('id')
                ->get();


            foreach ($prestamos as $prestamo) {
                $mora = DB::table('mora')
                    ->where('id_prestamo', '=', $prestamo->id)
                    ->where('cancelado', '=', 0)
                    ->select('id')->get();

                if (!$mora->isEmpty()) {
                    alert()->warning('El alumno no puede realizar prestamos debido a la(s) deuda(s) que presenta.', 'Sancionado!')->confirmButton('Ok');
                    return Redirect('prestamos/validarbusquedaprestamo');
                }

            }

            return redirect()->action('PrestamoController@registrosPrestamos', [$data[0]->id]);
        }


    }

    public function devolucionLibro($UsuarioID)
    {
        $usuario = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->join('roles', 'role_user.role_id', '=', 'roles.id')
            ->where('usuario.id', '=', $UsuarioID)
            ->select('usuario.nombres', 'usuario.apellido_paterno', 'usuario.apellido_materno', 'usuario.dni', 'roles.name')
            ->get();

        $prestamos = DB::table('prestamo')
            ->join('bibliografia_prestamo', 'prestamo.id', '=', 'bibliografia_prestamo.id_prestamo')
            ->join('ejemplar', 'bibliografia_prestamo.id_ejemplar', '=', 'ejemplar.id')
            ->join('bibliografia', 'ejemplar.id_bibliografia', '=', 'bibliografia.id')
            ->join('autor', 'bibliografia.id_autor', '=', 'autor.id')
            ->where('prestamo.id_usuario', '=', $UsuarioID)
            ->where('prestamo.fecha_devolucion', '=', null)
            ->where('ejemplar.estado','=',3)
            ->select('bibliografia.nombre', 'autor.nombres', 'ejemplar.anio', 'ejemplar.edicion', 'prestamo.fecha_inicio', 'prestamo.fecha_devolucion', 'prestamo.fecha_fin', 'prestamo.id')
            ->orderby('prestamo.fecha_inicio', 'desc')
            ->paginate(25);

        $userrol = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->where('usuario.id', '=', $UsuarioID)->select('role_id')->get();

        $auxdata = DB::table('config_prestamo')
            ->where('config_prestamo.rolid', $userrol[0]->role_id)
            ->select('id', 'rolid', 'cant_dias_reserva', 'cant_dias_prestamo', 'moraxdia', 'cant_libros_dia', 'cant_dias_penalidad')
            ->get();

        return view('pages.prestamo.librosdevolucion', compact('usuario', 'prestamos', 'auxdata'));

    }

    public function actualizacionPrestamo($PrestamoID)
    {

        $prestamo = Prestamo::find($PrestamoID);
        $prestamo->fecha_devolucion = Carbon::now('America/Lima');
        $prestamo->save();
        $montoMora = 0.00;
        $prestamo = Prestamo::find($PrestamoID);
        $usuario = User::find($prestamo->id_usuario);
        $userrol = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->where('usuario.id', '=', $usuario->id)->select('role_id')->get();

        $change = BibliografiaPrestamo::where('id_prestamo','=',$PrestamoID)->select('id_ejemplar')->get()->toArray()[0]['id_ejemplar'];
        Reserva::where('id_ejemplar','=',$change)->where('id_usuario','=',$usuario->id)->where('estado','=',2)->update(['estado' => 0]);

        $mora = ConfigPrestamo::where('rolid', '=', $userrol[0]->role_id)->select('moraxdia')->get();


        if (date(Carbon::now('America/Lima')) > $prestamo->fecha_fin) {
            $aux = date('Y-m-d', strtotime(Carbon::now('America/Lima')));

            $montoMora = (Carbon::parse($prestamo->fecha_fin)->diffInDays(Carbon::parse($aux))) * $mora[0]->moraxdia;
            if ($montoMora > 0.00) {
                $objMora = ["monto" => $montoMora, "cancelado" => 0, "id_prestamo" => $PrestamoID,
                    "created_at" => Carbon::now('America/Lima'),
                    "updated_at" => Carbon::now('America/Lima')];

                Mora::create($objMora);
                alert()->warning("El usuario tiene una mora registrada de S/ " . $montoMora, 'Se registro la devolución con éxito.')->confirmButton('Aceptar');
            }


        }

        $bibliografiaPrestamo = BibliografiaPrestamo::where('id_prestamo', '=', $prestamo->id)->get();

        $ejemplar = Ejemplar::where('id', '=', $bibliografiaPrestamo[0]->id_ejemplar)
            ->where('estado', '!=', config('constants.ESTADO_EJEMPLAR.DISPONIBLE'))
            ->first();

        if ($ejemplar != null) {
            $ejemplar->estado = config('constants.ESTADO_EJEMPLAR.DISPONIBLE');
            $ejemplar->save();
        }

        if ($montoMora == 0.00 || $montoMora == null) {
            Reserva::where('estado','=',2)
                ->where('id_ejemplar','=',$ejemplar->id)
                ->where('id_usuario','=',$usuario->id)
                ->update(['estado' => 0]);
            alert()->success('Se registro la devolución del libro satisfactoriamente.', 'Actualizado!')->confirmButton('Ok');
        }

        return redirect()->action('PrestamoController@devolucionLibro', [$usuario->id]);

    }

    public function registrarPrestamo()
    {
        return view('pages.prestamo.prestamo');
    }

    public function registrosPrestamos($UsuarioID)
    {

        $usuario = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->join('roles', 'role_user.role_id', '=', 'roles.id')
            ->where('usuario.estado', '=', 1)
            ->where('usuario.id', '=', (int)$UsuarioID)
            ->select('usuario.nombres', 'usuario.apellido_paterno', 'usuario.apellido_materno', 'usuario.dni', 'roles.name')
            ->get();



        $reservas = DB::table('reserva')
            ->join('ejemplar', 'reserva.id_ejemplar', '=', 'ejemplar.id')
            ->join('bibliografia', 'ejemplar.id_bibliografia', '=', 'bibliografia.id')
            ->join('autor', 'bibliografia.id_autor', '=', 'autor.id')
            ->where('reserva.id_usuario', '=', $UsuarioID)
            ->where('reserva.estado', '=', 1)
            ->where('ejemplar.estado', '=', 2)
            ->select('bibliografia.nombre', 'autor.nombres', 'ejemplar.anio', 'ejemplar.edicion', 'reserva.id')
            ->paginate(25);



        return view('pages.prestamo.librosprestamo', compact('usuario', 'reservas'));

    }

    public function registro($ReservaID)
    {
        $bibliotecarioID = Auth::id();
        $reserva = Reserva::find($ReservaID);
        $reserva->estado = 2;
        $reserva->save();

        $usuario = User::find($reserva->id_usuario);
        $usuarioID = $usuario->id;

        $userrol = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->where('usuario.id', '=', $usuario->id)->select('role_id')->get()->toArray();


        foreach ($userrol as $rol){

            if ($rol->role_id !=1 || $rol->role_id !=2 || $rol->role_id !=3){
                $cant_libros_dia = ConfigPrestamo::where('rolid', '=', 1)->select('cant_libros_dia')->get();
            }else{
                $cant_libros_dia = ConfigPrestamo::where('rolid', '=', $rol->role_id)->select('cant_libros_dia')->get();
            }

        }


        $cant_libros_prestados = DB::Select(
            DB::raw("
                   SELECT COUNT(p.id) as cant_libros_reservados
                    FROM prestamo p
                    RIGHT JOIN usuario u on p.id_usuario = u.id
                    WHERE p.fecha_devolucion is null and u.id = $usuarioID
            "));

        if ($cant_libros_dia[0]->cant_libros_dia > $cant_libros_prestados[0]->cant_libros_reservados) {

            $ejemplar = Ejemplar::find($reserva->id_ejemplar);

            $lstprestamos = DB::table('prestamo')
                ->join('bibliografia_prestamo', 'prestamo.id', '=', 'bibliografia_prestamo.id_prestamo')
                ->join('ejemplar','bibliografia_prestamo.id_ejemplar','=','ejemplar.id')
                ->where('prestamo.fecha_devolucion', '=', null)
                ->where('prestamo.id_usuario', '=', $usuario->id)
                ->select('ejemplar.id_bibliografia')->get();

            foreach ($lstprestamos as $item) {
                if ($item->id_bibliografia == $ejemplar->id_bibliografia){
                    $reserva->estado = 0;
                    $reserva->save();
                    alert()->error('No se puede prestar más libros, de la misma bibliografía ya prestada con anterioridad.', 'Ups...')->confirmButton('Ok');
                    $ejemplar->estado = config('constants.ESTADO_EJEMPLAR.DISPONIBLE');
                    $ejemplar->save();

                    return redirect()->action('PrestamoController@registrosPrestamos', [$usuario->id]);

                }
            }

            $ejemplar->estado = config('constants.ESTADO_EJEMPLAR.PRESTADO');
            $ejemplar->save();


            foreach ($userrol as $rol){

                if ($rol->role_id !=1 || $rol->role_id !=2 || $rol->role_id !=3){
                    $diasPrestamo = ConfigPrestamo::where('rolid', '=', 1)->select('cant_dias_prestamo')->get();

                }else{
                    $diasPrestamo = ConfigPrestamo::where('rolid', '=', $rol->role_id)->select('cant_dias_prestamo')->get();
                }

            }

            $cicloID = DB::select(DB::raw("SELECT * FROM periodo p WHERE p.estado = 1"));

            $prestamo = ['fecha_inicio' => Carbon::now('America/Lima'),
                'fecha_fin' => Carbon::now('America/Lima')->addDays($diasPrestamo[0]->cant_dias_prestamo),
                'fecha_devolucion' => null, "created_at" => Carbon::now('America/Lima'),
                "updated_at" => Carbon::now('America/Lima'),
                'id_usuario' => $usuario->id,
                'id_bibliotecario' => $bibliotecarioID,
                'id_ciclo' => $cicloID[0]->id];


            $prestamoID = Prestamo::create($prestamo)->id;



            $bibliografiaPrestamo = ["created_at" => Carbon::now('America/Lima'), "updated_at" => Carbon::now('America/Lima'), "id_ejemplar" => $ejemplar->id,
                "id_prestamo" => $prestamoID];

            BibliografiaPrestamo::create($bibliografiaPrestamo);

            alert()->success('Se registro el prestamo con éxito!', 'Registrado')->confirmButton('Ok');
        } else {
            $reserva = Reserva::find($ReservaID);
            $ejemplar = Ejemplar::find($reserva->id_ejemplar);
            $aux = Ejemplar::find($ejemplar->id);
            $aux->estado = config('constants.ESTADO_EJEMPLAR.DISPONIBLE');
            $aux->save();
            $reserva->estado = 0;
            $reserva->save();
            alert()->error('No se puede prestar más libros, debido a que supero el límite de libros prestados.', 'Ups...')->confirmButton('Ok');
        }


        return redirect()->action('PrestamoController@registrosPrestamos', [$usuario->id]);

    }

    public function crearprestamo(Request $request)
    {
        $bibliotecarioID = Auth::id();

        $usuario = User::where('dni', '=', $request->dni)->get();

        $userrol = DB::table('usuario')
            ->join('role_user', 'usuario.id', '=', 'role_user.user_id')
            ->where('usuario.id', '=', $usuario[0]->id)->select('role_id')->get();

        foreach ($userrol as $rol){

            if ($rol->role_id !=1 || $rol->role_id !=2 || $rol->role_id !=3){
                $cant_libros_dia = ConfigPrestamo::where('rolid', '=', 1)->select('cant_libros_dia')->get();
            }else{
                $cant_libros_dia = ConfigPrestamo::where('rolid', '=', $rol->role_id)->select('cant_libros_dia')->get();
            }

        }

        $userid = $usuario[0]->id;

        $cant_libros_prestados = DB::Select(
            DB::raw("
                   SELECT COUNT(p.id) as cant_libros_reservados
                    FROM prestamo p
                    RIGHT JOIN usuario u on p.id_usuario = u.id
                    WHERE p.fecha_devolucion is null and u.id = $userid
            "));

        if ($cant_libros_dia[0]->cant_libros_dia > $cant_libros_prestados[0]->cant_libros_reservados) {
            $ejemplar = Ejemplar::where('codigo_CS', '=', $request->cod_libro)->where('estado','=','1')->get();


            if(count($ejemplar) == 0){
                alert()->error('Este libro no se encuentra disponible, verifique si el libro esta registrado.', 'Ups...')->confirmButton('Ok');
                return redirect('prestamos/validarbusquedaprestamo/'.$usuario[0]->id);

            }

            $aux = Ejemplar::find($ejemplar[0]->id);

            $lstprestamos = DB::table('prestamo')
                ->join('bibliografia_prestamo', 'prestamo.id', '=', 'bibliografia_prestamo.id_prestamo')
                ->join('ejemplar','bibliografia_prestamo.id_ejemplar','=','ejemplar.id')
                ->where('prestamo.fecha_devolucion', '=', null)
                ->where('prestamo.id_usuario', '=', $userid)
                ->select('ejemplar.id_bibliografia')->get();

            foreach ($lstprestamos as $item) {
                if ($item->id_bibliografia == $aux->id_bibliografia){
                    alert()->error('No se puede prestar más libros, de la misma bibliografía ya prestada con anterioridad.', 'Ups...')->confirmButton('Ok');
                    $aux->estado = config('constants.ESTADO_EJEMPLAR.DISPONIBLE');
                    $aux->save();
                    return redirect()->action('PrestamoController@registrosPrestamos', [$userid]);

                }
            }

            if ($aux->estado == config('constants.ESTADO_EJEMPLAR.DISPONIBLE')) {

                $aux->estado = config('constants.ESTADO_EJEMPLAR.PRESTADO');
                $aux->save();

                foreach ($userrol as $rol){

                    if ($rol->role_id !=1 || $rol->role_id !=2 || $rol->role_id !=3){
                        $diasPrestamo = ConfigPrestamo::where('rolid', '=', 1)->select('cant_dias_prestamo')->get();

                    }else{
                        $diasPrestamo = ConfigPrestamo::where('rolid', '=', $rol->role_id)->select('cant_dias_prestamo')->get();
                    }

                }
                $cicloID = DB::select(DB::raw("SELECT * FROM periodo p WHERE p.estado = 1"));

                $prestamo = ['fecha_inicio' => Carbon::now('America/Lima'), 'fecha_fin' => Carbon::now('America/Lima')->addDays($diasPrestamo[0]->cant_dias_prestamo),
                    'fecha_devolucion' => null, "created_at" => Carbon::now('America/Lima'),
                    "updated_at" => Carbon::now('America/Lima'),
                    'id_usuario' => $usuario[0]->id, 'id_bibliotecario' => $bibliotecarioID, 'id_ciclo' => $cicloID[0]->id];


                $prestamoID = Prestamo::create($prestamo)->id;

                $bibliografiaPrestamo = ["created_at" => Carbon::now('America/Lima'), "updated_at" => Carbon::now('America/Lima'), "id_ejemplar" => $ejemplar[0]->id,
                    "id_prestamo" => $prestamoID];


                BibliografiaPrestamo::create($bibliografiaPrestamo);

                alert()->success('Se registro el prestamo con éxito!', 'Registrado')->confirmButton('Ok');

            } elseif ($aux->estado == config('constants.ESTADO_EJEMPLAR.RESERVADO')) {
                alert()->error('Este libro no se encuentra disponible, debido a que esta reservado.', 'Ups...')->confirmButton('Ok');
            } elseif ($aux->estado == config('constants.ESTADO_EJEMPLAR.PRESTADO')) {
                alert()->error('Este libro no se encuentra disponible, debido a que esta en uso por otro usuario.', 'Ups...')->confirmButton('Ok');
            } elseif ($aux->estado == config('constants.ESTADO_EJEMPLAR.PERDIDO')) {
                alert()->error('Este libro no se encuentra disponible, debido a que se encuentra como perdido.', 'Ups...')->confirmButton('Ok');
            }

        } else {

            $ejemplar = Ejemplar::where('codigo_CS', '=', $request->cod_libro)->where('estado','=','1')->get();
            $aux = Ejemplar::find($ejemplar[0]->id);
            $aux->estado = config('constants.ESTADO_EJEMPLAR.DISPONIBLE');
            $aux->save();

            alert()->error('No se puede reservar más libros, debido a que supero el límite de libros prestados.', 'Ups...')->confirmButton('Ok');

        }

        return redirect('prestamos/validarbusquedaprestamo/'.$usuario[0]->id);


    }

}