<?php
session_start(); //Se abre las variables de sesion
class UploadFile extends Controller {

    private $_uploadFileModel;

	/* CONSTRUCTOR */
	public function __construct() {
		$this->_uploadFileModel = $this->model('UploadFileModel');
	}

	/* INDEX */
	public function index() {
		$this->view('UploadFile/index'); //De lo contrario redirecciona al login.	
	}	

	/* SEND */
	public function send() {
		if (isset($_FILES['csvFile']) && $_FILES['csvFile']['error'] === 0) {
			$fileName = $_FILES['csvFile']['name'];
			$fileTmp  = $_FILES['csvFile']['tmp_name'];
			$ext      = pathinfo($fileName, PATHINFO_EXTENSION);
			date_default_timezone_set(TIMEZONE);
			$now = date('Y-m-d H:i:s'); 
			$infoArchivo = array(
				'NombreArchivo' => $fileName,
				'FechaSubida' => $now,
				'UsuarioId' => $_SESSION['UsuarioId'],
			);

			$this->_uploadFileModel->saveCsvFileInfo($infoArchivo);
	
			if (strtolower($ext) !== "csv") {
				$this->redirectAlert("El archivo debe ser un .csv", "error");
			}
	
			$delimitador = $this->detectarDelimitador($fileTmp);
			$row = 0;
			$resultadoErrores = [];
			if (($handle = fopen($fileTmp, "r")) !== FALSE) {
				while (($data = fgetcsv($handle, 0, $delimitador)) !== FALSE) {
					// Salta la primera fila (encabezado)
					
					if ($row++ > 1) {
						$valoresNoVacios = array_filter($data, function($valor) {
							return trim($valor) !== '';
						});
				
						if (empty($valoresNoVacios)) {
							// Saltar la fila
							continue;
						}
				
						if (count($data) > 1) {
							$data = array(
								'espacioAcademico'     	 => $this->separarEspacioAcademicodeCodigo($data[0])[1] ?? '',
								'codigoEspacioAcademico' => $this->separarEspacioAcademicodeCodigo($data[0])[0] ?? '',
								'facultad'             	 => $data[1] ?? '',
								'proyectoCurricular'   	 => $this->separarProgramaCodigo($data[2])[1] ?? '',
								'codigoPrograma'       	 => $this->separarProgramaCodigo($data[2])[0] ?? '',
								'periodo'              	 => $data[3] ?? '',
								'codigoEstudiante'     	 => $data[4] ?? '',
								'nombreEstudiante'     	 => $data[5] ?? '',
								'estado'               	 => $data[6] ?? '',
								'descripcion'          	 => $data[7] ?? '',
								'acuerdo'             	 => $data[8] ?? '',
								'nota'                	 => $this->normalizarNota($data[9] ?? ''),
								'grupo'               	 => $data[10] ?? '',
								'observacion'          	 => $data[11] ?? ''
							);
							
						} else {
							$preData = $this->separaLineaPorComa($data[0]);
							$preData = $this->eliminarComillasDobles($preData);
							$data = array(
								'espacioAcademico'       => $this->separarEspacioAcademicodeCodigo($preData[0])[1] ?? '',
								'codigoEspacioAcademico' => $this->separarEspacioAcademicodeCodigo($preData[0])[0] ?? '',
								'facultad'               => $preData[1] ?? '',
								'proyectoCurricular'     => $this->separarProgramaCodigo($preData[2])[1] ?? '',
								'codigoPrograma'         => $this->separarProgramaCodigo($preData[2])[0] ?? '',
								'periodo'                => $preData[3] ?? '',
								'codigoEstudiante'       => $preData[4] ?? '',
								'nombreEstudiante'       => $preData[5] ?? '',
								'estado'                 => $preData[6] ?? '',
								'descripcion'            => $preData[7] ?? '',
								'acuerdo'                => $preData[8] ?? '',
								'nota'                   => $this->normalizarNota($preData[9] ?? ''),
								'grupo'                  => $preData[10] ?? '',
								'observacion'            => $preData[11] ?? ''
							);
						};


						$resultadoErrores[] = $this->_uploadFileModel->sendDataArchivoCsv($data, $infoArchivo['NombreArchivo']);
						
					}
					
				}
				fclose($handle);

				enviarCorreo(MAIL_USER, 'Se ha cargado exitosamente un archivo', 
						'Se informa que se ha cargado exitosamente un archivo al sistema UdLosesSubjects, el
						 nombre del archivo es: ' . $infoArchivo['NombreArchivo'] . 
						 ' y el usuario que subio el archivo es: ' . $_SESSION['Usuario']);
				
				/** Auditoria */
				$this->_uploadFileModel->insertAuditoriaEventos([
					'usuario_id' => $_SESSION['UsuarioId'],
					'usuario_nombre' => $_SESSION['Usuario'],
					'tipo_evento' => 'Subida de archivo',
					'nombre_tabla' => 'Archivos',
					'llave_primaria' => $this->_uploadFileModel->getArchivoById($infoArchivo['NombreArchivo'])['ArchivoId'],
					'valores_anteriores' => json_encode([]),
					'valores_nuevos' => json_encode($infoArchivo),
					'ip_origen' => $_SERVER['REMOTE_ADDR'],
					'aplicacion_origen' => 'UdLosesSubjects',
					'comentario' => 'Subida de archivo'
				]);
				/** Generar archivo de errores */
				if (!empty($resultadoErrores)) {
					$this->_uploadFileModel->insertAuditoriaEventos([
						'usuario_id' => $_SESSION['UsuarioId'],
						'usuario_nombre' => $_SESSION['Usuario'],
						'tipo_evento' => 'Generación de archivo de errores',
						'nombre_tabla' => 'Archivos',
						'llave_primaria' => $this->_uploadFileModel->getArchivoById($infoArchivo['NombreArchivo'])['ArchivoId'],
						'valores_anteriores' => json_encode([]),
						'valores_nuevos' => json_encode($infoArchivo),
						'ip_origen' => $_SERVER['REMOTE_ADDR'],
						'aplicacion_origen' => 'UdLosesSubjects',
						'comentario' => 'Generación de archivo de errores'
					]);
					// Nombre del archivo CSV
					$archivoErrores = 'errores_lectura.csv';
				
					// Limpiamos cualquier salida previa para evitar errores de encabezados
					if (ob_get_length()) {
						ob_end_clean();
					}
				
					// Forzamos la descarga del CSV
					header('Content-Type: text/csv; charset=utf-8');
					header('Content-Disposition: attachment; filename="' . basename($archivoErrores) . '"');
				
					// Abrimos salida directa al navegador
					$salida = fopen('php://output', 'w');
				
					// Escribimos encabezado (opcional)
					fputcsv($salida, ['Error']);
				
					// Escribimos los errores
					foreach ($resultadoErrores as $error) {
						if (is_array($error)) {
							fputcsv($salida, [$error['message'] ?? json_encode($error, JSON_UNESCAPED_UNICODE)]);
						} else {
							fputcsv($salida, [(string)$error]);
						}
					}
				
					fclose($salida);
					exit;
				}
			}
		}
	}
	


	/* DETECTAR DELIMITADOR */
	private function detectarDelimitador($filepath) {
		$delimitadores = [",", ";", "\t"]; // coma, punto y coma, tabulador
		$handle = fopen($filepath, 'r');
		$linea = fgets($handle);
		fclose($handle);
	
		$maxCampos = 0;
		$mejorDelimitador = ",";
	
		foreach ($delimitadores as $delim) {
			$campos = str_getcsv($linea, $delim);
			if (count($campos) > $maxCampos) {
				$maxCampos = count($campos);
				$mejorDelimitador = $delim;
			}
		}
	
		return $mejorDelimitador;
	}

	/* SEPARAR PROGRAMA CODIGO */
	private function separarProgramaCodigo($codigo){
		$programa = explode("-", $codigo);
		return $programa;	
	}

	/* SEPARAR ESPACIO ACADEMICO */
	private function separarEspacioAcademicodeCodigo($espacioAcademico) {
		$espacioAcademico = trim($espacioAcademico);
		$espacioAcademico = explode("-", $espacioAcademico);
		return $espacioAcademico;	
	}

	/* NORMALIZAR NOTA */
	private function normalizarNota($valor) {
		$valor = trim($valor);
		if (!is_numeric($valor)) return -1;
	
		$nota = floatval($valor);
		// Si la nota está entre 0-9, convertir a 0.0-0.9
		// Si la nota es >= 10, dividir entre 10 (10->1.0, 20->2.0, 30->3.0, etc.)
		return ($nota >= 10) ? $nota / 10 : $nota / 10;
	}

	/* REDIRECCIONAR CON ALERTA */
	private function redirectAlert($msg, $type) {
		header("Location: index.php?msg=" . urlencode($msg) . "&type=$type");
		exit;
	}

	/* SEPARAR LINEA POR COMA */
	private function separaLineaPorComa($linea){
		$linea = explode(",", $linea);
		return $linea;	
	}

	/* ELIMINAR COMILLAS DOBLES */
	private function eliminarComillasDobles($linea){
		$linea = str_replace("\"", "", $linea);
		return $linea;	 
	}
}   