<?php

namespace App\Controllers;

use App\Entities\PrestadorSolicitudModel;
use App\Models\EncuestaModel;
use App\Models\PreguntaModel;
use App\Models\PrestadorModel;
use App\Models\PrestadorSolicitudModel as ModelsPrestadorSolicitudModel;
use App\Models\SurveyUserModel;
use App\Models\UserModel;
use PHPUnit\Framework\MockObject\Stub\ReturnReference;

class Admin extends BaseController
{
    public function home()
    {
        $data = [
            'title' => 'Inicio',
            'solicitudes' => model(PrestadorSolicitudModel::class)->countSolicitudes(),
            'prestadoresActivos' => model(PrestadorModel::class)->countPrestadoresActivos(),
        ];
        return view('Admin/index', $data);
    }

    // PRESTADORES
    public function prestadores()
    {
        $prestadores = model(PrestadorModel::class)->getPrestadoresActivos();
        // dd($prestadores[0]);
        return view('Admin/prestadores', ['prestadores' => $prestadores]);
    }

    // SOLICITUDES
    public function solicitudes()
    {

        $data = [
            'title' => 'Solicitudes',
            'solicitudes' => model(PrestadorSolicitudModel::class)->getPrestadorSolicitud(),
        ];
        return view('Admin/solicitudes', $data);
    }

    public function revisarSolicitud($id)
    {

        $model = model(ModelsPrestadorSolicitudModel::class);

        if (!$datos = $model->find($id)) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Solicitud no encontrada'
            ));
        }

        $data = [
            'id' => $id,
            'email' => user()->email,
            'escuelas' =>  model(EscuelaModel::class)->getEscuelas(),
            'departamentos' =>  model(DepartamentoModel::class)->getDepartamentos(),
            'datos' => $datos,
            'revisar' => true,
        ];

        return view('Prestador/formulario_inicial', $data);
    }


    public function aprobarSolicitud($id)
    {
        $solicitudModel = model(ModelsPrestadorSolicitudModel::class);

        // Validar que la solicitud existe
        if (!$solicitud = $solicitudModel->find($id)) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Solicitud no encontrada'
            ));
        }

        // Verificar que status de la solicitud == 0
        if ($solicitud['status'] != 0) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'El status de esta solicitud no permite que sea aprobada'
            ));
        }

        // Encontrar usuario que mandó la solicitud
        if (!$user = model(UserModel::class)->findUserWithSolicitud($id)) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Ningún usuario tiene esa solicitud registrada.'
            ));
        }

        // Revisar que ususario no tenga asignado ningún registro de prestador
        if ($user->idprestador) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Este usuario ya ha sido aprobado.'
            ));
        }

        // Crear registro en la tabla prestador
        $prestadorModel = model(PrestadorModel::class);
        $solicitud = $this->completarSolicitud($solicitud);
        if (!$prestadorModel->save($solicitud)) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Error al guardar nuevo registro de prestador.'
            ));
        }


        // Asignar id de la tabla prestador al usuario aprobado
        $idprestador = $prestadorModel->getInsertID();
        $user->idprestador = $idprestador;
        model(UserModel::class)->save($user);

        // Cambiar status de la solicitud y eliminar datos con 'X'
        $this->eliminarDatosSolicitud($solicitudModel, $solicitud);

        // enviar correo
        $email  = service('email');

        $sent = $email
            ->setTo($solicitud['email'])
            ->setSubject('COPARMEX: Solicitud aprobada')
            ->setMessage(view('admin/emails/solicitudAprobada'))
            ->setMailType('html')
            ->send();

        return redirect()->route('admin_solicitudes')->with('msg', array(
            'type' => 'success',
            'body' => 'Solicitud aprobada. Se activo la cuenta del prestador.'
        ));
    }

    public function rechazarSolicitud($id)
    {
        // Validar que la solicitud existe
        $solicitudModel = model(ModelsPrestadorSolicitudModel::class);
        if (!$solicitud = $solicitudModel->find($id)) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'Solicitud no encontrada'
            ));
        }

        // Verificar que status de la solicitud == 0
        if ($solicitud['status'] != 0) {
            return redirect()->route('admin_solicitudes')->with('msg', array(
                'type' => 'danger',
                'body' => 'El status de esta solicitud no permite que sea rechazada'
            ));
        }

        // cambiar status de solicitud (2)
        $solicitud['status'] = 2;
        $solicitudModel->save($solicitud);

        // enviar correo
        $email  = service('email');
        $motivo = $this->request->getPost('motivo');

        $sent = $email
            ->setTo($solicitud['email'])
            ->setSubject('COPARMEX: Solicitud rechazada')
            ->setMessage(view('admin/emails/solicitudRechazada', ['motivo' => $motivo]))
            ->setMailType('html')
            ->send();


        return redirect()->route('admin_solicitudes')->with('msg', array(
            'type' => 'success',
            'body' => 'Solicitud fue rechazada'
        ));
    }

    private function completarSolicitud($solicitud)
    {
        // Agregar campos para completar el registro de prestador
        $solicitud['idusuario_actual'] = user_id();
        switch ($solicitud['turno']) {
            case 1:
                $solicitud['turno'] = 'MATUTINO';
                break;
            case 2:
                $solicitud['turno'] = 'VESPERTINO';
                break;
            case 3:
                $solicitud['turno'] = 'MIXTO';
                break;
        }
        $solicitud['tipo'] = ($solicitud['tipo'] == 1) ? 'SERVICIO SOCIAL' : 'PRACTICAS PROFESIONALES';

        return $solicitud;
    }

    private function eliminarDatosSolicitud($model, $solicitud)
    {
        $id = $solicitud['id'];
        foreach ($solicitud as $key => $value) {
            $solicitud[$key] = 'X';
        }
        $solicitud['id'] = (int)$id;
        $solicitud['status'] = 1;
        $solicitud['email'] = 'x@x.com';
        $solicitud['horas_servicio'] = 0;

        $model->save($solicitud);
    }

    // ENCUESTAS
    public function encuestas()
    {
        $data = [
            'title' => 'Encuestas',
            'encuestas' => model(EncuestaModel::class)->getEncuestas(),
        ];
        return view('Admin/encuestas.php', $data);
    }

    public function encuesta($id)
    {
        $data = [
            'id' => $id,
            'encuesta' => model(EncuestaModel::class)->getEncuestas($id, true),
            'preguntas' => model(PreguntaModel::class)->getPreguntas($id),

        ];
        return view('Admin/encuesta', $data);
    }

    public function nuevaEncuesta()
    {
        // Guardar encuesta
        if ($this->request->getMethod() === 'post') {
            $encuesta = model(EncuestaModel::class);

            $data = $this->request->getPost();
            // agregar id del usuario actual
            $data['user_id'] = user_id();

            // Validar datos
            if (!$encuesta->save($data)) {
                return redirect()->back()->withInput()->with('errors', $encuesta->errors());
            }

            return redirect()->route('admin_encuestas')->with('msg', array(
                'type' => 'success',
                'body' => 'Encuesta creada correctamente.'
            ));
        }
        $data = [
            'title' => 'Nueva encuesta',
        ];
        return view('Admin/formularioEncuesta', $data);
    }

    public function editarEncuesta($id)
    {
        $encuesta = model(EncuestaModel::class);

        if ($this->request->getMethod() === 'post') {

            $data = $this->request->getPost();

            if (!$encuesta->update($id, $data)) {
                return redirect()->back()->withInput()->with('errors', $encuesta->errors());
            }
            return redirect()->route('admin_encuestas')->with('msg', array(
                'type' => 'success',
                'body' => 'Encuesta editada correctamente',
            ));
        }

        $data = [
            'id' => $id,
            'title' => 'Modificar encuesta',
            'datos' => $encuesta->getEncuestas($id),
        ];

        return view('Admin/formularioEncuesta', $data);
    }

    public function eliminarEncuesta($id)
    {
        if (!model(EncuestaModel::class)->delete($id)) {
            return redirect()->route('admin_encuestas')->with('msg', array(
                'type' => 'error',
                'body' => 'Error al eliminar la encuesta.'
            ));
        }
        return redirect()->route('admin_encuestas')->with('msg', array(
            'type' => 'success',
            'body' => 'Encuesta eliminada correctamente.'
        ));
    }

    public function respuestas()
    {
        $respuestas = model(SurveyUserModel::class)->getEncuestasContestadas();

        $data = [
            'respuestas' => $respuestas,
        ];
        return view('Admin/respuestas', $data);
    }

    public function respuestasEncuesta($surveyId)
    {
        if (!$respuestas = model(RespuestaModel::class)->getRespuestasAll($surveyId)) {
            return redirect()->route('admin_respuestas')->with('msg', array(
                'type' => 'danger',
                'body'  => 'No se encontraron respuestas de para esta encuesta.',
            ));
        }

        // Agrupar respuestas por usuario
        $respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
            $accumulator[$element['user_id']][] = $element;
            return $accumulator;
        }, []);

        // reset array keys
        $respuestas = array_values($respuestas);

        // Agrupar respuestas de opción múltiple
        foreach ($respuestas as &$respuesta) {
            $respuesta = array_reduce($respuesta, function (array $accumulator, array $element) {
                $accumulator[$element['question_id']][] = $element;
                return $accumulator;
            }, []);
            $respuesta = array_values($respuesta);
        }
        unset($respuesta);

        $data = [
            'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
            'preguntas' => model(PreguntaModel::class)->getPreguntas($surveyId),
            'respuestas' => $respuestas,
        ];
        // dd($respuestas);
        return view('Admin/respuestasGenerales', $data);
    }

    public function respuesta($surveyId, $userId)
    {
        if (!$respuestas = model(RespuestaModel::class)->getRespuestas($surveyId, $userId)) {
            return redirect()->route('admin_respuestas')->with('msg', array(
                'type' => 'danger',
                'body'  => 'No se encontraron respuestas de este usuario.',
            ));
        }


        // Agrupar respuestas de opción múltipe
        $respuestas = array_reduce($respuestas, function (array $accumulator, array $element) {
            $accumulator[$element['question_id']][] = $element;
            return $accumulator;
        }, []);

        // Datos de prestador
        $prestadorId = model(UserModel::class)->find($userId)->idprestador;
        $prestador = model(PrestadorModel::class)->find($prestadorId);


        $data = [
            'tituloEncuesta' => model(EncuestaModel::class)->find($surveyId)['title'],
            'prestador' => $prestador,
            'respuestas' => $respuestas,
        ];


        return view('Admin/respuestaIndividual', $data);
    }

    // PREGUNTAS

    public function nuevaPregunta($id)
    {
        if ($this->request->getMethod() === 'post') {
            $pregunta = model(PreguntaModel::class);

            $data = $this->request->getPost();

            // Relacionar encuesta($id) con pregunta(survey_id)
            $data['survey_id'] = $id;
            $data['order_by'] = 1;


            // Validar y guardar datos
            if (!$pregunta->save($data)) {
                return redirect()->back()->withInput()->with('errors', $pregunta->errors());
            }

            $url = 'admin/encuesta/' . $id;
            return redirect()->to($url)->with('msg', array(
                'type' => 'success',
                'body'  => 'Pregunta registrada correctamente',
            ));
        }

        $data = [
            'title' => 'Nueva pregunta',
            'id' => $id,
        ];

        return view('Admin/formularioPregunta', $data);
    }


    public function editarPregunta($id)
    {
        $pregunta = model(PreguntaModel::class);

        if ($this->request->getMethod() === 'post') {

            $data = $this->request->getPost();
            if (!$pregunta->update($id, $data)) {
                return redirect()->back()->withInput()->with('errors', $pregunta->errors());
            }

            $encuestaId = $pregunta->find($id)['survey_id'];

            $url = 'admin/encuesta/' . $encuestaId;
            return redirect()->to($url)->with('msg', array(
                'type' => 'success',
                'body'  => 'Pregunta registrada correctamente',
            ));
        }

        $data = [
            'preguntaId' => $id,
            'title' => 'Editar pregunta',
            'datos' => $pregunta->find($id),
        ];
        return view('Admin/formularioPregunta', $data);
    }

    public function eliminarPregunta(int $id)
    {
        $model = model('PreguntaModel');

        if (!$pregunta = $model->find($id)) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        $encuestaId = $pregunta['survey_id'];
        $model->delete($id);

        $url = 'admin/encuesta/' . $encuestaId;

        return redirect()->to($url)->with('msg', array(
            'type' => 'success',
            'body'  => 'Pregunta eliminada correctamente',
        ));
    }

    public function preguntaPost()
    {
        $data = $this->request->getPost();
        $data['survey_id'] = 1;
        $data['order_by'] = 1;

        var_dump($data);
    }

    // GRUPOS
    public function createGroup()
    {
        // $authorize = service('authorization');
        // $id = $authorize->createGroup('Prestador', 'Prestadores de Servicio Social o Prácticas Profesionales');
        // echo $id;
    }
}