<?php

namespace App\Http\Controllers;

use App\Model\Bibliografia;
use App\Model\Investigacion;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use App\Model\Ciclo;
use function MongoDB\BSON\toJSON;

class ReporteController extends Controller
{

    public function getIndexReporte()
    {

        $ciclos = DB::table('periodo')
            ->orderBy('id', 'desc')
            ->select('id', 'nombre')->get();

        $tablabibliografias = DB::Select(
            DB::raw("
                     SELECT DISTINCT b.nombre, IF(reservas.cantReserva is not NULL, reservas.cantReserva, 0) as cantReserva, IF(prestamos.cantPrestamo is not NULL, prestamos.cantPrestamo, 0) as cantPrestamo, b.num_descarga
                     FROM bibliografia b
                     LEFT JOIN (
                        SELECT b.id, COUNT(p.id) as cantPrestamo
                        FROM bibliografia b
                        INNER JOIN ejemplar e on b.id = e.id_bibliografia
                        INNER JOIN bibliografia_prestamo bp on e.id = bp.id_ejemplar
                        INNER JOIN prestamo p on bp.id_prestamo = p.id
                        GROUP BY b.id
                     ) as prestamos on b.id = prestamos.id
                     LEFT JOIN (
                        SELECT b.id, COUNT(r.id) as cantReserva
                        FROM bibliografia b
                        INNER JOIN ejemplar e on b.id = e.id_bibliografia
                        INNER JOIN reserva r on e.id = r.id_ejemplar
                        GROUP BY b.id
                     ) as reservas on b.id = reservas.id
                     GROUP BY b.id,b.nombre, reservas.cantReserva, prestamos.cantPrestamo, b.num_descarga
                    "));


        return view('pages.reporte.index', compact('ciclos','tablabibliografias'));
    }

    public function GetEstadisticasIndex()
    {
        $especialidades = DB::Select(
            DB::raw("
                     SELECT e.id, e.nombre
                     FROM especialidad e"));

        $ciclos = DB::Select(
            DB::raw("
                     SELECT p.id, p.nombre
                     FROM periodo p
                    "));

        $anios = DB::Select(DB::raw('
            select distinct year(p.fecha_inicio) as Anio
            from prestamo p 
            order by Anio;
        '));

        return view('pages.reporte.estadistica')->with("especialidades", $especialidades)->with("ciclos", $ciclos)->with("anios", $anios);
    }

    public function prestamoUsuario($cicloAcademico)
    {
        $prestamosUsuarios = DB::Select(
            DB::raw("
                     SELECT u.dni, u.nombres, u.apellido_paterno, u.apellido_materno, COUNT(p.id) as cant_libros
                     FROM prestamo p
                     left join usuario u on p.id_usuario = u.id
                     where  p.id_ciclo = $cicloAcademico
                     group by  u.dni, u.nombres, u.apellido_paterno, u.apellido_materno
                     order by u.apellido_paterno ASC 
            "));
        return view('pages.reporte.prestamousuario', compact('prestamosUsuarios'));
    }

    public function prestamoBibliografia($cicloAcademico)
    {

        $prestamosBibliografia = DB::Select(
            DB::raw("
                     SELECT  e.codigo_CS as Cod_libro, b.nombre, e.anio,e.edicion, COUNT(p.id) as cant_prestamos
                     FROM prestamo p
                     inner join bibliografia_prestamo bp on p.id = bp.id_prestamo
                     inner join ejemplar e on bp.id_ejemplar = e.id
                     inner join bibliografia b on e.id_bibliografia = b.id
                     where  p.id_ciclo = $cicloAcademico
                     group by Cod_libro, b.nombre, e.anio,e.edicion
            "));

        return view('pages.reporte.prestamobibliografia', compact('prestamosBibliografia'));
    }

    public function detallePrestamoBibliografia($Cod_libro)
    {

        $detallePrestamosBibliografia = DB::Select(
            DB::raw("
                     SELECT u.dni, u.nombres,u.apellido_paterno, u.apellido_materno, p.fecha_inicio, uu.nombres as nombre_bibliotecario, uu.apellido_paterno as apellidopaterno_bibliotecario, uu.apellido_materno as apellidomaterno_bibliotecario
                     from usuario u
                     inner join prestamo p on u.id = p.id_usuario
                     inner join bibliografia_prestamo bp on p.id = bp.id_prestamo
                     inner join ejemplar e on bp.id_ejemplar = e.id
                     inner join bibliografia b on e.id_bibliografia = b.id
                     join usuario uu on p.id_bibliotecario = uu.id
                     WHERE e.codigo_CS = '$Cod_libro'
            "));
        return view('pages.reporte.detalleprestamobibliografia', compact('detallePrestamosBibliografia'));

    }

    public function detallePrestamoUsuario($DNI)
    {

        $detallePrestamosUsuarios = DB::Select(
            DB::raw("
                     SELECT e.codigo_CS, b.nombre, p.fecha_inicio
                     from usuario u
                     inner join prestamo p on u.id = p.id_usuario
                     inner join bibliografia_prestamo bp on p.id = bp.id_prestamo
                     inner join ejemplar e on bp.id_ejemplar = e.id
                     inner join bibliografia b on e.id_bibliografia = b.id
                     WHERE u.dni = $DNI
            "));

        return view('pages.reporte.detalleprestamousuario', compact('detallePrestamosUsuarios'));

    }

    public function bibliografiasMasPrestadasCicloMes(Request $request)
    {
        $mes = $request["id_mes"];
        $ciclo = $request["id_ciclo"];

        $bibliografias = DB::Select(DB::raw('select  b.nombre, Month(p.fecha_inicio) as Mes, count(b.id) as Cantidad
                                            from bibliografia_prestamo bf
                                            inner join ejemplar e on bf.id_ejemplar = e.id
                                            left join bibliografia b on b.id = e.id_bibliografia
                                            join prestamo p on p.id = bf.id_prestamo
                                            where p.id_ciclo = ' . $ciclo . '  && Month(p.fecha_inicio) = ' . $mes . ' 
                                            group by Mes, nombre
                                            limit 10'));
        $listado = [];
        foreach ($bibliografias as $bilbiografia) {
            $persona["label"] = $bilbiografia->nombre;
            $persona["value"] = $bilbiografia->Cantidad;
            array_push($listado, $persona);
        }
        return view('pages.reporte._reporte2')->with('bibliografias', $bibliografias);
    }

    public function bibliografiasMasPrestadasPorCarrera(Request $request)
    {
        $carrera = $request["id_carrera"];
        $bibliografias = DB::Select(DB::raw('select b.nombre, Count(p.id) as Cantidad
                                            from prestamo p
                                            join alumno a on a.id_usuario = p.id_usuario
                                            join bibliografia_prestamo bp on p.id = bp.id_prestamo
                                            join ejemplar ej on bp.id_ejemplar = ej.id
                                            join bibliografia b on b.id = ej.id_bibliografia
                                            join especialidad e on e.id = a.id_especialidad
                                            where e.id = ' . $carrera . '
                                            group by b.nombre'));
        $listado = [];
        foreach ($bibliografias as $bilbiografia) {
            $persona["label"] = $bilbiografia->nombre;
            $persona["value"] = $bilbiografia->Cantidad;
            array_push($listado, $persona);
        }
        return view('pages.reporte._reporte1')->with('bibliografias', $bibliografias);
    }

    public function Top10personasReservas()
    {
        $bibliografias = DB::Select(DB::raw('select Concat(u.nombres," ",u.apellido_paterno," ",u.apellido_materno) as Nombre, count(id_usuario) as Cantidad
                                            from reserva r
                                            join usuario u on u.id = r.id_usuario
                                            group by u.nombres, u.apellido_paterno, u.apellido_materno
                                            limit 10'));
        $listado = [];
        foreach ($bibliografias as $bilbiografia) {
            $persona["label"] = $bilbiografia->Nombre;
            $persona["value"] = $bilbiografia->Cantidad;
            array_push($listado, $persona);
        }

        return $listado;
    }

    public function reservasvsprestamos()
    {
        $reservas = DB::Select(DB::raw('select count(r.id) as Cantidad
                                        from reserva r; '));
        $prestamos = DB::Select(DB::raw('select count(id) as Cantidad
                                        from prestamo; '));

        $listaResultado = [];

        $resultado["label"] = "Reservas";
        $resultado["value"] = $reservas[0]->Cantidad;

        array_push($listaResultado, $resultado);
        $resultado1["label"] = "Prestamos";
        $resultado1["value"] = $prestamos[0]->Cantidad;
        array_push($listaResultado, $resultado1);
        return $listaResultado;
    }

    //Comportamiento de préstamos por ciclo (Fechas con mayor índice de préstamos)
    public function prestamosporanio(Request $request)
    {
        $Anio = $request["Anio"];
        $listado = [];

        if ($request["Anio"] != null) {
            $prestamosxMesxAnio = DB::Select(DB::raw("
            select m.id, m.nombre_completo,count(p.id) as cantidad
            from mes m
            left join prestamo p on Month(p.fecha_inicio) = m.id
            WHERE  YEAR(p.fecha_inicio) = $Anio
            group by m.id, m.nombre_completo
        "));

            foreach ($prestamosxMesxAnio as $item) {
                $persona["label"] = $item->nombre_completo;
                $persona["value"] = $item->cantidad;
                array_push($listado, $persona);
            }
        }

        return $listado;

    }

    public function reporteprestamosporaniomes(Request $request)
    {

        $Anio = $request["Anio"];
        return view('pages.reporte._reporte3')->with('anio', $Anio);

    }

    public function reportedescargasporbibliografias()
    {
        $bibliografias = DB::select(DB::raw("SELECT * FROM bibliografia WHERE  url != ''"));
        return view('pages.reporte.tbbibliografiasvirtuales', compact('bibliografias'));
    }

    public function reportedescargasporinvestigaciones()
    {
        $investigaciones = DB::select(DB::raw("SELECT * FROM investigacion WHERE  url != ''"));

        return view('pages.reporte.tbinvestigacionesvirtuales', compact('investigaciones'));
    }

}
