<?php

namespace App\Http\Controllers\Reporte;

use App\Model\AlumnoSeccion;
use App\Model\Curso;
use App\Model\Especialidad;
use App\Model\Periodo;
use App\Model\RecordAcademico;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Mockery\Exception;
use Yajra\Datatables\Datatables;

class RecordAcademicoController extends Controller
{

    public function index()
    {
        try {
            $periodos = Periodo::orderByDesc('nombre')->pluck('nombre', 'id');
            $actual = Periodo::where('estado', '=', 1)->first()->id;

            return view('pages.reportes.record.index', compact('periodos', 'actual'));
        } catch (Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('/');
        }
    }

    public function getEspecialidades(Request $request)
    {
        try {
            $id = $request->id;
            $especialidades = Especialidad::join('especialidad_periodo', function ($join) use ($id) {
                $join->on('especialidad_periodo.id_especialidad', '=', 'especialidad.id')
                    ->where('especialidad_periodo.id_periodo', '=', $id);
            })->orderBy('especialidad.nombre')->select('especialidad.nombre', 'especialidad.id')->get();

            return response()->json($especialidades, 200);
        } catch (\Exception $e) {
            return response()->json("error", 500);
        }
    }

    public function getCursos(Request $request)
    {
        try {
            $idPeriodo = $request->id;

            $cursos = Curso::join('detalle_curso', 'curso.id', '=', 'detalle_curso.id_curso')
                ->join('periodo', 'detalle_curso.id_periodo', '=', 'periodo.id')
                ->where('periodo.id', $idPeriodo)
                ->groupBy('curso.nombre', 'curso.id')
                ->orderBy('curso.nombre')
                ->select('curso.nombre', 'curso.id')->get();

            return response()->json($cursos, 200);

        } catch (\Exception $e) {
            return response()->json("error", 500);
        }
    }

    public function getSecciones(Request $request)
    {
        try {

            $idCurso = $request->idCurso;
            $idPeriodo = $request->idPeriodo;

            $secciones = DB::select(DB::raw("
                SELECT sc.id, sc.nombre_seccion as nombre
                FROM curso c
                INNER JOIN seccion_curso sc on c.id = sc.id_curso 
                INNER JOIN periodo p on sc.id_periodo = p.id
                WHERE c.id = $idCurso AND p.id = $idPeriodo
            "));

            return response()->json($secciones, 200);

        } catch (\Exception $e) {
            return response()->json("error", 500);
        }
    }

    public function getRecordEspecialidad(Request $request)
    {
        try {
            $periodo = $request->id_periodo;
            $especialidad = $request->id_especialidad;

            $alumnos = RecordAcademico::join('alumno', 'alumno.id', '=', 'record_academico.id_alumno')
                ->join('usuario', 'usuario.id', '=', 'alumno.id_usuario')
                ->where('record_academico.id_periodo', '=', $periodo)
                ->where('record_academico.id_especialidad', '=', $especialidad)
                ->orderBy('record_academico.orden_merito')
                ->select(
                    'record_academico.orden_merito',
                    'usuario.dni',
                    DB::raw('CONCAT(usuario.apellido_paterno," ",usuario.apellido_materno,", ",usuario.nombres) as nombre_completo'),
                    'record_academico.ponderado_actual',
                    'record_academico.ponderado_acumulado'
                )->get();

            return Datatables::of($alumnos)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }

    public function getRecordCursoSeccion(Request $request)
    {
        try {
            $periodo = $request->idPeriodo;
            $curso = $request->idCurso;
            $seccion = $request->idSeccion;

            if ($seccion != 0) {
                $alumnos = DB::select(DB::raw("
                    SELECT @rownum:=@rownum+1 AS orden_merito, u.dni, CONCAT(u.apellido_paterno,' ',u.apellido_materno,', ',u.nombres) as nombre_completo, IF(sa.nota_final is not null,sa.nota_final,0)  as notafinal
                    FROM (SELECT @rownum:=0) r, curso c
                    INNER JOIN seccion_curso sc on c.id = sc.id_curso 
                    INNER JOIN periodo p on sc.id_periodo = p.id
                    INNER JOIN alumno_seccion sa on sc.id = sa.id_seccion_curso
                    INNER JOIN alumno a on sa.id_alumno = a.id
                    INNER JOIN usuario u on a.id_usuario = u.id
                    WHERE c.id = $curso AND p.id = $periodo AND sc.id = $seccion
                    GROUP BY u.dni, u.apellido_paterno, u.apellido_paterno,u.nombres,sa.nota_final
                    ORDER BY sa.nota_final DESC
                "));
            } else {
                $alumnos = DB::select(DB::raw("
                    SELECT @rownum:=@rownum+1 AS orden_merito, u.dni, CONCAT(u.apellido_paterno,' ',u.apellido_materno,', ',u.nombres) as nombre_completo, IF(sa.nota_final is not null,sa.nota_final,0)  as notafinal
                    FROM (SELECT @rownum:=0) r, curso c
                    INNER JOIN seccion_curso sc on c.id = sc.id_curso 
                    INNER JOIN periodo p on sc.id_periodo = p.id
                    INNER JOIN alumno_seccion sa on sc.id = sa.id_seccion_curso
                    INNER JOIN alumno a on sa.id_alumno = a.id
                    INNER JOIN usuario u on a.id_usuario = u.id
                    WHERE c.id = $curso AND p.id = $periodo
                    GROUP BY u.dni, u.apellido_paterno, u.apellido_paterno,u.nombres,sa.nota_final
                    ORDER BY sa.nota_final DESC
                "));
            }

            return Datatables::of($alumnos)->make(true);

        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }

}

}
