<?php

namespace App\Http\Controllers\Reprogramacion;

use App\Model\Horario;
use App\Model\Periodo;
use App\Model\Profesor;
use App\Model\Reprogramacion;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Yajra\Datatables\Facades\Datatables;

class ReprogramacionController extends Controller
{
    public function getReprogramacionProfesor()
    {
        try
        {
            $prof = Profesor::where('id_usuario','=',Auth::user()->id)->first();

            $cursos = DB::table('profesor')
                ->join('seccion_curso','seccion_curso.id_profesor','=','profesor.id')
                ->join('curso','curso.id','=','seccion_curso.id_curso')
                ->join('periodo','periodo.id','=','seccion_curso.id_periodo')
                ->where('profesor.id','=',$prof['id'])
                ->where('periodo.estado','=',1)
                ->select('curso.id','curso.nombre')
                ->distinct()
                ->get('curso.id','curso.nombre')
                ->pluck('nombre','id')->toArray();

            $findeclases = Periodo::where('estado','=',1)->select('clases_fin')->first();

            if(!$findeclases)
                $findeclases = $h = (Carbon::now()->year."-".Carbon::now()->month."-".Carbon::now()->day);
            else
                $findeclases  = Carbon::parse($findeclases->clases_fin)->format('Y-m-d');

            return view('pages.Reprogramacion.Profesor.index',compact('cursos','findeclases'));
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getValidarSeccion(Request $request)
    {
        try
        {
            $prof = Profesor::where('id_usuario','=',Auth::user()->id)->first();

            $cursos = DB::table('profesor')
                ->join('seccion_curso','seccion_curso.id_profesor','=','profesor.id')
                ->join('curso','curso.id','=','seccion_curso.id_curso')
                ->join('periodo','periodo.id','=','seccion_curso.id_periodo')
                ->where('profesor.id','=',$prof['id'])
                ->where('periodo.estado','=',1)
                ->where('curso.id','=',$request['valor'])
                ->select('seccion_curso.id','seccion_curso.nombre_seccion')
                ->distinct()
                ->get('seccion_curso.id','seccion_curso.nombre_seccion')
                ->pluck('nombre_seccion','id')->toArray();

            return response()->json($cursos);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getValidarDias(Request $request)
    {
        try
        {
            $days = DB::table('seccion_curso')
                ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                ->where('seccion_curso.id','=',$request['sc'])
                ->select('horario.dia')->get();

            $Arr = [];
            $Rarr = [];
            foreach ($days as $item)
            {
                switch ($item->dia)
                {
                    case 'Lunes':
                        array_push($Arr, 1);
                        break;
                    case 'Martes':
                        array_push($Arr, 2);
                        break;
                    case 'Miercoles':
                        array_push($Arr, 3);
                        break;
                    case 'Jueves':
                        array_push($Arr, 4);
                        break;
                    case 'Viernes':
                        array_push($Arr, 5);
                        break;
                    case 'Sabado':
                        array_push($Arr, 6);
                        break;
                    case 'Domingo':
                        array_push($Arr, 0);
                        break;
                }
            }

            for($i = 0 ; $i < 7; $i++)
                if(in_array($i,$Arr)) $vr = 1; else array_push($Rarr,$i);

            return response()->json($Rarr);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postSolicitud(Request $request)
    {
        try
        {
            switch ($request['endtb'])
            {
                case 1:

                    if(is_null($request['seccion']))
                    {
                        Alert()->warning('No seleciono ningun registro a recuperar', '¡ Atención !')->persistent('Ok');
                        return redirect('reprogramacion/profesor');
                        break;
                    }

                    $idH = Horario::where('id_seccion_curso','=',$request['seccion'])
                        ->select('id')->first();

                    $perm = false;

                    if((int)$request['perm_cia'] == 2)
                        $perm = true;

                    $repro = [
                        'dia' => $request['diaRP'],
                        'aula' => null,
                        'tema' => $request['tema_clase'],
                        'hora_ini' => Carbon::createFromFormat('H:i A', $request['hora_inicio']),
                        'hora_fin' => Carbon::createFromFormat('H:i A', $request['hora_fin']),
                        'fecha_solicitada' => new carbon(str_replace("/","-",$request['fecha_inicio'])),
                        'fecha_asignada' =>  null,
                        'estado' => config('constants.ESTADO_REPROGRAMACION.EN_PROCESO'),
                        'permanente' => $perm,
                        'id_asistencia_profesor' => null,
                        'id_horario' => $idH->id
                    ];
                    break;
                case 2:
                    if(is_null($request['horario_justificado']))
                    {
                        Alert()->warning('No seleciono ningun registro a recuperar', '¡ Atención !')->persistent('Ok');
                        return redirect('reprogramacion/profesor');
                        break;
                    }

                    $repro = [
                        'dia' => $request['diaRC'],
                        'aula' => null,
                        'tema' => $request['tema_clase'],
                        'hora_ini' => Carbon::createFromFormat('H:i A', $request['hora_inicio']),
                        'hora_fin' => Carbon::createFromFormat('H:i A', $request['hora_fin']),
                        'fecha_solicitada' => null,
                        'fecha_asignada' =>  null,
                        'estado' => config('constants.ESTADO_REPROGRAMACION.EN_PROCESO'),
                        'id_asistencia_profesor' => $request['horario_justificado'],
                        'id_horario' => null
                    ];
                    break;
            }
            Reprogramacion::create($repro);

            switch ($request['endtb'])
            {
                case 1:
                    Alert()->success('Se registro correctamente la solicitud de reprogramación', 'Enviado')->persistent('Ok');
                    return redirect('reprogramacion/profesor');
                    break;
                case 2:
                    Alert()->success('Se registro correctamente la solicitud de recuperación', 'Enviado')->persistent('Ok');
                    return redirect('reprogramacion/profesor');
                    break;
            }

        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postReprogramacionProfesor()
    {
        try
        {
            $prof = Profesor::where('id_usuario','=',Auth::user()->id)->select('id')->first();

            $list = DB::table('seccion_curso')
                ->join('curso','curso.id','=','seccion_curso.id_curso')
                ->join('profesor','profesor.id','=','seccion_curso.id_profesor')
                ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                ->leftJoin('reprogramacion','reprogramacion.id_horario','=','horario.id')
                ->where('profesor.id','=',$prof->id)
                ->whereNull('reprogramacion.id_asistencia_profesor')
                ->whereNotNull('reprogramacion.id_horario')
                ->select('reprogramacion.id',
                    'reprogramacion.estado',
                    'reprogramacion.fecha_asignada',
                    'reprogramacion.aula as aula_asignada',
                    'curso.codigo',
                    'curso.nombre',
                    'seccion_curso.nombre_seccion',
                    'horario.aula as aula_proveniente',
                    'horario.dia as dia_proveniente',
                    'reprogramacion.fecha_solicitada',
                    'reprogramacion.dia as dia_asignado',
                    'reprogramacion.hora_ini',
                    'reprogramacion.hora_fin')
                ->get();

            return Datatables::of($list)->make(true);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postRecuperacionProfesor(Request $request)
    {
        try
        {
            $prof = Profesor::where('id_usuario','=',Auth::user()->id)->select('id')->first();

            $list = DB::table('seccion_curso')
                ->join('curso','curso.id','=','seccion_curso.id_curso')
                ->join('profesor','profesor.id','=','seccion_curso.id_profesor')
                ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                ->join('asistencia_profesor','asistencia_profesor.id_horario','=','horario.id')
                ->leftJoin('justificacion','justificacion.id','=','asistencia_profesor.id_justificacion')
                ->leftJoin('reprogramacion','reprogramacion.id_asistencia_profesor','=','asistencia_profesor.id')
                ->where('profesor.id','=',$prof->id)
                ->where('asistencia_profesor.estado','=',config('constants.ASISTENCIA_PROFESOR.REPROGRAMACION'))
                ->select('asistencia_profesor.id',
                    'curso.codigo',
                    'curso.nombre',
                    'seccion_curso.nombre_seccion',
                    'asistencia_profesor.fecha',
                    'horario.aula',
                    'horario.dia',
                    'reprogramacion.aula as aula_repro',
                    'horario.hora_ini',
                    'horario.hora_fin',
                    'justificacion.procede',
                    'reprogramacion.estado as estado_repro',
                    'reprogramacion.fecha_asignada')
                ->get();

            return Datatables::of($list)->make(true);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function getListadoReprogramacionRecuperacion()
    {
        try
        {
            return view('pages.Reprogramacion.Administrador.index');
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postListadoReprogramacionRecuperacion(Request $request)
    {
        try
        {
            $list1 = DB::table('seccion_curso')
                ->join('curso','seccion_curso.id_curso','=','curso.id')
                ->join('profesor','seccion_curso.id_profesor','=','profesor.id')
                ->join('usuario','usuario.id','=','profesor.id_usuario')
                ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                ->leftJoin('reprogramacion','reprogramacion.id_horario','=','horario.id')
                ->whereNotNull('reprogramacion.estado')
                ->whereNotNull('reprogramacion.id_horario')
                ->select('reprogramacion.id',
                    'curso.id as id_curso',
                    'seccion_curso.id as id_secc',
                    'horario.aula',
                    'reprogramacion.fecha_asignada',
                    'reprogramacion.aula',
                    'reprogramacion.estado',
                    'reprogramacion.id_asistencia_profesor',
                    'reprogramacion.id_horario',
                    'reprogramacion.created_at');

            $list2 = DB::table('seccion_curso')
                ->join('curso','seccion_curso.id_curso','=','curso.id')
                ->join('profesor','seccion_curso.id_profesor','=','profesor.id')
                ->join('usuario','usuario.id','=','profesor.id_usuario')
                ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                ->join('asistencia_profesor','asistencia_profesor.id_horario','=','horario.id')
                ->join('justificacion','justificacion.id','=','asistencia_profesor.id_justificacion')
                ->join('reprogramacion','reprogramacion.id_asistencia_profesor','=','asistencia_profesor.id')
                ->whereNotNull('reprogramacion.estado')
                ->whereNotNull('reprogramacion.id_asistencia_profesor')
                ->select('reprogramacion.id',
                    'curso.id as id_curso',
                    'seccion_curso.id as id_secc',
                    'horario.aula',
                    'reprogramacion.fecha_asignada',
                    'reprogramacion.aula',
                    'reprogramacion.estado',
                    'reprogramacion.id_asistencia_profesor',
                    'reprogramacion.id_horario',
                    'reprogramacion.created_at');


            $result = $list1->union($list2)->get()->toArray();


            return Datatables::of($result)->make(true);
        }
        catch (\Exception $e)
        {
            return null;
        }
    }


    public function postDatosDelProfesor(Request $request)
    {
        try
        {
            $datos = DB::table('usuario')
                ->join('profesor','profesor.id_usuario','=','usuario.id')
                ->join('seccion_curso','seccion_curso.id_profesor','=','profesor.id')
                ->join('curso','curso.id','=','seccion_curso.id_curso')
                ->where('seccion_curso.id','=',$request['id'])
                ->select(DB::raw('CONCAT(usuario.nombres, " ", usuario.apellido_paterno, " ", usuario.apellido_materno) AS completo'),
                    'curso.codigo','curso.nombre','seccion_curso.nombre_seccion')
                ->first();

            return view('pages.Reprogramacion.Partials.detallecurso',compact('datos'));

        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postDatosRecuRepro(Request $request)
    {
        try
        {
            $datos = Reprogramacion::find($request['id']);

            return view('pages.Reprogramacion.Partials.detallerecurepro',compact('datos'));

        }
        catch (\Exception $e)
        {
            return null;
        }
    }


    public function getForm(Request $request)
    {
        try
        {

            switch ($request['tipo'])
            {
                case 'procede':
                    $findeclases = Periodo::where('estado','=',1)->select('clases_fin')->first();

                    if(!$findeclases)
                        $findeclases = $h = (Carbon::now()->year."-".Carbon::now()->month."-".Carbon::now()->day);
                    else
                        $findeclases  = Carbon::parse($findeclases->clases_fin)->format('Y-m-d');

                    $tipo = $request['ep']; $modo = $request['dato'];
                    return view('pages.Reprogramacion.Partials.asignar',compact('tipo','modo','findeclases'));
                    break;
                case 'noprocede':
                    $rpro = Reprogramacion::find($request['ep']);
                    $rpro->aula = "No asignada";
                    $rpro->estado = config('constants.ESTADO_REPROGRAMACION.DENEGADA');
                    $rpro->save();

                    return 200;
                    break;
            }


        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postConfirmar(Request $request)
    {
        try
        {
            $rpro = Reprogramacion::find($request['ep']);

            if($rpro->permanente == true)
            {
                $aux = Horario::find($rpro->id_horario);
                $arr = [
                    'dia' => $rpro->dia,
                    'aula' => $rpro->aula,
                    'hora_ini' => $rpro->hora_ini,
                    'hora_fin' => $rpro->hora_fin,
                    'estado' => 1,
                    'id_seccion_curso' => $aux->id_seccion_curso
                ];
                $aux->estado = 0;
                $aux->save();

                Horario::create($arr);
            }


            $rpro->aula = $request['aulaP'];
            $rpro->estado = config('constants.ESTADO_REPROGRAMACION.ACEPTADA');
            if(!is_null($request['fecha_inicio']))
                $rpro->fecha_asignada = new carbon(str_replace("/","-",$request['fecha_inicio']));
            else
            $rpro->fecha_asignada = $rpro->fecha_solicitada;
            $rpro->save();
            return 200;
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

}
