import actionApi from './common/actionApi';
import {isoLangs} from './common/consts';
import Options from './common/options';
import ExtSessionStorage from './common/sessionStorage';

interface ContextMenuLangs {
  [id: string]: string;
}

function getTranslationUrl(lang: string, text: string): string {
  const params = new URLSearchParams({
    sl: 'auto',
    tl: lang,
    text: text,
    op: 'translate',
  });
  return 'https://translate.google.com/?' + params.toString();
}

function translationClick(info: chrome.contextMenus.OnClickData): void {
  const optionsPromise = Options.getOptions();
  const ssPromise =
      ExtSessionStorage.get(['contextMenuLangs', 'translatorTab']);
  Promise.all([optionsPromise, ssPromise])
      .then(returnValues => {
        const [options, sessionStorageItems] = returnValues;
        const url = getTranslationUrl(
            sessionStorageItems.contextMenuLangs?.[info.menuItemId],
            info.selectionText);
        const settings_tab = {url};
        if (sessionStorageItems.translatorTab && options.uniqueTab == 'yep') {
          chrome.tabs.update(
              sessionStorageItems.translatorTab, settings_tab, tab => {
                chrome.tabs.highlight(
                    {
                      windowId: tab.windowId,
                      tabs: tab.index,
                    },
                    () => {
                      chrome.windows.update(tab.windowId, {
                        focused: true,
                      });
                    });
              });
        } else if (options.uniqueTab == 'popup') {
          chrome.windows.create({
            type: 'popup',
            url,
            width: 1000,
            height: 382,
          });
        } else {
          chrome.tabs.create(settings_tab, function(tab) {
            ExtSessionStorage.set({translatorTab: tab.id});
          });
        }
      })
      .catch(err => {
        console.error('Error handling translation click', err);
      });
}

function createMenus(options: Options): Promise<void> {
  chrome.contextMenus.removeAll();

  const contextMenuLangs: ContextMenuLangs = {};
  const langs = options.targetLangs;
  const isSingleEntry = Object.values(langs).length == 1;

  let parentEl;
  if (!isSingleEntry) {
    parentEl = chrome.contextMenus.create({
      'id': 'parent',
      'title': chrome.i18n.getMessage('contextmenu_title'),
      'contexts': ['selection']
    });
  }

  for (const language of Object.values(langs)) {
    const languageDetails = isoLangs[language];
    if (languageDetails === undefined) {
      console.error(language + ' doesn\'t exist!');
      continue;
    }
    let title;
    if (isSingleEntry) {
      title =
          chrome.i18n.getMessage('contextmenu_title2', languageDetails.name);
    } else {
      title = languageDetails.name + ' (' + languageDetails.nativeName + ')';
    }
    const id = chrome.contextMenus.create({
      'id': 'tr_language_' + language,
      'title': title,
      'parentId': parentEl,
      'contexts': ['selection']
    });
    contextMenuLangs[id] = language;
  }

  if (!isSingleEntry) {
    chrome.contextMenus.create({
      'id': 'tr_separator',
      'type': 'separator',
      'parentId': parentEl,
      'contexts': ['selection']
    });
    chrome.contextMenus.create({
      'id': 'tr_options',
      'title': chrome.i18n.getMessage('contextmenu_edit'),
      'parentId': parentEl,
      'contexts': ['selection']
    });
  }

  return ExtSessionStorage.set({contextMenuLangs});
}

chrome.storage.onChanged.addListener((changes, areaName) => {
  if (areaName == 'sync') {
    Options.getOptions(/* readOnly = */ false)
        .then(options => {
          return createMenus(options);
        })
        .catch(err => {
          console.error(
              'Error setting up the extension after a change ' +
                  'in the storage area.',
              err);
        });
  }
});

Options.getOptions(/* readOnly = */ false)
    .then(options => {
      if (options.isFirstRun) {
        chrome.notifications.create('install', {
          type: 'basic',
          iconUrl: 'icons/translate-128.png',
          title: chrome.i18n.getMessage('notification_install_title'),
          message: chrome.i18n.getMessage('notification_install_message'),
          isClickable: true
        });
      }

      return createMenus(options);
    })
    .catch(err => {
      console.error('Error initializing the extension.', err);
    });

chrome.notifications.onClicked.addListener(notification_id => {
  switch (notification_id) {
    case 'install':
      chrome.runtime.openOptionsPage();
      break;
  }
  chrome.notifications.clear(notification_id);
});

chrome.contextMenus.onClicked.addListener(info => {
  if (info.menuItemId == 'tr_options') {
    chrome.runtime.openOptionsPage();
  } else {
    translationClick(info);
  }
});

chrome.tabs.onRemoved.addListener(tabId => {
  ExtSessionStorage.get('translatorTab')
      .then(items => {
        if (tabId == items.translatorTab) {
          ExtSessionStorage.set({translatorTab: null});
        }
      })
      .catch(err => console.log(err));
});

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

chrome.runtime.onMessage.addListener(request => {
  switch (request.action) {
    case 'clearTranslatorTab':
      ExtSessionStorage.set({translatorTab: null});
      break;

    default:
      console.error(
          `Unknown action "${request.action}" received as a message.`);
  }

  return undefined;
});
