function isEmpty(obj) {
  return Object.keys(obj).length === 0;
}

const defaultOptions = {
  'list': true,
  'thread': true,
  'threadall': false,
  'fixedtoolbar': false,
  'redirect': false,
  'history': false,
  'loaddrafts': false,
  'batchduplicate': false,
  'escalatethreads': false,
  'movethreads': false,
  'increasecontrast': false,
  'stickysidebarheaders': false,
};

const deprecatedOptions = [
  'escalatethreads',
  'movethreads',
  'batchduplicate',
];

var savedSuccessfullyTimeout = null;

function cleanUpOptions(options) {
  var ok = true;
  for (const [opt, value] of Object.entries(defaultOptions)) {
    if (!opt in options) {
      ok = false;
      options[opt] = value;
    }
  }

  if (!ok) {
    chrome.storage.sync.set(options);
  }

  return options;
}

function save() {
  var options = defaultOptions;

  Object.keys(options).forEach(function(opt) {
    if (deprecatedOptions.includes(opt)) return;
    options[opt] = document.querySelector('#' + opt).checked || false;
  });

  chrome.storage.sync.set(options, function() {
    window.close();

    // In browsers like Firefox window.close is not supported:
    if (savedSuccessfullyTimeout !== null)
      window.clearTimeout(savedSuccessfullyTimeout);

    document.getElementById('save-indicator').innerText =
        '✓ ' + chrome.i18n.getMessage('options_saved');
    savedSuccessfullyTimeout = window.setTimeout(_ => {
      document.getElementById('save-indicator').innerText = '';
    }, 3699);
  });
}

function i18n() {
  document.querySelectorAll('[data-i18n]')
      .forEach(
          el => el.innerHTML = chrome.i18n.getMessage(
              'options_' + el.getAttribute('data-i18n')));
}

function thread() {
  if (document.querySelector('#thread').checked &&
      document.querySelector('#threadall').checked) {
    document.querySelector('#' + (this.id == 'thread' ? 'threadall' : 'thread'))
        .checked = false;
  }
}

window.addEventListener('load', function() {
  i18n();

  chrome.storage.sync.get(null, function(items) {
    items = cleanUpOptions(items);

    Object.keys(defaultOptions).forEach(function(opt) {
      if (items[opt] === true && !deprecatedOptions.includes(opt)) {
        document.querySelector('#' + opt).checked = true;
      }
    });

    ['thread', 'threadall'].forEach(
        el => document.querySelector('#' + el).addEventListener(
            'change', thread));
    document.querySelector('#save').addEventListener('click', save);
  });
});
