Source: controllers/c_obtenerPruebas.js

import M_obtenerPruebas from "/InscripcionesEVG/assets/js/models/m_obtenerPruebas.js";
import { Loader } from "/InscripcionesEVG/assets/js/utils/loader.js";
import {
	obtenerExceldePruebas,
	obtenerZipDePruebas,
} from "/InscripcionesEVG/assets/js/controllers/c_obtenerAlumnos.js";

/**
 * Controlador que obtiene las pruebas desde el modelo y las renderiza en la vista.
 * Agrupa las pruebas masculinas y busca su equivalente femenina por nombre.
 * Crea elementos HTML dinámicamente y añade eventos a botones de edición y borrado.
 * También añade un botón para insertar nuevas pruebas.
 *
 * @async
 * @function renderizarPruebas
 * @returns {Promise<void>}
 * @author Mauricio Peña
 */
async function renderizarPruebas() {
	try {
		const modelo = new M_obtenerPruebas();
		const pruebas = await modelo.obtenerPruebas();
		const grid = document.querySelector("section.grid");
		grid.innerHTML = "";

		// Filtrar las pruebas por categoría M y agrupar por nombre
		const pruebasFiltradas = pruebas.filter((p) => p.categoria === "M");

		pruebasFiltradas.forEach((pruebaM) => {
			const pruebaF = pruebas.find(
				(p) => p.nombre === pruebaM.nombre && p.categoria === "F",
			);

			const div = document.createElement("div");
			div.classList.add("prueba");

			div.innerHTML = `
  <h3>${pruebaM.nombre}</h3>
  <p><strong>Fecha:</strong> ${pruebaM.fecha ? formatearFecha(pruebaM.fecha) : "Sin fecha"}</p>
  <p><strong>Hora:</strong> ${pruebaM.hora ? pruebaM.hora.slice(0, 5) : "Sin hora"}</p>
  <p><strong>Descripción:</strong> ${pruebaM.bases}</p>
  <div class="acciones">
    ${pruebaM.tipo !== "C" ? '<button class="btn-editar">✏️</button>' : ""}
    ${pruebaM.tipo !== "C" ? '<button class="btn-borrar">🗑️</button>' : ""}
  </div>
`;

			if (pruebaM.tipo !== "C") {
				div
					.querySelector(".btn-borrar")
					.addEventListener("click", () =>
						abrirModal("borrar", pruebaM.idPrueba, pruebaM, pruebaF?.idPrueba),
					);

				div
					.querySelector(".btn-editar")
					.addEventListener("click", () =>
						abrirModal("editar", pruebaM.idPrueba, pruebaM, pruebaF?.idPrueba),
					);
			}

			grid.appendChild(div);
		});
		// Botón "Añadir prueba"
		const addPruebaBtn = document.createElement("button");
		addPruebaBtn.classList.add("prueba");
		addPruebaBtn.id = "prueba-unica"; // Aquí el id
		addPruebaBtn.type = "button";
		addPruebaBtn.innerHTML = `
    <h3>AÑADIR PRUEBA</h3>
    <div class="acciones">
      <span class="btn-mas">➕</span>
    </div>
    <div style="visibility:hidden; height: 100px;">&nbsp;</div>
  `;
		addPruebaBtn.onclick = () => abrirModal("añadir");
		grid.appendChild(addPruebaBtn);
	} catch (error) {
		console.error("Error al renderizar las pruebas:", error);
	}
}

/**
 * Crea campos dinámicos para cada prueba, separados por categoría,
 * y tantos select como maxParticipantes tenga la prueba.
 *
 * @async
 * @function crearCamposPorPrueba
 * @returns {Promise<void>}
 * @author Mauricio Peña
 */
async function crearCamposPorPrueba() {
	try {
		const modelo = new M_obtenerPruebas();
		const pruebas = await modelo.obtenerPruebas();

		const contenedorMasculino = document.getElementById(
			"camposPruebasMasculina",
		);
		const contenedorFemenino = document.getElementById("camposPruebasFemenina");

		if (!contenedorMasculino || !contenedorFemenino) {
			console.warn(
				"No se encontraron los contenedores para pruebas por categoría.",
			);
			return;
		}

		// Limpiamos el contenido anterior
		contenedorMasculino.innerHTML = "";
		contenedorFemenino.innerHTML = "";

		pruebas.forEach((prueba) => {
			const divCampo = document.createElement("div");
			divCampo.classList.add("campo");

			const label = document.createElement("label");
			label.textContent = prueba.nombre;
			label.id = prueba.idPrueba;
			divCampo.appendChild(label);

			// Crear los selects según la cantidad máxima de participantes
			for (let i = 1; i <= prueba.maxParticipantes; i++) {
				const select = document.createElement("select");
				select.name = `${prueba.tipo}`;
				select.setAttribute("data-idprueba", prueba.idPrueba);
				select.setAttribute("data-index", i);
				select.innerHTML = `<option value="">Selecciona</option>`;
				divCampo.appendChild(select);
			}

			// Insertar en la categoría correspondiente
			if (prueba.categoria === "M") {
				contenedorMasculino.appendChild(divCampo);
			} else if (prueba.categoria === "F") {
				contenedorFemenino.appendChild(divCampo);
			}
		});
	} catch (error) {
		console.error("Error al crear campos por prueba:", error);
	}
}

/**
 * Carga las pruebas y permite descargar Excel individual y un ZIP con todos.
 *
 * @async
 * @function cargarPruebasConDescarga
 * @returns {Promise<void>}
 * @author Mauricio Peña
 */
async function cargarPruebasConDescarga() {
	try {
		const modelo = new M_obtenerPruebas();
		const pruebas = await modelo.obtenerPruebas();
		const pruebasMasculinas = pruebas.filter((p) => p.categoria === "M");

		const tbody = document.querySelector(".tabla-pruebas tbody");
		tbody.innerHTML = "";

		// Almacenar pares de IDs (M y F)
		const paresDePruebas = [];

		for (const pruebaM of pruebasMasculinas) {
			const pruebaF = pruebas.find(
				(p) => p.nombre === pruebaM.nombre && p.categoria === "F",
			);

			const tr = document.createElement("tr");

			// Columna: Nombre
			const tdNombre = document.createElement("td");
			tdNombre.textContent = pruebaM.nombre;
			tr.appendChild(tdNombre);

			// Columna: Botón de descarga individual
			const tdDescargar = document.createElement("td");
			const btnDescargar = document.createElement("button");
			btnDescargar.classList.add("btn-descargar-excel");

			const textoExcel = document.createElement("span");
			textoExcel.textContent = "Descargar ";
			textoExcel.style.marginRight = "6px";
			textoExcel.style.color = "white";

			const imgExcel = document.createElement("img");
			imgExcel.src = "/InscripcionesEVG/assets/img/excel.png";
			imgExcel.alt = "Descargar Excel";
			imgExcel.style.width = "25px";
			imgExcel.style.height = "25px";

			btnDescargar.appendChild(textoExcel);
			btnDescargar.appendChild(imgExcel);

			const inputM = pruebaM.idPrueba;
			const inputF = pruebaF ? pruebaF.idPrueba : "";

			// Guardar en lista para el botón global
			paresDePruebas.push({ inputM, inputF });

			btnDescargar.addEventListener("click", async () => {
				const loader = new Loader("Generando excel...");
				try {
					await obtenerExceldePruebas(inputM, inputF);
				} catch (error) {
					console.error("Error al generar Excel:", error);
				} finally {
					loader.ocultar();
				}
			});

			tdDescargar.appendChild(btnDescargar);
			tr.appendChild(tdDescargar);
			tbody.appendChild(tr);
		}

		// Botón "Descargar todos"
		let contenedor = document.querySelector(".descargar-todos-container");
		if (!contenedor) {
			contenedor = document.createElement("div");
			contenedor.classList.add("descargar-todos-container");
			document.querySelector(".tabla-pruebas").after(contenedor);
		} else {
			contenedor.innerHTML = "";
		}

		const btnDescargarTodos = document.createElement("button");
		btnDescargarTodos.innerHTML = "Descargar carpeta comprimida <i>.zip</i>";
		btnDescargarTodos.classList.add("btn-descargar-todos");

		btnDescargarTodos.addEventListener("click", async () => {
			const loader = new Loader("Generando zip...");
			try {
				await obtenerZipDePruebas(paresDePruebas);
			} catch (error) {
				console.error("Error al generar todos los Excel:", error);
			} finally {
				loader.ocultar();
			}
		});

		contenedor.appendChild(btnDescargarTodos);
	} catch (error) {
		console.error("Error al cargar las pruebas con descarga:", error);
	}
}

/**
 * Formatea una fecha en formato 'YYYY-MM-DD' a 'DD/MM/YYYY'.
 *
 * @function formatearFecha
 * @param {string} fecha - La fecha en formato ISO (YYYY-MM-DD).
 * @returns {string} La fecha formateada como 'DD/MM/YYYY'.
 * @author Mauricio Peña
 */
function formatearFecha(fecha) {
	try {
		const [year, month, day] = fecha.split("-");
		return `${day}/${month}/${year}`;
	} catch (error) {
		console.error("Error al formatear la fecha:", error);
		return fecha;
	}
}

export { renderizarPruebas, crearCamposPorPrueba, cargarPruebasConDescarga };