<?php

namespace App\Controllers\Academico;

use App\Controllers\BaseController;
use App\Controllers\GenericController;
use App\Libraries\CIAuth;
use App\Libraries\Funciones;
use App\Models\ArchivoModel;
use App\Models\AsistenciaModel;
use App\Models\CargaProfesorModel;
use App\Models\Persona;
use App\Models\UsuarioModel;
use App\Models\AlumnoModel;
use App\Models\Permiso;
use App\Models\PeriodoAcademico;
use App\Models\AlumnoPlanEstudio;
use App\Models\Departamento;
use App\Models\Perfil;
use App\Models\PlanEstudio;
use App\Models\VAlumno;
use App\Models\ProgramaEstudio;
use App\Models\VCargaLectivaDocente;
use App\Models\ViewCursoAlumnoSemestre;
use PhpOffice\PhpSpreadsheet\Exception;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;


class AlumnoController extends GenericController
{
    public function index(): string
    {
        $personas = new VAlumno();
        $departamentos = new Departamento();
        $perfiles = new Perfil();
        $periodoAcademico = new PeriodoAcademico();

        $programaEstudioModel = new ProgramaEstudio();
        $lsPersonas = $personas->where('usua_estado', true)->findAll();
        $lsPeriodo = $periodoAcademico->where('peraca_estado', true)->findAll();
        $lsDepartamentos = $departamentos->findAll();
        $lsProgramaEstudio = $programaEstudioModel->where('proest_estado', true)->findAll();
        $lsPerfiles = $perfiles->where('perf_estado', true)->findAll();
        $data = array(
            'tituloModulo' => 'LISTADO DE ESTUDIANTES',
            'lsPersonas' => $lsPersonas,
            'lsPerfiles' => $lsPerfiles,
            'lsDepartamentos' => $lsDepartamentos,
            'lsProgramaEstudio' => $lsProgramaEstudio,
            'lsPeriodo' => $lsPeriodo
        );

        return view('academico/view_alumno', $data);
    }
    public function guardar(): string
    {
        $request = \Config\Services::request();
        $validation = \Config\Services::validation();

        // Validaciones
        $validationRules = [
            'pers_primer_nombre' => [
                'rules' => 'required|min_length[3]',
                'errors' => [
                    'required' => 'Ingrese primer nombre',
                    'min_length' => 'El primer nombre debe tener mínimo 3 caracteres.',
                ]
            ],
            'pers_primer_apellido' => [
                'rules' => 'required|min_length[3]',
                'errors' => [
                    'required' => 'Ingrese apellido paterno',
                    'min_length' => 'El apellido paterno debe tener mínimo 3 caracteres.',
                ]
            ],
            'pers_segundo_apellido' => [
                'rules' => 'required|min_length[3]',
                'errors' => [
                    'required' => 'Ingrese apellido materno',
                    'min_length' => 'El apellido materno debe tener mínimo 3 caracteres.',
                ]
            ],
            'pers_fecha_nac' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Ingrese fecha de nacimiento',
                ]
            ],
            'pers_sexo' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Seleccione sexo',
                ]
            ],
            'pers_num_doc' => [
                'rules' => 'required|min_length[8]|is_unique[persona.pers_num_doc]',
                'errors' => [
                    'required' => 'Ingrese número de documento de identidad',
                    'min_length' => 'Número de documento debe tener mínimo 8 caracteres.',
                    'is_unique' => 'Documento de identidad ya se encuentra registrado.',
                ]
            ],
            'pers_ubigeo_nac' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Seleccione ubigeo de nacimiento',
                ]
            ],
            'pers_ubigeo_actual' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Seleccione ubigeo actual',
                ]
            ],
            'pers_direccion' => [
                'rules' => 'required|min_length[3]',
                'errors' => [
                    'required' => 'Ingrese su dirección',
                    'min_length' => 'La dirección debe tener mínimo 3 caracteres.',
                ]
            ],
            'pers_celular' => [
                'rules' => 'required|min_length[9]',
                'errors' => [
                    'required' => 'Ingrese su número de celular',
                    'min_length' => 'El número de celular debe tener mínimo 9 caracteres.',
                ]
            ],
            'pers_correo' => [
                'rules' => 'required|valid_email',
                'errors' => [
                    'required' => 'Ingrese correo',
                    'valid_email' => 'Ingrese un correo válido.',
                ]
            ],
            'plaest_id' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Ingrese plan de estudio',
                ]
            ],
            'peraca_id' => [
                'rules' => 'required',
                'errors' => [
                    'required' => 'Ingrese periodo académico',
                ]
            ]

        ];

        if (!$this->validate($validationRules)) {
            $errors = $validation->getErrors();
            return json_encode(['status' => 0, 'error' => $errors]);
        }

        $persona = new Persona();
        $success = false;

        if ($request->getVar("pers_id") !== null && $request->getVar("pers_id") !== '') {
            $success = $persona->where('pers_id', $request->getVar('pers_id'))
                ->set([
                    'pers_primer_nombre' => $request->getVar('pers_primer_nombre'),
                    'pers_segundo_nombre' => $request->getVar('pers_segundo_nombre'),
                    'pers_primer_apellido' => $request->getVar('pers_primer_apellido'),
                    'pers_segundo_apellido' => $request->getVar('pers_segundo_apellido'),
                    'pers_fecha_nac' => $request->getVar('pers_fecha_nac'),
                    'pers_sexo' => $request->getVar('pers_sexo'),
                    'pers_num_doc' => $request->getVar('pers_num_doc'),
                    'pers_ubigeo_nac' => $request->getVar('pers_ubigeo_nac'),
                    'pers_ubigeo_actual' => $request->getVar('pers_ubigeo_actual'),
                    'pers_direccion' => $request->getVar('pers_direccion'),
                    'pers_celular' => $request->getVar('pers_celular'),
                    'pers_correo' => $request->getVar('pers_correo'),
                    'pers_foto' => $request->getVar('pers_foto'),
                ])->update();
        } else {
            // Crear nueva persona
            $success = $persona->save([
                'pers_primer_nombre' => $request->getVar('pers_primer_nombre'),
                'pers_segundo_nombre' => $request->getVar('pers_segundo_nombre'),
                'pers_primer_apellido' => $request->getVar('pers_primer_apellido'),
                'pers_segundo_apellido' => $request->getVar('pers_segundo_apellido'),
                'pers_fecha_nac' => $request->getVar('pers_fecha_nac'),
                'pers_sexo' => $request->getVar('pers_sexo'),
                'pers_num_doc' => $request->getVar('pers_num_doc'),
                'pers_ubigeo_nac' => $request->getVar('pers_ubigeo_nac'),
                'pers_ubigeo_actual' => $request->getVar('pers_ubigeo_actual'),
                'pers_direccion' => $request->getVar('pers_direccion'),
                'pers_celular' => $request->getVar('pers_celular'),
                'pers_correo' => $request->getVar('pers_correo'),
                'pers_foto' => $request->getVar('pers_foto'),
                'pers_estado' => true,
            ]);
        }

        if ($success) {
            $pers_id = $request->getVar('pers_id') ? $request->getVar('pers_id') : $persona->insertID();
            $usuario = new UsuarioModel();
            $alumno = new AlumnoModel();
            $alumnoPlan = new AlumnoPlanEstudio();
            // Crear Alumno
            if ($alumno->save([
                'pers_id' => $pers_id,
                'alum_codigo' => $request->getVar('pers_num_doc'),
                'alum_estado' => true
            ])) {
                $alum_id = $alumno->insertID();
                // Crear AlumnoPlanEstudio
                if ($alumnoPlan->save([
                    'alum_id' => $alum_id,
                    'plaest_id' => $request->getVar('plaest_id'),
                    'peraca_id' => $request->getVar('peraca_id'),
                    'alpe_estado' => true
                ])) {
                    // Crear Usuario
                    if ($usuario->save([
                        'pers_id' => $pers_id,
                        'usua_usuario' => $request->getVar('pers_num_doc'),
                        'usua_contrasena' => password_hash($request->getVar('pers_num_doc'), PASSWORD_BCRYPT),
                        'usua_estado' => true
                    ])) {
                        $usua_id = $usuario->insertID();
                        $permiso = new Permiso();
                        $perfilesSeleccionados = '7';
                        // Crear Permisos
                        if (!empty($perfilesSeleccionados)) {
                            $permiso->save([
                                'perm_estado' => true,
                                'perf_id' => $perfilesSeleccionados, // Asegúrate de que se está usando la variable correcta aquí
                                'usua_id' => $usua_id,
                            ]);

                            return json_encode(['status' => 1, 'msg' => 'Los datos fueron guardados correctamente']);
                        } else {
                            return json_encode(['status' => 0, 'msg' => 'No se seleccionaron perfiles']);
                        }
                    } else {
                        return json_encode(['status' => 0, 'msg' => 'Sucedió un error al guardar en la tabla Usuario']);
                    }
                } else {
                    return json_encode(['status' => 0, 'msg' => 'Sucedió un error al guardar en la tabla AlumnoPlanEstudio']);
                }
            } else {
                return json_encode(['status' => 0, 'msg' => 'Sucedió un error al guardar en la tabla Alumno']);
            }
        } else {
            return json_encode(['status' => 0, 'msg' => 'Sucedió un error al guardar en la tabla Persona']);
        }
    }
    public function buscar(): string
    {
        $request = \Config\Services::request();
        $alumno = new AlumnoModel();
        $persona = new Persona();
        $alumno = $alumno->find($request->getVar('alum_id'));
        if ($alumno) {
            // Obtener el pers_id del usuario
            $pers_id = $alumno->pers_id;
            // Buscar los datos de la persona usando el pers_id
            $persona = $persona->find($pers_id);
            // Combinar los datos del usuario y la persona
            $resultado = [
                'alumno' => $alumno,
                'persona' => $persona
            ];
        } else {
            $resultado = ['error' => 'Alumno no encontrado'];
        }
        return json_encode($resultado);
    }

    /**
     * @throws Exception
     * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
     * @throws \Exception
     */
    public function importar()
    {
        $request = \Config\Services::request();
        $file = $request->getFile('archivo_excel');

        if ($file->isValid()) {
            if ($file->isValid() && !$file->hasMoved()) {
                $newName = $file->getRandomName();

                $directoryUpload = 'uploads/importar/';
                $directoryUploadPatch = Funciones::getPatchUploads() . $directoryUpload;
                if (!is_dir($directoryUploadPatch)) {
                    mkdir($directoryUploadPatch, 0777, TRUE);
                }

                $file->move($directoryUploadPatch, $newName);

                $reader = IOFactory::createReader('Xlsx');
                $spreadsheet = $reader->load($directoryUploadPatch.$newName);
                $sheet = $spreadsheet->getSheet(0);

                $numAlumnos = 0;
                //$this->db->transStart();
                foreach ($sheet->getRowIterator(3) as $row) {

                    $pers_num_doc = trim($sheet->getCellByColumnAndRow(7,$row->getRowIndex())->getValue());
                    $alumnoModel = new AlumnoModel();
                    $personaModel = new Persona();
                    $usuarioModel = new UsuarioModel();

                    $pers_primer_nombre = trim($sheet->getCellByColumnAndRow(1,$row->getRowIndex())->getValue());
                    $pers_segundo_nombre = trim($sheet->getCellByColumnAndRow(2,$row->getRowIndex())->getValue());
                    $pers_primer_apellido = trim($sheet->getCellByColumnAndRow(3,$row->getRowIndex())->getValue());
                    $pers_segundo_apellido = trim($sheet->getCellByColumnAndRow(4,$row->getRowIndex())->getValue());
                    if(Date::isDateTime($sheet->getCellByColumnAndRow(5,$row->getRowIndex()))){
                        $pers_fecha_nac = trim($sheet->getCellByColumnAndRow(5,$row->getRowIndex())->getValue());
                        $pers_fecha_nac = Date::excelToDateTimeObject($pers_fecha_nac);
                        $pers_fecha_nac = $pers_fecha_nac->format('Y-m-d');
                    }else{
                        $pers_fecha_nac = trim($sheet->getCellByColumnAndRow(5,$row->getRowIndex())->getValue());
                    }
                    $pers_sexo = trim($sheet->getCellByColumnAndRow(6,$row->getRowIndex())->getValue());

                    $pers_ubigeo_nac = trim($sheet->getCellByColumnAndRow(8,$row->getRowIndex())->getValue());
                    $pers_ubigeo_actual = trim($sheet->getCellByColumnAndRow(9,$row->getRowIndex())->getValue());
                    $pers_direccion = trim($sheet->getCellByColumnAndRow(10,$row->getRowIndex())->getValue());
                    $pers_celular = trim($sheet->getCellByColumnAndRow(11,$row->getRowIndex())->getValue());
                    $pers_correo = trim($sheet->getCellByColumnAndRow(12,$row->getRowIndex())->getValue());
                    $alum_codigo = trim($sheet->getCellByColumnAndRow(13,$row->getRowIndex())->getValue());
                    $plaest_id = trim($sheet->getCellByColumnAndRow(14,$row->getRowIndex())->getValue());
                    $peraca_id = trim($sheet->getCellByColumnAndRow(15,$row->getRowIndex())->getValue());
                    $usua_usuario = trim($sheet->getCellByColumnAndRow(16,$row->getRowIndex())->getValue());
                    $usua_contrasena = trim($sheet->getCellByColumnAndRow(17,$row->getRowIndex())->getValue());
                    $perf_id = trim($sheet->getCellByColumnAndRow(18,$row->getRowIndex())->getValue());


                    $usuario = null;
                    //GUARDAMOS PERSONA
                    $persona = $personaModel->where('pers_num_doc',$pers_num_doc)->first();
                    if($persona == null) {
                        $personaModel->save([
                            'pers_primer_nombre' => $pers_primer_nombre,
                            'pers_segundo_nombre' => $pers_segundo_nombre,
                            'pers_primer_apellido' => $pers_primer_apellido,
                            'pers_segundo_apellido' => $pers_segundo_apellido,
                            'pers_fecha_nac' => $pers_fecha_nac,
                            'pers_sexo' => $pers_sexo,
                            'pers_num_doc' => $pers_num_doc,
                            'pers_ubigeo_nac' => $pers_ubigeo_nac,
                            'pers_ubigeo_actual' => $pers_ubigeo_actual,
                            'pers_direccion' => $pers_direccion,
                            'pers_celular' => $pers_celular,
                            'pers_correo' => $pers_correo,
                            'pers_foto' => '',
                            'pers_estado' => true,
                        ]);

                        $pers_id = $personaModel->insertID();
                    }else{
                        $pers_id = $persona->pers_id;

                        $usuario = $usuarioModel->where('pers_id',$pers_id)->first();
                    }
                    if($usuario == null){
                        $usuarioModel->save([
                            'pers_id' => $pers_id,
                            'usua_usuario' => $usua_usuario,
                            'usua_contrasena' => password_hash($usua_contrasena, PASSWORD_BCRYPT),
                            'usua_estado' => true
                        ]);
                        $usua_id = $usuarioModel->insertID();
                    }else{
                        $usua_id = $usuario->usua_id;
                    }

                    $permiso = new Permiso();
                    $permiso->save([
                        'perm_estado' => true,
                        'perf_id' => $perf_id, // Asegúrate de que se está usando la variable correcta aquí
                        'usua_id' => $usua_id,
                    ]);

                    $alumno = $alumnoModel->where('alum_codigo',$alum_codigo)->first();
                    if($alumno == null) {

                        $alumnoModel->save([
                            'pers_id' => $pers_id,
                            'alum_codigo' => $alum_codigo,
                            'alum_estado' => true
                        ]);
                        $alum_id = $alumnoModel->insertID();

                    }else{
                        $alum_id = $alumno->alum_id;
                    }

                    $alumnoPlanModel = new AlumnoPlanEstudio();

                    $alumnoPlan = $alumnoPlanModel->where('alum_id',$alum_id)->where('plaest_id',$plaest_id)->first();
                    if($alumnoPlan == null){
                        $alumnoPlanModel->save([
                            'alum_id' => $alum_id,
                            'plaest_id' => $plaest_id,
                            'peraca_id' => $peraca_id,
                            'alpe_estado' => true
                        ]);
                    }

                    $numAlumnos++;
                }
                //$this->db->transComplete();

                $resultado = [
                    'status' => 1,
                    'msg' => "Numero de alumnos registrados: {$numAlumnos}",
                ];

                return json_encode($resultado);
            }
        }
    }

    public function asistencia(){

        $periodoModel = new PeriodoAcademico();
        $viewCursoAlumnoSemestreModel = new ViewCursoAlumnoSemestre();
        $lsPeriodos = $periodoModel->where('peraca_estado', true)->orderBy('peraca_id', 'desc')->findAll();

        $peraca_id = $lsPeriodos[0]->peraca_id;

        if($this->request->getGet('peraca_id')){
            $peraca_id = $this->request->getGet('peraca_id');
        }

        $user = CIAuth::user();

        $almunoModel = new AlumnoModel();
        $alumno = $almunoModel->where('pers_id',$user->pers_id)->first();

        $lsCursos = $viewCursoAlumnoSemestreModel->where('peraca_id',$peraca_id)->where('alum_id',$alumno->alum_id)->findAll();

        $data = array(
            'tituloModulo' => 'Mis asistencias',
            'lsPeriodos' => $lsPeriodos,
            'lsCursos' => $lsCursos,
            'peraca_id' => $peraca_id,
        );

        return view('academico/alumno/view_alumno_asistencia', $data);
    }

    public function listAsistencia(){

        $caseId = $this->request->getPost('caseId');
        $start = $this->request->getPost('start');
        $end = $this->request->getPost('end');

        $lsAsistencia = [];

        $start = date('Y-m-d', strtotime($start));
        $end = date('Y-m-d', strtotime($end));

        $cargaProfesorModel = new CargaProfesorModel();
        $asistenciaModel = new AsistenciaModel();
        $almunoModel = new AlumnoModel();
        $user = CIAuth::user();

        $alumno = $almunoModel->where('pers_id',$user->pers_id)->first();

        $lsCargaHorario = $cargaProfesorModel->listByCaseIdToHorario($caseId,$start,$end);

        if(count($lsCargaHorario) > 0) {
            foreach ($lsCargaHorario as $carga) {

                $asistencia = $asistenciaModel->listByAlumIdHoraId($alumno->alum_id,$carga->hora_id);

                $horario = new \stdClass();
                $horario->title = $carga->hora_inicio." - ".$carga->hora_fin;
                $horario->start = $carga->time_desde;
                $horario->end = $carga->time_hasta;
                $horario->classNames = "bg-info";

                if($asistencia != null){
                    if($asistencia->asis_marcacion == 'P'){
                        $horario->classNames = "bg-success";
                    }
                    if($asistencia->asis_marcacion == 'T'){
                        $horario->classNames = "bg-warning";
                    }
                    if($asistencia->asis_marcacion == 'F'){
                        $horario->classNames = "bg-danger";
                    }
                    if($asistencia->asis_marcacion == 'J'){
                        $horario->classNames = "bg-primary";
                    }
                }


                $lsAsistencia[] = $horario;
            }
        }


        return $this->response->setJSON($lsAsistencia);
    }

    public function perfil(){

        $periodoModel = new PeriodoAcademico();
        $viewCursoAlumnoSemestreModel = new ViewCursoAlumnoSemestre();
        $almunoModel = new AlumnoModel();
        $viewCargaLectivaDocenteModel = new VCargaLectivaDocente();
        $archivoModel = new ArchivoModel();

        $lsPeriodos = $periodoModel->where('peraca_estado', true)->orderBy('peraca_id', 'desc')->findAll();

        $peraca_id = $lsPeriodos[0]->peraca_id;

        if($this->request->getGet('peraca_id')){
            $peraca_id = $this->request->getGet('peraca_id');
        }

        $user = CIAuth::user();

        $alumno = $almunoModel->getAlumnoByPersId($user->pers_id);

        $lsCursos = $viewCursoAlumnoSemestreModel->where('peraca_id',$peraca_id)->where('alum_id',$alumno->alum_id)->findAll();
        $totalCredito = 0;
        for($i = 0; $i < count($lsCursos); $i++){

            $docentes = $viewCargaLectivaDocenteModel->where('case_id',$lsCursos[$i]->case_id)->findAll();

            for($j = 0; $j < count($docentes); $j++){
                $docentes[$j]->archivo =  $archivoModel->where('arch_estado',1)->where('capr_id',$docentes[$j]->capr_id)->first();
            }

            $lsCursos[$i]->docentes = $docentes;
            $totalCredito = $totalCredito + $lsCursos[$i]->plaescu_creditos;
        }

        $lsDeuda = $almunoModel->getDeudaById($alumno->alum_id);
        $totalPendiente = 0;
        foreach ($lsDeuda as $deuda){
            $totalPendiente=$totalPendiente+$deuda->crpa_pendiente;
        }

        $data = array(
            'tituloModulo' => 'Perfil',
            'lsPeriodos' => $lsPeriodos,
            'peraca_id' => $peraca_id,
            'alumno' => $alumno,
            'lsCursos' => $lsCursos,
            'totalCredito' => $totalCredito,
            'lsDeuda' => $lsDeuda,
            'totalPendiente' => $totalPendiente,
        );

        return view('academico/alumno/view_alumno_perfil', $data);
    }
}
