<?php

namespace App\Http\Controllers;

use App\Model\Asistencia_Profesor;
use App\Model\Role;
use Carbon\Carbon;
use App\Model\Profesor;
use App\Model\User;
use Illuminate\Http\Request;
use App\Model\Asistencia_Personal;
use App\Model\Asistencia_Alumno;
use Mockery\Exception;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Maatwebsite;
use Maatwebsite\Excel\Facades\Excel;
use Jenssegers\Date\Date;
use Illuminate\Support\Facades\Auth;
use Yajra\Datatables\Facades\Datatables;

class AsistenciaController extends Controller{


    public function getAsistenciaPersonal()
    {
        try
        {
            $menssage="";
            $dia = Carbon::today()->format("Y-m-d");
            $roles = Role::where([
                ['roles.id','<>',2],
                ['roles.id','<>',11]
            ])->get()->pluck('name','name')->toArray();


            $verificar = Asistencia_Personal::where('fecha','=',$dia)
                ->where('marcado_entrada','=',"")
                ->where('marcado_salida','=',"")
                ->where([
                    ['estado','<>',"Falta"],
                    ['estado','<>',"Licencia"],
                    ['estado','<>',"Capacitacion"],
                    ['estado','<>',"Permiso"]
                ])->first();


            if($verificar)
            {
                $verificar = 0;
                $menssage = "El registro de asistencias se registro con éxito";
                return view('pages.Asistencia.Personal.registro',compact('menssage','roles','dia','verificar'));
            }
            else
            {
                $verificar = 1;
                return view('pages.Asistencia.Personal.registro',compact('menssage','roles','dia','verificar'));
            }
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postAsistenciaPersonal(Request $request)
    {
        try
        {
            $personal = DB::table('usuario')
                ->join('role_user','usuario.id','=','role_user.user_id')
                ->join('roles','roles.id','=','role_user.role_id')
                ->join('asistencia_personal','asistencia_personal.id_user','=','usuario.id')
                ->where([
                    ['usuario.deleted_at','=',null],
                    ['usuario.estado','=',1],
                    ['roles.id','<>',2],
                    ['roles.id','<>',13],
                    ['roles.id','<>',11]
                ])
                ->whereDate('asistencia_personal.fecha','=',date($request['dates']))
                ->select('usuario.id',
                    'usuario.dni',
                    'usuario.estado',
                    'asistencia_personal.fecha',
                    'asistencia_personal.hora_entrada',
                    'asistencia_personal.marcado_entrada',
                    'asistencia_personal.marcado_salida',
                    'asistencia_personal.estado as estado_asistencia',
                    'asistencia_personal.minutos',
                    DB::raw('GROUP_CONCAT(roles.name SEPARATOR ", ") as Roles'),
                    DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, ", ", usuario.nombres) AS completo'))
                ->groupBy('usuario.id','usuario.dni','usuario.estado');


            if(!$personal->first())
            {

                $personal = DB::table('usuario')
                    ->join('role_user','usuario.id','=','role_user.user_id')
                    ->join('roles','roles.id','=','role_user.role_id')
                    ->join('asistencia_personal','asistencia_personal.id_user','=','usuario.id')
                    ->where([
                        ['usuario.deleted_at','=',null],
                        ['usuario.estado','=',1],
                        ['roles.id','<>',2],
                        ['roles.id','<>',13],
                        ['roles.id','<>',11]
                    ])
                    ->whereDate('asistencia_personal.fecha','=',Carbon::now('America/Lima')->format('Y-m-d'))
                    ->select('usuario.id',
                        'usuario.dni',
                        'usuario.estado',
                        'asistencia_personal.fecha',
                        'asistencia_personal.hora_entrada',
                        'asistencia_personal.marcado_entrada',
                        'asistencia_personal.marcado_salida',
                        'asistencia_personal.estado as estado_asistencia',
                        'asistencia_personal.minutos',
                        DB::raw('GROUP_CONCAT(roles.name SEPARATOR ", ") as Roles'),
                        DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, ", ", usuario.nombres) AS completo'))
                    ->groupBy('usuario.id','usuario.dni','usuario.estado');

                if(!$personal->first())
                {
                    $personal = DB::table('usuario')
                        ->join('role_user','usuario.id','=','role_user.user_id')
                        ->join('roles','roles.id','=','role_user.role_id')
                        ->where([
                            ['usuario.deleted_at','=',null],
                            ['usuario.estado','=',1],
                            ['roles.id','<>',2],
                            ['roles.id','<>',13],
                            ['roles.id','<>',11]
                        ])
                        ->select('usuario.id',
                            'usuario.dni',
                            'usuario.estado',
                            'usuario.estado as fecha',
                            'usuario.estado as hora_entrada',
                            'usuario.estado as marcado_entrada',
                            'usuario.estado as marcado_salida',
                            'usuario.estado as estado_asistencia',
                            'usuario.estado as minutos',
                            DB::raw('GROUP_CONCAT(roles.name SEPARATOR ", ") as Roles'),
                            DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, ", ", usuario.nombres) AS completo'))
                        ->groupBy('usuario.id','usuario.dni','usuario.estado')
                        ->get();
                    return Datatables::of($personal)->make(true);
                }
                else
                {
                    $personal->get();
                    return Datatables::of($personal)->make(true);
                }

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

    public function getValidar($date)
    {
        try
        {
            $personal = DB::table('usuario')
                ->join('role_user','usuario.id','=','role_user.user_id')
                ->join('roles','roles.id','=','role_user.role_id')
                ->join('asistencia_personal','asistencia_personal.id_user','=','usuario.id')
                ->where([
                    ['usuario.deleted_at','=',null],
                    ['usuario.estado','=',1],
                    ['roles.id','<>',2],
                    ['roles.id','<>',11]
                ])
                ->whereDate('asistencia_personal.fecha','=',date($date))
                ->select('usuario.id',
                    'usuario.dni',
                    'usuario.estado',
                    'asistencia_personal.fecha',
                    'asistencia_personal.marcado_entrada',
                    'asistencia_personal.marcado_salida',
                    'asistencia_personal.estado as estado_asistencia',
                    'asistencia_personal.minutos',
                    DB::raw('GROUP_CONCAT(roles.name SEPARATOR ", ") as Roles'),
                    DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, ", ", usuario.nombres) AS completo'))
                ->groupBy('usuario.id','usuario.dni','usuario.estado');


            if(Carbon::now('America/Lima')->format('Y-m-d') == $date)
                $aux = 1;
            else
                $aux = 0;


            if(!$personal->first())
            {
                return [
                    'estado' => 205,
                    'prt' => $aux,
                    'dater' => $date
                ];
            }
            else
            {
                return [
                    'estado' => 200,
                    'prt' => $aux,
                    'dater' => $date
                ];
            }


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

    public function postRegistroPersonal(Request $request){
        try{
            $data  = array();
            $c  = count($request['codigos']);



            for($i = 0; $i < $c ; $i++){

                $verificar = Asistencia_Personal::whereDate('fecha','=',Carbon::today())
                    ->where('id_user','=',$request['codigos'][$i])
                    ->where(function ($query) {
                        $query->whereNull('marcado_entrada')
                            ->orWhereNull('marcado_salida');
                    })->get()->first();







                if($request['mentrada'][$i] == "")
                    $auxe = null;
                else
                    $auxe = $request['mentrada'][$i];

                if($request['msalida'][$i] == "")
                    $auxs = null;
                else
                    $auxs = $request['msalida'][$i];

                $arr = [
                    'estado' => $request['asistencia'][$i],
                    'minutos' => (int)$request['minutos'][$i],
                    'fecha' => Carbon::today('America/Lima'),
                    'hora_entrada' => null,
                    'hora_salida' => null,
                    'marcado_entrada' => $auxe,
                    'marcado_salida' => $auxs,
                    'id_user' => $request['codigos'][$i],
                    'id_justificacion' => null
                ];
                $data[$i] = Asistencia_Personal::create($arr);
                $arr = [];
            }

            return response()->json(200);
        }catch (Exception $e){
            return response()->json(500);
        }
    }

    public function getFormato()
    {
        try
        {
            $personal = DB::table('usuario')
                ->join('role_user','usuario.id','=','role_user.user_id')
                ->join('roles','roles.id','=','role_user.role_id')
                ->where([
                    ['usuario.deleted_at','=',null],
                    ['usuario.estado','=',1],
                    ['roles.id','<>',2],
                    ['roles.id','<>',11]
                ])
                ->select('usuario.id',
                    'usuario.dni',
                    DB::raw('GROUP_CONCAT(roles.name SEPARATOR ", ") as Roles'),
                    DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, " ", usuario.nombres) AS completo'))
                ->groupBy('usuario.id','usuario.dni')->get();

            Excel::create('Formato de asistencia del personal', function ($excel) use ($personal) {
                $excel->sheet('Personal Administrativo', function ($sheet) use ($personal) {
                    $sheet->setWidth('A', 10);
                    $sheet->cell('A1', function ($cell){
                       $cell->setValue('Codigo');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('B', 30);
                    $sheet->cell('B1', function ($cell){
                        $cell->setValue('Personal');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->getStyle('C')->getAlignment()->setWrapText(true);
                    $sheet->setWidth('C', 30);
                    $sheet->cell('C1', function ($cell){
                        $cell->setValue('Roles Administrativos');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('D', 20);
                    $sheet->cell('D1', function ($cell){
                        $cell->setValue('Fecha de Registro');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('E', 20);
                    $sheet->cell('E1', function ($cell){
                        $cell->setValue('Hora de Entrada');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('F', 20);
                    $sheet->cell('F1', function ($cell){
                        $cell->setValue('Hora de Salida');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('G', 20);
                    $sheet->cell('G1', function ($cell){
                        $cell->setValue('Marcado de Entrada');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setWidth('H', 20);
                    $sheet->cell('H1', function ($cell){
                        $cell->setValue('Marcado de Salida');
                        $cell->setAlignment('center');
                        $cell->setFontWeight('bold');
                    });


                    $ini = 2;

                    foreach ($personal as $item)
                    {
                        $sheet->cell('A'.$ini, function ($cell) use($item){
                            $cell->setValue($item->dni);
                            $cell->setAlignment('left');
                        });
                        $sheet->cell('B'.$ini, function ($cell) use($item){
                            $cell->setValue($item->completo);
                            $cell->setAlignment('left');
                        });
                        $sheet->cell('C'.$ini, function ($cell) use($item){
                            $cell->setValue($item->Roles);
                            $cell->setAlignment('left');
                        });
                        $ini++;
                    }

                });

                $excel->sheet('Instrucciones', function ($sheet){

                });

            })->download('xls');
        }
        catch (\Exception $e)
        {
            return null;
        }
    }

    public function postCargaMasiva(Request $request)
    {


        try{
            $aux = '';
            $bool = false;
            $archivo = $request->file('archivo');
            $nombre_original = $archivo->getClientOriginalName();
            $extension = $archivo->getClientOriginalExtension();
            $r1 = Storage::disk('archivos')->put($nombre_original,\File::get($archivo) );
            $ruta  =  storage_path('archivos') ."/". $nombre_original;

            if($r1){
                \Excel::load($ruta, function ($reader) use (&$aux,&$bool){
                    $reader->setActiveSheetIndex(0);
                    $reader->each(function($sheet) use (&$aux,&$bool){
                        $sheet->each(function($row,$key) use (&$aux,&$bool){

                            if($row['personal'] == '' || (int)$row['personal'] != 0){
                                $aux = ', verificar la  Celda [ B'.((int)$key + 2).' ]';
                                $bool = true;
                                return false;
                            }

                            if($row['fecha_de_registro'] == ''){
                                $aux = ', verificar la  Celda [ D'.((int)$key + 2).' ]';
                                $bool = true;
                                return false;
                            }

                            $id = User::where(
                                DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno, " ", usuario.nombres)')
                                , '=', $row['personal'])->select('id')->first();

                            if(!$id){
                                $aux = '. No se encontro el usuario '.$row['personal'].'verificar la  Celda [ B'.((int)$key + 2).' ]';
                                $bool = true;
                                return false;
                            }

                            $asistencia = new Asistencia_Personal;
                            $asistencia->fecha = Carbon::parse(date($row['fecha_de_registro']));
                            if($row['hora_de_entrada'] != '' || !is_null($row['hora_de_entrada']))
                                $he = $row['hora_de_entrada'];
                            else
                                $he = null;

                            if($row['hora_de_salida'] != '' || !is_null($row['hora_de_salida']))
                                $hs = $row['hora_de_salida'];
                            else
                                $hs = null;

                            if($row['marcado_de_entrada'] != '' || !is_null($row['marcado_de_entrada']))
                                $me = $row['marcado_de_entrada'];
                            else
                                $me = null;

                            if($row['marcado_de_salida'] != '' || !is_null($row['marcado_de_salida']))
                                $ms = $row['marcado_de_salida'];
                            else
                                $ms = null;

                            if(($row['hora_de_entrada'] != '' || !is_null($row['hora_de_entrada'])) && ($row['marcado_de_entrada'] != '' || !is_null($row['marcado_de_entrada'])) ){
                                $startTime = Carbon::parse($row['hora_de_entrada']);
                                $finishTime = Carbon::parse($row['marcado_de_entrada']);
                                $totalDuration = (int)$finishTime->diffInMinutes($startTime);
                            }
                            else{
                                $totalDuration = 0;
                            }

                            if($totalDuration > 0)
                                $estado = 'Tardanza';
                            else
                                $estado = 'Asistencia';

                            if(($row['marcado_de_entrada'] == '' || is_null($row['hora_de_entrada'])) && ( $row['marcado_de_salida']== '' || is_null($row['marcado_de_salida']))){
                                $estado  = 'Falta';
                            }

                            $asistencia->hora_entrada = $he;
                            $asistencia->hora_salida = $hs;
                            $asistencia->marcado_entrada = $me;
                            $asistencia->marcado_salida = $ms;
                            $asistencia->estado = $estado;
                            $asistencia->minutos = $totalDuration;
                            $asistencia->id_user = $id->id;
                            $asistencia->save();
                        });
                    });
                    return false;
                });
            }
            else{
                $repsonse = [
                    'codigo' => 405,
                    'mensaje' => 'Ocurrio un error en el servidor, al cargar el excel ingresado. Intente dentro de unos minutos'
                ];
                return response()->json($repsonse);
            }

            if($bool)
            {
                $repsonse = [
                    'codigo' => 305,
                    'mensaje' => 'Ocurrio un error al cargar el excel ingresado'.$aux.' del excel cargado'
                ];
                return response()->json($repsonse);
            }
            else
            {
                $repsonse = [
                    'codigo' => 200,
                    'mensaje' => 'Se ha registrado la asistencia con éxito.'
                ];
                return response()->json($repsonse);
            }


       }catch (Exception $e){
           $repsonse = [
               'codigo' => 405,
               'mensaje' => 'Ocurrio un error en el servidor, al cargar el excel ingresado. Intente dentro de unos minutos'
           ];
           return response()->json($repsonse);
       }
    }

    public function getAsistenciaAlumno()
    {
        try
        {
            if(Carbon::now()->minute < 10)
                $aux = '0'.Carbon::now()->minute;
            else
                $aux = Carbon::now()->minute;

            $h = (Carbon::now()->hour.":".$aux.":".Carbon::now()->second);

            $id = Profesor::where('id_usuario','=',Auth::user()->id)->select('id')->first();

            $alumnos = false; $datos = []; $menssage = ""; $cantidad = 0;


            if($id)
            {
                $id = $id->id;
                $alumnos = DB::table('alumno')
                    ->join('alumno_seccion','alumno_seccion.id_alumno','=','alumno.id')
                    ->join('usuario','usuario.id','=','alumno.id_usuario')
                    ->join('seccion_curso','seccion_curso.id','=','alumno_seccion.id_seccion_curso')
                    ->join('periodo','periodo.id','=','seccion_curso.id_periodo')
                    ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                    ->join('curso','curso.id','=','seccion_curso.id_curso')
                    ->leftJoin('asistencia_alumno','asistencia_alumno.id_alumno_seccion','=','alumno_seccion.id')
                    ->where([
                        ['seccion_curso.id_profesor','=',$id],
                        ['periodo.estado','=',1],
                        ['horario.dia','=',ucwords(Date::now()->format('l'))]
                    ])
                    ->whereTime('horario.hora_ini','<=',$h)
                    ->whereTime('horario.hora_fin','>=',$h)
                    ->select('alumno.codigo',
                        'usuario.nombres as alumno',
                        DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno) AS apellidos'),
                        'curso.nombre as curso',
                        'horario.id as id_horario',
                        'horario.aula',
                        'horario.hora_ini',
                        'horario.hora_fin',
                        'horario.dia',
                        'alumno_seccion.id as id_als',
                        'seccion_curso.id as id_sc',
                        'seccion_curso.id_profesor',
                        'seccion_curso.nombre_seccion',
                        'asistencia_alumno.estado'
                    );

                $cantidad = $alumnos->count();


                $datos = $alumnos->first();

                $alumnos = $alumnos->get()->isEmpty();
            }


            $verificar = Asistencia_Profesor::whereDate('fecha','=',Carbon::today())
                ->where([
                    ['id_horario','=',$datos->id_horario],
                    ['id_seccion_curso','=',$datos->id_sc],
                ]);


            $tema = $verificar->select('tema')->first();

            $verificar = $verificar->get()->isEmpty();

            if(!$verificar)
            {
                $verificar = $tema->tema;
                $menssage = "La asistencia de la clase ya se encuentra registrada.";
                return view('pages.Asistencia.Alumno.registro',compact('menssage','datos','cantidad','verificar'));
            }
            else
                $verificar = null;



            if($alumnos)
            {
                $menssage = "No tiene clases asignadas dentro del rango de horario";
                return view('pages.Asistencia.Alumno.registro',compact('menssage','datos','cantidad','verificar'));
            }

            return view('pages.Asistencia.Alumno.registro',compact('menssage','datos','cantidad','verificar'));

        }
        catch (\Exception $e)
        {
            $datos = []; $menssage = ""; $verificar = null;
            $menssage = "No se encontro datos relacionados a lo solicitado en el servidor, intentelo dentro de unos minutos";
            return view('pages.Asistencia.Alumno.registro',compact('menssage','datos','cantidad','verificar'));
        }
    }

    public function postAsistenciaAlumno(Request $request)
    {
        try
        {
            if(Carbon::now()->minute < 10)
                $aux = '0'.Carbon::now()->minute;
            else
                $aux = Carbon::now()->minute;
            $h = (Carbon::now()->hour.":".$aux.":".Carbon::now()->second);

            $id = Profesor::where('id_usuario',Auth::user()->id)->select('id')->first();

            if($id)
            {
                $id = $id->id;
                $alumnos = DB::table('alumno')
                    ->join('alumno_seccion','alumno_seccion.id_alumno','=','alumno.id')
                    ->join('usuario','usuario.id','=','alumno.id_usuario')
                    ->join('seccion_curso','seccion_curso.id','=','alumno_seccion.id_seccion_curso')
                    ->join('periodo','periodo.id','=','seccion_curso.id_periodo')
                    ->join('horario','horario.id_seccion_curso','=','seccion_curso.id')
                    ->join('curso','curso.id','=','seccion_curso.id_curso')
                    ->leftJoin('asistencia_alumno','asistencia_alumno.id_alumno_seccion','=','alumno_seccion.id')
                    ->where([
                        ['seccion_curso.id_profesor','=',$id],
                        ['periodo.estado','=',1],
                        ['horario.dia','=',ucwords(Date::now()->format('l'))]
                    ])
                    ->whereTime('horario.hora_ini','<=',$h)
                    ->whereTime('horario.hora_fin','>=',$h)
                    ->select('alumno.codigo',
                        'usuario.nombres as alumno',
                        DB::raw('CONCAT(usuario.apellido_paterno, " ", usuario.apellido_materno) AS apellidos'),
                        'curso.nombre as curso',
                        'horario.id as id_horario',
                        'horario.aula',
                        'horario.hora_ini',
                        'horario.hora_fin',
                        'horario.dia',
                        'alumno_seccion.id as id_als',
                        'seccion_curso.id as id_sc',
                        'seccion_curso.id_profesor',
                        'seccion_curso.nombre_seccion',
                        'asistencia_alumno.estado'
                    )->get();
                return Datatables::of($alumnos)->make(true);

            }
            else
            {
                $alumnos = [];
                return Datatables::of($alumnos)->make(true);
            }

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

    public function postRegistroAlumnos(Request $request)
    {
        try
        {
            $verificar = Asistencia_Alumno::whereDate('fecha','=',Carbon::today())
                ->where('id_horario','=',$request['id_horario'])
                ->select('id')->get()->isEmpty();

            if(!$verificar)
            {
                return response()->json(500);
            }


            $c = count($request['id_su']);

            $Aprofesor = new Asistencia_Profesor;
            $Aprofesor->id_horario = $request['id_horario'];
            $Aprofesor->fecha = Carbon::today();
            $Aprofesor->tema = $request['tema'];
            $Aprofesor->id_seccion_curso = $request['id_pxs'];
            $Aprofesor->estado = config('constants.ASISTENCIA_PROFESOR.ASISTIO');
            $Aprofesor->save();


            for($i = 0; $i < $c; $i++)
            {
                $AAlumno = new Asistencia_Alumno;
                $AAlumno->estado = $request['asistencia'][$i];
                $AAlumno->fecha = Carbon::today();
                $AAlumno->id_alumno_seccion = $request['id_su'][$i];
                $AAlumno->id_horario = $request['id_horario'];
                $AAlumno->save();
            }
            return response()->json(200);

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

    }

}