<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Model\Alumno;
use App\Model\EncuestaUsuario;
use App\Model\Especialidad;
use App\Model\Role;
use App\Model\User;
use App\Notifications\IntranetNotification;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use App\Model\Encuesta;
use App\Model\Pregunta;
use App\Model\Respuesta;
use Carbon\Carbon;
use App\Providers\SweetAlertServiceProvider;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Input;
use Mockery\Exception;
use Yajra\Datatables\Datatables;

class EncuestaController extends Controller
{
    function getIndex(){
        return view('pages.admin.encuesta.Index');
    }
    function getEncuestas() {
        try {
            $encuestas = Encuesta::select('nombre','fecha_publicacion','fecha_finalizacion','id');
            return Datatables::of($encuestas)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }

    function getCrear(){
        return view('pages.admin.encuesta._Crear');
    }
    function postCrear(Request $request){
        $this->validate($request,[
            'nombre' => 'required',
            'descripcion' => 'required',
            'fecha_publicacion' => 'required',
            'fecha_finalizacion' => 'required'
        ]);

        try{
            $Encuesta = [
                "nombre" => $request["nombre"],
                "fecha_publicacion" => Carbon::createFromFormat('d/m/Y',$request["fecha_publicacion"])->setTime(0,0,0),
                "estado" => 0,
                "activo" => true,
                "descripcion" => $request["descripcion"],
                "fecha_finalizacion" => Carbon::createFromFormat('d/m/Y',$request["fecha_finalizacion"])->setTime(0,0,0)
            ];
            $id = Encuesta::create($Encuesta)->id;
            Alert()->success('Se registro la encuesta correctamente', 'Registro realizado')->persistent('Cerrar');
            return redirect('admin/encuestas/editar/' . $id);
        }catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }

    }

    function getEditar($id){
        try
        {
            $encuesta = Encuesta::with('preguntas')->findOrFail($id);
            return view('pages.admin.encuesta.Editar')->with('encuesta',$encuesta);
        } catch(ModelNotFoundException $e) {
            abort(404);
        } catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }
    }
    function postEditar(Request $request){
        $this->validate($request,[
            'id' => 'required',
            'nombre' => 'required',
            'descripcion' => 'required',
            'fecha_publicacion' => 'required',
            'fecha_finalizacion' => 'required'
        ]);

        try{
            $encuestabd = Encuesta::find($request->input('id'));
            $encuestabd->nombre = $request["nombre"];
            $encuestabd->fecha_publicacion = Carbon::createFromFormat('d/m/Y',$request["fecha_publicacion"])->setTime(0,0,0);
            $encuestabd->fecha_finalizacion = Carbon::createFromFormat('d/m/Y',$request["fecha_finalizacion"])->setTime(0,0,0);
            $encuestabd->descripcion = $request["descripcion"];
            $encuestabd->save();
            Alert()->success('Se actualizó la encuesta correctamente!', 'Actualización realizada!')->persistent('Cerrar');
            return redirect('admin/encuestas/editar/'.$request["id"]);

        }catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }

    }
    function postEliminar(Request $request) {
        try {
            $participantes = EncuestaUsuario::where('id_encuesta', $request->id)->first();

            if(!$participantes) {
                $encuesta = Encuesta::find($request->id);
                $encuesta->delete();
                return 'true';
            } else {
                return 'false';
            }
        }catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }
    }

    function getPreguntaCrear(){

        return view('pages.admin.encuesta._CrearPregunta');
    }
    function postCrearPregunta(Request $request){
        try{
            $Pregunta = [
                "descripcion" => $request["descripcionPregunta"],
                "id_tipo_pregunta" =>  $request["TipoPreguntaId"],
                "id_encuesta" =>  $request["EncuestaId"],
            ];
            $id = Pregunta::create($Pregunta)->id;

            $Respuestas = $request["listkey"];
            if($Respuestas != null) {
                foreach($Respuestas as $respuesta)
                {
                    $Respuesta = [
                        "identificador" => $respuesta,
                        "descripcion" =>  $respuesta,
                        "id_pregunta" =>  $id
                    ];

                    Respuesta::create($Respuesta);
                }
            }
        }catch(Exception $exception){
            return "FALSE";
        }
        return "TRUE";
    }

    function getPreguntaEditar(Request $request){
        $pregunta = Pregunta::with('respuestas')->find($request["id"]);

        return view('pages.admin.encuesta._EditarPregunta')->with('pregunta',$pregunta);
    }
    function postEditarPregunta(Request $request)
    {
        try{
            $preguntadb = Pregunta::with('respuestas')->find($request["PreguntaId"]);
            Respuesta::where('id_pregunta',$request["PreguntaId"])->delete();
            $preguntadb->descripcion = $request["descripcionPregunta"];
            $preguntadb->id_tipo_pregunta = $request["TipoPreguntaId"];
            $preguntadb->save();

            $Respuestas = $request["listkey"];
            if($Respuestas != null) {
                foreach($Respuestas as $respuesta)
                {
                    $Respuesta = [
                        "identificador" => $respuesta,
                        "descripcion" =>  $respuesta,
                        "id_pregunta" =>  $preguntadb->id
                    ];

                    Respuesta::create($Respuesta);
                }
            }
        }catch(Exception $exception){
            return "FALSE";
        }
        return "TRUE";
    }

    function postEliminarPregunta(Request $request) {
        try {

            Respuesta::where('id_pregunta', $request->id)->delete();
            $pregunta = Pregunta::find($request->id);
            $pregunta->delete();

            return "TRUE";
        }catch(Exception $exception){
            return "FALSE";
        }
    }


    public function getEnviar($id) {
        try{
            $encuesta = Encuesta::findOrFail($id);

            $preguntas = Pregunta::where('id_encuesta','=',$id)->count();
            if ($preguntas == 0) {
                Alert()->error('La encuesta seleccionada no cuenta con preguntas creadas', 'Encuesta sin preguntas')->persistent('Ok');
                return redirect('admin/encuestas');
            }

            $roles = Role::all()->pluck('name', 'id');
            $especialidades = Especialidad::all()->pluck('nombre', 'id');
            $nombre = $encuesta->nombre;
            return view('pages.admin.encuesta.envio', compact('roles','especialidades', 'id', 'nombre'));
        } catch(ModelNotFoundException $e) {
            abort(404);
        } catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }
    }
    public function postEnviarRoles(Request $request) {
        try{
            foreach ($request->rol as $rol) {
                if ($rol == config('constants.ROLES.ALUMNO')) {
                    if ($request->especialidad != null) {
                        foreach ($request->especialidad as $especialidad) {
                            $alumnos = Alumno::where('id_especialidad',$especialidad)->get();
                            foreach ($alumnos as $alumno) {
                                $encuesta = EncuestaUsuario::firstOrCreate([
                                    'id_encuesta' => $request["encuesta"],
                                    'id_usuario' =>  $alumno->id_usuario
                                ]);
                                if ($encuesta->wasRecentlyCreated) {
                                    $href = url('/encuestas/responder/') . '/' . $encuesta->id;
                                    $from = "Encuestas - Intranet";
                                    $message = "Se ha generado una nueva encuesta para usted. Por favor, ingrese a responderla.";
                                    User::findOrFail($$alumno->id_usuario)->notify(new IntranetNotification($href, $from, $message));
                                }
                            }

                        }
                    } else {
                        $usuarios = Role::find($rol)->users;
                        foreach ($usuarios as $usuario) {
                            $encuesta = EncuestaUsuario::firstOrCreate([
                                'id_encuesta' => $request["encuesta"],
                                'id_usuario' =>  $usuario->id
                            ]);
                            if ($encuesta->wasRecentlyCreated) {
                                $href = url('/encuestas/responder/') . '/' . $encuesta->id;
                                $from = "Encuestas - Intranet";
                                $message = "Se ha generado una nueva encuesta para usted. Por favor, ingrese a responderla.";
                                User::findOrFail($$usuario->id)->notify(new IntranetNotification($href, $from, $message));
                            }
                        }
                    }

                } else {
                    $usuarios = Role::find($rol)->users;
                    foreach ($usuarios as $usuario) {
                        $encuesta = EncuestaUsuario::firstOrCreate([
                            'id_encuesta' => $request["encuesta"],
                            'id_usuario' =>  $usuario->id
                        ]);
                        if ($encuesta->wasRecentlyCreated) {
                            $href = url('/encuestas/responder') . '/' . $encuesta->id;
                            $from = "Encuestas - Intranet";
                            $message = "Se ha generado una nueva encuesta para usted. Por favor, ingrese a responderla.";
                            User::findOrFail($usuario->id)->notify(new IntranetNotification($href, $from, $message));
                        }
                    }
                }
            }

            $enc = Encuesta::find($request["encuesta"]);
            $enc->estado = config('constants.ESTADO_ENCUESTA.PUBLICADA');
            $enc->save();

        return response()->json('success');
        } catch(Exception $exception){
            return "false";
        }
    }

    public function getUsuarios(){
        try {
            $usuarios = DB::table('usuario')->select(
                'id',
                'username',
                'dni',
                'apellido_paterno',
                'apellido_materno',
                'nombres'
            );
            return Datatables::of($usuarios)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }

    public function postEnviarUsuarios(Request $request) {
        try {
            if (!$request->id) {
                return response()->json('error');
            }
            foreach ($request->id as $usuario) {
                EncuestaUsuario::firstOrCreate([
                    'id_encuesta' => $request["encuesta"],
                    'id_usuario' =>  $usuario
                ]);
            }
            return response()->json('success');
        } catch (\Exception $e) {
            return response()->json('error');
        }
    }

    function getImportar(){

        $encuestas = Encuesta::pluck('nombre','id');

        return view('pages.admin.encuesta._importar', compact('encuestas'));
    }
    function postImportar(Request $request){
        $this->validate($request,[
            'encuesta_id' => 'required',
            'fecha_publicacion' => 'required',
            'fecha_finalizacion' => 'required'
        ]);

        try{
            $importar = Encuesta::find($request->input('encuesta_id'));
            $encuesta = $importar->replicate();
            $encuesta->fecha_publicacion = Carbon::createFromFormat('d/m/Y',$request["fecha_publicacion"])->setTime(0,0,0);
            $encuesta->fecha_finalizacion = Carbon::createFromFormat('d/m/Y',$request["fecha_finalizacion"])->setTime(0,0,0);
            $encuesta->push();

            $preguntas = Pregunta::where('id_encuesta', '=', $importar->id)->get();
            foreach ($preguntas as $pregunta) {
                $npregunta = $pregunta->replicate();
                $npregunta->id_encuesta = $encuesta->id;
                $npregunta->push();

                $respuestas = Respuesta::where('id_pregunta','=', $pregunta->id)->get();
                foreach ($respuestas as $respuesta) {
                    $nrespuesta = $respuesta->replicate();
                    $nrespuesta->id_pregunta = $npregunta->id;
                    $nrespuesta->push();
                }
            }
            $id = $encuesta->id;
            Alert()->success('Se registro la encuesta correctamente', 'Registro realizado')->persistent('Cerrar');
            return redirect('admin/encuestas/editar/' . $id);
        }catch(Exception $exception){
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('admin/encuestas');
        }

    }
}
