const { Cookie } = require("./Cookie");
const { SettingsManager } = require("./SettingsManager");
const { TokenManager } = require("./TokenManager");

let settingsManager = new SettingsManager();
let tokenManager = new TokenManager();

if (typeof browser == "undefined") {
  var browser = chrome;
}
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (!request.hasOwnProperty("type")) return;
  if (request.type == "settings_set" && request.hasOwnProperty("settings")) {
    settingsManager.set(request.settings).then(() => {
      sendResponse({ status: "ok" });
    });
    return true;
  }
  if (request.type == "settings_remove" && request.hasOwnProperty("setting_key")) {
    settingsManager.remove(request.setting_key).then(() => {
      sendResponse({ status: "ok" });
    });
    return true;
  }
});

/**
 * When the user enables/disables storage of settings within this
 * web-extension we'll grab all existing settings and put it into
 * the web-extension or vise versa
 */
browser.storage.onChanged.addListener(async (changes, areaName) => {
  settingsManager.handleStorageChange(changes);
  tokenManager.handleStorageChange(changes);
});


/**
 * This extension offers two main features:
 * 1. Permanently storing all user settings especially when cookies are being regulary deleted
 * 2. Use homomorphic encryption to anonymize the usage of a MetaGer Key
 * 
 * Those features are implemented using the following listeners which are able
 * to modify the request/response headers from MetaGer.
 */
// Handle Request Headers
browser.webRequest.onBeforeSendHeaders.addListener(
  async (details) => {
    let headers = await tokenManager.handleRequestHeaders(details);
    return { requestHeaders: headers };
  },
  {
    urls: ["https://metager.org/*", "https://metager.de/*"],
  },
  ["requestHeaders"]
);
// Handle Response Headers
browser.webRequest.onHeadersReceived.addListener(
  async (details) => {
    details.responseHeaders = await settingsManager.handleResponseHeaders(
      details
    );

    let headers = await tokenManager.handleResponseHeaders(details);
    return { responseHeaders: headers };
  },
  {
    urls: ["https://metager.org/*", "https://metager.de/*"],
  },
  ["responseHeaders"]
);

/**
 * Open settings page when user installs the addon
 * as additional permissions might be required to use
 * all features of this extension.
 * Opening the page on update is not required if the user comes from
 * a version that already has a settings page included
 */

browser.runtime.onInstalled.addListener(details => {
  let open_settings_page = false;

  if (details.reason == "update" && details.previousVersion == "0.0.1.3") {
    open_settings_page = true;
  }

  if (details.reason == "install") {
    open_settings_page = true;
  }

  if (details.temporary == true) {
    open_settings_page = false;
  }

  if (open_settings_page) {
    browser.runtime.openOptionsPage();
  }
})