Source: controllers/c_inscribirAlumnosTO.js

/**
 * @author Mauricio Peña Domínguez
 */

import { ModalConfirmacion } from "/InscripcionesEVG/assets/js/utils/modalConfirmacion.js";
import M_inscribirAlumnosTO from "/InscripcionesEVG/assets/js/models/m_inscribirAlumnosTO.js";
import { ErrorDialog } from "/InscripcionesEVG/assets/js/utils/errorHandler.js";
import { Loader } from "/InscripcionesEVG/assets/js/utils/loader.js";

const boton = document.getElementById("inscripcionAlumnos");

const errorDialog = new ErrorDialog();

/**
 * Evento que se dispara al hacer clic en el botón de inscripción de alumnos.
 * Muestra un modal de confirmación antes de proceder con la inscripción.
 * @param {MouseEvent} e - Evento de clic.
 */
boton.addEventListener("click", (e) => {
	e.preventDefault();

	const resultado = obtenerInscripcion();
	if (!resultado) return;

	new ModalConfirmacion({
		titulo: "Confirme operación",
		mensaje: "¿Estás seguro de inscribir a los alumnos?",
		/**
		 * Función que se ejecuta al aceptar la confirmación.
		 * Realiza la inscripción llamando al modelo y muestra mensajes según el resultado.
		 */
		onAceptar: async () => {
			const loader = new Loader("Cargando...");
			const obj = new M_inscribirAlumnosTO();
			const data = await obj.inscribirAlumnos(resultado);

			if (data.success) {
				loader.ocultar();
				errorDialog.show(data.success, true);
			} else {
				loader.ocultar();
				errorDialog.show("Esta mal " + data.error);
				return;
			}
		},
		/**
		 * Función que se ejecuta al cancelar la confirmación.
		 */
		onCancelar: () => {
			console.log("cancelar");
		},
	});
});

/**
 * Obtiene y valida la información de inscripción de alumnos de la UI.
 * Valida que las inscripciones tipo 'C' tengan al menos 4 alumnos.
 * @returns {string|null} JSON con la inscripción si es válida, o null si hay errores.
 */
function obtenerInscripcion() {
	const categorias = ["camposPruebasMasculina", "camposPruebasFemenina"];
	let resultado = {
		M: { P: {}, C: {} },
		F: { P: {}, C: {} },
	};

	let hayErrorEnTipoC = false;

	categorias.forEach((categoriaId) => {
		const genero = categoriaId.includes("Masculina") ? "M" : "F";
		const campos = document.querySelectorAll(`#${categoriaId} .campo`);

		campos.forEach((campo) => {
			const pruebaId = campo.querySelector("label").id;
			const selects = campo.querySelectorAll("select");

			selects.forEach((select) => {
				const tipo = select.name.toUpperCase(); // "P" o "C"
				const alumnoId = select.value;

				if (alumnoId !== "" && (tipo === "P" || tipo === "C")) {
					if (!resultado[genero][tipo][pruebaId]) {
						resultado[genero][tipo][pruebaId] = [];
					}
					resultado[genero][tipo][pruebaId].push(Number(alumnoId));
				}
			});
		});
	});

	// Validar que las pruebas tipo C tengan exactamente 4 alumnos inscritos
	for (const genero of ["M", "F"]) {
		const pruebasC = resultado[genero]["C"];
		for (const idPrueba in pruebasC) {
			const inscripciones = pruebasC[idPrueba];
			if (inscripciones.length !== 4) {
				hayErrorEnTipoC = true;
				break;
			}
		}
		if (hayErrorEnTipoC) break;
	}

	if (hayErrorEnTipoC) {
		errorDialog.show("4*100 son mínimo 4 participantes");
		return null;
	}

	// Verifica que haya al menos una inscripción
	const hayInscripciones = Object.values(resultado).some((genero) =>
		Object.values(genero).some((tipo) =>
			Object.values(tipo).some((alumnos) => alumnos.length > 0),
		),
	);

	if (!hayInscripciones) {
		errorDialog.show("Inscripción vacía");
		return null;
	}

	// Devuelve la inscripción en formato JSON
	resultado = JSON.stringify(resultado, null, 2);
	return resultado;
}