"use strict";

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

// Configuración por defecto
const DEFAULT_SETTINGS = {
  url: "about",
  firstRun: true
};

// Inicializar storage con valores por defecto
browserAPI.runtime.onInstalled.addListener(async (details) => {
  if (details.reason === "install") {
    await browserAPI.storage.local.set(DEFAULT_SETTINGS);
    // Abrir la página "about" en la primera instalación
    openArchivePage("about");
  } else if (details.reason === "update") {
    console.log("Classic Add-ons Archive updated to version", browserAPI.runtime.getManifest().version);
  }
});

// Manejar clic en el botón de la barra de herramientas
browserAPI.browserAction.onClicked.addListener(() => {
  openArchivePage();
});

// Función para abrir la página del archivo
async function openArchivePage(page) {
  try {
    // Obtener la URL guardada o usar la página especificada
    const settings = await browserAPI.storage.local.get("url");
    const targetPage = page || settings.url || "about";
    
    // Construir la URL de la extensión
    const extensionUrl = browserAPI.runtime.getURL("content/ca-archive.html");
    const fullUrl = `${extensionUrl}#${targetPage}`;
    
    // Verificar si ya hay una pestaña abierta con el archivo
    const tabs = await browserAPI.tabs.query({});
    let foundTab = null;
    
    for (let tab of tabs) {
      if (tab.url && tab.url.startsWith(extensionUrl)) {
        foundTab = tab;
        break;
      }
    }
    
    if (foundTab) {
      // Si existe, activar la pestaña
      await browserAPI.tabs.update(foundTab.id, { active: true });
      await browserAPI.windows.update(foundTab.windowId, { focused: true });
      // Actualizar el hash si es necesario
      if (page) {
        await browserAPI.tabs.update(foundTab.id, { url: fullUrl });
      }
    } else {
      // Si no existe, crear nueva pestaña
      await browserAPI.tabs.create({ url: fullUrl });
    }
    
    // Si abrimos "about" en primera ejecución, cambiar a página principal para siguientes veces
    if (targetPage === "about") {
      await browserAPI.storage.local.set({ url: "list", firstRun: false });
    }
  } catch (error) {
    console.error("Error opening archive page:", error);
  }
}

// Interceptar peticiones para modificar headers cuando sea necesario
browserAPI.webRequest.onHeadersReceived.addListener(
  (details) => {
    // Modificar headers para archivos de addons.mozilla.org archivados
    const headers = details.responseHeaders || [];
    
    // Si es una descarga desde nuestro storage, manejar Content-Disposition
    if (details.url.includes("origin=caa")) {
      const newHeaders = headers.filter(h => h.name.toLowerCase() !== "content-disposition");
      
      if (details.url.includes("action=install")) {
        // No forzar descarga para instalación
        return { responseHeaders: newHeaders };
      } else if (details.url.includes("action=download")) {
        // Forzar descarga
        newHeaders.push({
          name: "Content-Disposition",
          value: "attachment"
        });
        return { responseHeaders: newHeaders };
      }
    }
    
    return {};
  },
  {
    urls: ["<all_urls>"]
  },
  ["blocking", "responseHeaders"]
);

// Bloquear ciertas peticiones de web.archive.org
browserAPI.webRequest.onBeforeRequest.addListener(
  (details) => {
    if (details.url.includes("web.archive.org")) {
      // Bloquear scripts y recursos específicos de AMO que no queremos cargar
      if (/\/web\/.+?\/(addons\.mozilla\.org\/.+?\/more|addons\.cdn\.mozilla\.net\/.+?\/loading-more\.gif|addons-amo\.cdn\.mozilla\.net\/amo-.+?\.js)/.test(details.url)) {
        return { cancel: true };
      }
    }
    return {};
  },
  {
    urls: ["*://web.archive.org/*"]
  },
  ["blocking"]
);

// Manejar comandos de teclado (si se configuran)
if (browserAPI.commands && browserAPI.commands.onCommand) {
  browserAPI.commands.onCommand.addListener((command) => {
    if (command === "open-archive") {
      openArchivePage();
    }
  });
}

// Escuchar mensajes desde content scripts
browserAPI.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action === "openPage") {
    openArchivePage(message.page);
    sendResponse({ success: true });
  } else if (message.action === "getSettings") {
    browserAPI.storage.local.get(null).then(settings => {
      sendResponse({ settings });
    });
    return true; // Mantener el canal abierto para respuesta asíncrona
  } else if (message.action === "saveSettings") {
    browserAPI.storage.local.set(message.settings).then(() => {
      sendResponse({ success: true });
    });
    return true;
  }
  
  return false;
});

console.log("Classic Add-ons Archive background script loaded");
