// #!if browser_target == 'chromium_mv3'
import XMLHttpRequest from 'sw-xhr';
// #!endif

import actionApi from './common/actionApi.js';
import {cleanUpOptPermissions} from './common/options/optionsPermissions.js';
import {cleanUpOptions, disableItemsWithMissingPermissions} from './common/options/optionsUtils.js';
import KillSwitchMechanism from './killSwitch/index.js';
import {handleBgOptionChange, handleBgOptionsOnStart} from './options/bgHandler.js';
import UpdateNotifier from './updateNotifier/index.js';

// #!if browser_target == 'chromium_mv3'
// XMLHttpRequest is not present in service workers (MV3) and is required by the
// grpc-web package. Importing a shim to work around this.
// https://github.com/grpc/grpc-web/issues/1134
self.XMLHttpRequest = XMLHttpRequest;
// #!endif

// Returns whether the script is being ran when the extension starts up. It does
// so on a best-effort-basis.
function isExtensionStartup() {
  // If chrome.storage.session isn't implemented in this version of Chrome, we
  // don't know whether it's the extension startup.
  if (!chrome.storage.session) return Promise.resolve(true);

  return new Promise(resolve => {
    return chrome.storage.session.get('hasAlreadyStarted', v => {
      resolve(v.hasAlreadyStarted !== true);
    });
  });
}

// Sets that the extension has already started up
function setHasAlreadyStarted() {
  if (!chrome.storage.session) return;
  chrome.storage.session.set({
    hasAlreadyStarted: true,
  });
}

actionApi.onClicked.addListener(() => {
  chrome.runtime.openOptionsPage();
});

const killSwitchMechanism = new KillSwitchMechanism();

chrome.alarms.get('updateKillSwitchStatus', alarm => {
  if (!alarm)
    chrome.alarms.create('updateKillSwitchStatus', {
      periodInMinutes: PRODUCTION ? 30 : 1,
    });
});

chrome.alarms.onAlarm.addListener(alarm => {
  if (alarm.name === 'updateKillSwitchStatus')
    killSwitchMechanism.updateKillSwitchStatus();
});

// When the profile is first started, update the kill switch status.
chrome.runtime.onStartup.addListener(() => {
  killSwitchMechanism.updateKillSwitchStatus();
});

// When the extension is first installed or gets updated, set new options to
// their default value, update the kill switch status and prompt the user to
// refresh the Community Console page.
chrome.runtime.onInstalled.addListener(details => {
  if (details.reason == 'install' || details.reason == 'update') {
    chrome.storage.sync.get(null, options => {
      cleanUpOptions(options, false);
    });

    killSwitchMechanism.updateKillSwitchStatus();

    const updateNotifier = new UpdateNotifier();
    updateNotifier.notify(details.reason);
  }
});

// Clean up optional permissions and check that none are missing for enabled
// features, and also handle background option changes as soon as the extension
// starts and when the options change.
chrome.storage.onChanged.addListener((changes, areaName) => {
  if (areaName !== 'sync') return;
  cleanUpOptPermissions();

  for (let [key] of Object.entries(changes)) {
    handleBgOptionChange(key);
  }
});

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (sender.id !== chrome.runtime.id)
    return console.warn(
        'An unknown sender (' + sender.id +
            ') sent a message to the extension: ',
        msg);

  console.assert(msg.message);
  switch (msg.message) {
    case 'runDisableItemsWithMissingPermissions':
      console.assert(
          msg.options?.items && msg.options?.permissionChecksFeatures);
      disableItemsWithMissingPermissions(
          msg.options?.items, msg.options?.permissionChecksFeatures)
          .then(items => sendResponse({status: 'resolved', items}))
          .catch(error => sendResponse({status: 'rejected', error}));
      break;

    case 'openWorkflowsManager':
      chrome.tabs.create({
        url: chrome.runtime.getURL('options/workflows.html'),
      });
      break;

    default:
      console.warn('Unknown message "' + msg.message + '".');
  }
});

// This should only run once when the extension starts up.
isExtensionStartup().then(isStartup => {
  if (isStartup) {
    cleanUpOptPermissions();
    handleBgOptionsOnStart();
    setHasAlreadyStarted();
  }
});
