"use strict";

// Compatibilidad con Chrome y Firefox
const browserAPI = typeof browser !== "undefined" ? browser : chrome;

(async function () {
	const dbname = "ca-archive-19030501.sqlite";

	// Cargar el módulo de base de datos
	// NOTA: Los scripts deben cargarse en el HTML antes de este script
	// o usar import dinámico
	
	// Inicializar la base de datos (ahora es asíncrono)
	const dbOpened = await DB.openDB(dbname, document);
	if (!dbOpened) {
		console.error("Failed to open database");
		return;
	}

	/*
		Rutas soportadas (usando hash):
		#addon/{slug|id}/versions[?page=[#ver]]
		#addon/{slug|id}/{eula|privacy|license/lid}
		#addon/{slug|id}
		#list[/category][?{tag|q}=][?sort=][?page=]
		#about
		#{search-query}
	*/

	// Función para manejar la navegación
	async function handleNavigation() {
		try {
			// Obtener la URL del hash
			let hash = window.location.hash.substring(1); // Remover el '#'
			if (!hash) {
				hash = "list"; // Por defecto mostrar listado
			}
			
			let params;
			const url = decodeURI(hash);
			
			if ((params = /^addon\/(.+?)\/versions\/?(\?page=(\d+)(#.+)?)?$/.exec(url)) !== null) {
				// Cargar dinámicamente el módulo de versiones si no está cargado
				if (typeof Versions === "undefined") {
					await loadScript("versions.js");
				}
				Versions.showPage(document, DB, params[1], params[3]);
			} else if ((params = /^addon\/(.+?)\/(eula|privacy|license\/(.+))$/.exec(url)) !== null) {
				if (typeof EPL === "undefined") {
					await loadScript("epl.js");
				}
				EPL.showPage(document, DB, params[1], params[2], params[3]);
			} else if ((params = /^addon\/(.+?)\/?$/.exec(url)) !== null) {
				if (typeof Addon === "undefined") {
					await loadScript("addon.js");
				}
				Addon.showPage(document, DB, params[1]);
			} else if ((params = /^list(\/([a-z-]+))?(\?tag=(.+?)|\?q=(.+?))?([\?|\&]sort=(\w+))?\&?(page=(\d+))?$/.exec(url)) !== null) {
				if (typeof List === "undefined") {
					await loadScript("list.js");
				}
				List.showPage(document, DB, params[2], params[4], params[5], params[7], params[9]);
			} else if (url === "" || url === "list") {
				if (typeof TCloud === "undefined") {
					await loadScript("tcloud.js");
				}
				TCloud.showPage(document, DB);
			} else if (url === "about") {
				if (typeof About === "undefined") {
					await loadScript("about.js");
				}
				About.showPage(document, DB);
			} else {
				// Búsqueda genérica
				if (typeof List === "undefined") {
					await loadScript("list.js");
				}
				List.showPage(document, DB, undefined, undefined, url, undefined, undefined);
			}
		} catch (e) {
			console.error("Navigation error:", e);
		}
	}

	// Función auxiliar para cargar scripts dinámicamente
	function loadScript(filename) {
		return new Promise((resolve, reject) => {
			const script = document.createElement("script");
			script.src = filename;
			script.onload = () => resolve();
			script.onerror = () => reject(new Error(`Failed to load script: ${filename}`));
			document.head.appendChild(script);
		});
	}

	// Manejar el cambio de hash
	window.addEventListener("hashchange", handleNavigation);

	// Inicializar la navegación inicial
	await handleNavigation();

	// Cerrar la base de datos cuando se cierre la página
	window.addEventListener("beforeunload", () => {
		DB.closeDB();
	});

})();
