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 = [
  'list',
  '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);
  });
});
