<?php
	class UploadFileModel {

		private $_db;

		/* CONSTRUCTOR */
		public function __construct() {
			$this->_db = new Base;
		}

		/* ENVIAR DATOS DEL ARCHIVO CSV */
		public function sendDataArchivoCsv($data, $NombreArchivo){
			
			$resultadoErrores = [];
			try {
				// 1. Obtener IDs necesarios
				$programa = $this->getPrograma($data['codigoPrograma']);
				$estadoAcademico = $this->getEstadoAcademico($data['estado']);
				$acuerdo = $this->getAcuerdo($data['acuerdo']);
				$curso = $this->getCurso($data['codigoEspacioAcademico']);
				
				// Verificar si se encontraron todos los registros necesarios
				if (!$programa) {
					$resultado = $this->insertarPrograma($data);
					if ( !$resultado ) {
						$resultado = [
							'success' => false,
							'message' => 'Error al insertar el programa'
						];
					}
					$programa = $resultado;
				}

				if (!$estadoAcademico) {
					$resultado = $this->insertarEstadoAcademico($data);
					if ( !$resultado ) {
						$resultadoErrores[] = [
							'success' => false,
							'message' => 'Error al insertar el estado académico'
						];
					}
					$estadoAcademico = $resultado;
				}

				if (!$acuerdo) {
					$resultado = $this->insertarAcuerdo($data);
					if ( !$resultado ) {
						$resultadoErrores[] = [
							'success' => false,
							'message' => 'Error al insertar el acuerdo'
						];
					}
					$acuerdo = $resultado;
				}

				if (!$curso) {
					$resultado = $this->insertarCurso($data);
					
					if ( !$resultado ) {
						$resultadoErrores[] = [
							'success' => false,
							'message' => 'Error al insertar el curso'
						];
					}
					$curso = $this->getCurso($data['codigoEspacioAcademico']);
				}

		
				// 2. Verificar si el código del estudiante es válido
				if (empty($data['codigoEstudiante']) || $data['codigoEstudiante'] == '0') {
					$resultadoErrores[] = [
						'success' => false,
						'message' => 'Error: Código de estudiante inválido o vacío en la fila actual'
					];
				}

				// 3. Verificar si el estudiante ya existe
				$estudiante = $this->getEstudiante($data['codigoEstudiante']);
				$estudianteId = null;
				
				if ($estudiante && !empty($estudiante[0]['CodigoEstudiante'])) {
					$estudianteId = $estudiante[0]['CodigoEstudiante'];
				} else {
					// Insertar nuevo estudiante
					$estudianteData = [
						'codigoEstudiante' => $data['codigoEstudiante'],
						'nombreEstudiante' => $data['nombreEstudiante'],
						'EstadoAcademicoId' => $estadoAcademico[0]['EstadoAcademicoId'],
						'ProgramaId' => $programa[0]['ProgramaId'],
						'AcuerdoId' => $acuerdo[0]['AcuerdoId']
					];

					$resultadoInsercion = $this->insertarEstudiante($estudianteData);
				
					if ($resultadoInsercion) {
						$nuevoEstudiante = $this->getEstudiante($data['codigoEstudiante']);
						if ($nuevoEstudiante) {
							$estudianteId = $nuevoEstudiante[0]['CodigoEstudiante'];
						} else {
							$resultadoErrores[] = [
								'success' => false,
								'message' => 'Error: No se pudo obtener el ID del nuevo estudiante'
							];
						}
					} else {
						$resultadoErrores[] = [
							'success' => false,
							'message' => 'Error al insertar el nuevo estudiante'
						];
					}
				}

				// 4. Verificar si ya existe la relación estudiante-curso para el período	
				$existeRelacion = $this->relacionEstudianteCurso($estudianteId, $curso[0]['Codigo'], $data['periodo']);
			
				if ($existeRelacion) {
					$resultadoErrores[] = [
						'success' => false,
						'message' => 'El estudiante'.$data['codigoEstudiante'].' ya está registrado en este curso para el período ' . $data['periodo']
					];
				}else{
					
					$archivoId = $this->getArchivo($NombreArchivo);

					// 5. Insertar relación estudiante-curso
					$estudianteCursoData = [
						'EstudianteId' => $estudianteId,
						'CursoId' => $curso[0]['Codigo'],
						'Periodo' => $data['periodo'],
						'Nota' => $data['nota'],
						'Observaciones' => $data['observacion'],
						'ArchivoId' => $archivoId[0]['ArchivoId'] ?? 1
					];

					$resultado = $this->insertarEstudianteCurso($estudianteCursoData);
					
					if ($resultado) {
						$resultadoErrores[] = [
							'success' => true,
							'message' => 'Registro completado exitosamente'
						];
					} else {
						$resultadoErrores[] = [
							'success' => false,
							'message' => 'Error al crear la relación estudiante-curso'
						];
					}
					
			}
					
			
			} catch (Exception $e) {
				$resultadoErrores[] = [
					'success' => false,
					'message' => 'Error al procesar los datos: ' . $e->getMessage()
				];
			}
			return $resultadoErrores;
		}


		/* GUARDAR ARCHIVO */
		public function saveCsvFileInfo($fileCsvInfo){
			$this->_db->query("INSERT INTO archivos (NombreArchivo, FechaSubida, UsuarioId) VALUES (:NombreArchivo, :FechaSubida, :UsuarioId)");
			$this->_db->bind(':NombreArchivo', $fileCsvInfo['NombreArchivo']);
			$this->_db->bind(':FechaSubida', $fileCsvInfo['FechaSubida']);
			$this->_db->bind(':UsuarioId', $fileCsvInfo['UsuarioId']);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				$archivoId = $this->_db->LastInsertId();
				$this->insertAuditoriaEventos([
					'usuario_id' => $_SESSION['UsuarioId'],
					'usuario_nombre' => $_SESSION['Usuario'],
					'tipo_evento' => 'INSERT',
					'nombre_tabla' => 'archivos',
					'llave_primaria' => $archivoId,
					'valores_anteriores' => json_encode([]),
					'valores_nuevos' => json_encode($fileCsvInfo),
					'ip_origen' => $_SERVER['REMOTE_ADDR'],
					'aplicacion_origen' => 'UdLosesSubjects',
					'comentario' => 'Cabeceras archivo: Subida de archivo exitosa'
				]);
				return true;
			}else{
				$this->insertAuditoriaEventos([
					'usuario_id' => $_SESSION['UsuarioId'],
					'usuario_nombre' => $_SESSION['Usuario'],
					'tipo_evento' => 'INSERT',
					'nombre_tabla' => 'archivos',
					'llave_primaria' => null,
					'valores_anteriores' => json_encode([]),
					'valores_nuevos' => json_encode($fileCsvInfo),
					'ip_origen' => $_SERVER['REMOTE_ADDR'],
					'aplicacion_origen' => 'UdLosesSubjects',
					'comentario' => 'Cabeceras archivo: Subida de archivo fallida'
				]);
				return false;
			}
		}

		/* BUSCAR CURSO */
		public function getPrograma($codigo){
			$this->_db->query("SELECT ProgramaId FROM programas WHERE Codigo = :Codigo");
			$this->_db->bind(':Codigo', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}

		}

		/* BUSCAR CURSO */
		public function getCurso($codigo){
			$this->_db->query("SELECT Codigo FROM cursos WHERE Codigo = :Codigo");
			$this->_db->bind(':Codigo', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		/* BUSCAR ESTADO ACADEMICO */
		public function getEstadoAcademico($codigo){
			$this->_db->query("SELECT EstadoAcademicoId FROM estados_academicos WHERE EstadoAcademico = :EstadoAcademico");
			$this->_db->bind(':EstadoAcademico', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		/* BUSCAR ACUERDO */
		public function getAcuerdo($codigo){
			$this->_db->query("SELECT AcuerdoId FROM acuerdos WHERE NombreAcuerdo = :NombreAcuerdo");
			$this->_db->bind(':NombreAcuerdo', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		/* BUSCAR ARCHIVO */
		public function getArchivo($codigo){
			$this->_db->query("SELECT DISTINCT ArchivoId FROM archivos WHERE NombreArchivo = :NombreArchivo");
			$this->_db->bind(':NombreArchivo', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0 ){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		/* BUSCAR ESTUDIANTE */
		public function getEstudiante($codigo){
			$this->_db->query("SELECT CodigoEstudiante FROM estudiantes WHERE CodigoEstudiante = :CodigoEstudiante");
			$this->_db->bind(':CodigoEstudiante', $codigo);
			$this->_db->execute();
			
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		/** INSERTAR ACUERDO */
		public function insertarAcuerdo($data){
			$this->_db->query("INSERT INTO acuerdos (NombreAcuerdo) 
			VALUES (:NombreAcuerdo)");
			$this->_db->bind(':NombreAcuerdo', $data['acuerdo']);
			$this->_db->execute();

			if($this->_db->rowCount() > 0){
				return array( array('AcuerdoId' => $this->_db->LastInsertId()));
			}else{
				return false;
			}
		}


		/* INSERTAR ESTADO ACADEMICO */
		public function insertarEstadoAcademico($data){
			$this->_db->query("INSERT INTO estados_academicos (EstadoAcademico, NombreEstado) 
			VALUES (:EstadoAcademico, :NombreEstado)");
			$this->_db->bind(':EstadoAcademico', $data['estado']);
			$this->_db->bind(':NombreEstado', $data['descripcion']);
			$this->_db->execute();

			if($this->_db->rowCount() > 0){
				return array( array('EstadoAcademicoId' => $this->_db->LastInsertId()));
			}else{
				return false;
			}
		} 


		/* INSERTAR PROGRAMAS */
		public function insertarPrograma($data){
			$this->_db->query("INSERT INTO programas (Nombre, Codigo) 
			VALUES (:Nombre, :Codigo)");
			$this->_db->bind(':Nombre', $data['proyectoCurricular']);
			$this->_db->bind(':Codigo', $data['codigoPrograma']);
			$this->_db->execute();

			if($this->_db->rowCount() > 0){
				 return array( array('ProgramaId' => $this->_db->LastInsertId()));
			}else{
				return false;
			}
		}

		/* INSERTAR CURSO */
		public function insertarCurso($data){
			$this->_db->query("INSERT INTO cursos (Codigo, Nombre) 
			VALUES (:Codigo, :Nombre)");
			$this->_db->bind(':Codigo', $data['codigoEspacioAcademico']);
			$this->_db->bind(':Nombre', $data['espacioAcademico']);
			$this->_db->execute();
			

			if($this->_db->rowCount() > 0){
				return true;
			}else{
				return false;
			}
		}

		/* INSERTAR ESTUDIANTE */
		public function insertarEstudiante($data){
			$this->_db->query("INSERT INTO estudiantes (CodigoEstudiante, Nombre, EstadoAcademicoId, ProgramaId, AcuerdoId) 
			VALUES (:CodigoEstudiante, :Nombre, :EstadoAcademicoId, :ProgramaId, :AcuerdoId)");
			$this->_db->bind(':CodigoEstudiante', $data['codigoEstudiante']);
			$this->_db->bind(':Nombre', $data['nombreEstudiante']);
			$this->_db->bind(':EstadoAcademicoId', $data['EstadoAcademicoId']);
			$this->_db->bind(':ProgramaId', $data['ProgramaId']);
			$this->_db->bind(':AcuerdoId', $data['AcuerdoId']);
			$this->_db->execute();

			if($this->_db->rowCount() > 0){
				return true;
			}else{
				return false;
			}
		}	

		/* INSERTAR ESTUDIANTE CURSO */
		public function insertarEstudianteCurso($data){
			$this->_db->query("INSERT INTO estudiantescursos (CodigoEstudianteId, CodigoCursoId, Periodo, Nota, Observaciones, ArchivoId) 
			VALUES (:CodigoEstudianteId, :CodigoCursoId, :Periodo, :Nota, :Observaciones, :ArchivoId)");
			$this->_db->bind(':CodigoEstudianteId', $data['EstudianteId']);
			$this->_db->bind(':CodigoCursoId', $data['CursoId']);
			$this->_db->bind(':Periodo', $data['Periodo']);
			$this->_db->bind(':Nota', $data['Nota']);
			$this->_db->bind(':Observaciones', $data['Observaciones']);
			$this->_db->bind(':ArchivoId', $data['ArchivoId']);
			$this->_db->execute();

			if($this->_db->rowCount() > 0){
				return true;
			}else{
				return false;
			}
		}
		
		/* RELACION ESTUDIANTE CURSO */
		public function relacionEstudianteCurso($estudianteId, $curso, $periodo){
			$this->_db->query("SELECT EstudianteCursoId FROM estudiantescursos 
			WHERE CodigoEstudianteId = :CodigoEstudiante 
			AND CodigoCursoId = :CodigoCurso 
			AND Periodo = :Periodo");
		
			$this->_db->bind(':CodigoEstudiante', $estudianteId);
			$this->_db->bind(':CodigoCurso', $curso);
			$this->_db->bind(':Periodo', $periodo);
			$this->_db->execute();

			if ($this->_db->rowCount() > 0) {
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}

		public function getArchivoById($id){
			$this->_db->query("SELECT * FROM archivos WHERE ArchivoId = :ArchivoId");
			$this->_db->bind(':ArchivoId', $id);
			$this->_db->execute();
			if($this->_db->rowCount() > 0){
				return $this->_db->rows_assoc();
			}else{
				return false;
			}
		}
		
		public function insertAuditoriaEventos($data){
			$query = "INSERT INTO `auditoria_eventos`(`usuario_id`,
													  `usuario_nombre`,
													  `tipo_evento`,
													  `nombre_tabla`,
													  `llave_primaria`,
													  `valores_anteriores`,
													  `valores_nuevos`,
													  `ip_origen`,
													  `aplicacion_origen`,
													  `comentario`) VALUES 
													  (:usuario_id,
													   :usuario_nombre,
													   :tipo_evento,
													   :nombre_tabla,
													   :llave_primaria,
													   :valores_anteriores,
													   :valores_nuevos,
													   :ip_origen,
													   :aplicacion_origen,
													   :comentario)";
			$this->_db->query($query);
			$this->_db->bind(':usuario_id', $data['usuario_id']);
			$this->_db->bind(':usuario_nombre', $data['usuario_nombre']);
			$this->_db->bind(':tipo_evento', $data['tipo_evento']);
			$this->_db->bind(':nombre_tabla', $data['nombre_tabla']);
			$this->_db->bind(':llave_primaria', $data['llave_primaria']);
			$this->_db->bind(':valores_anteriores', $data['valores_anteriores']);
			$this->_db->bind(':valores_nuevos', $data['valores_nuevos']);
			$this->_db->bind(':ip_origen', $data['ip_origen']);
			$this->_db->bind(':aplicacion_origen', $data['aplicacion_origen']);
			$this->_db->bind(':comentario', $data['comentario']);
			$this->_db->execute();
			if($this->_db->rowCount() > 0){
				return true;
			}else{
				return false;
			}
		}
	}
?>
