import {CCApi} from '../common/api.js';
import {parseUrl, recursiveParentElement} from '../common/commonUtils.js';
import {getAuthUser} from '../common/communityConsoleUtils.js';

// Source:
// https://stackoverflow.com/questions/33063774/communication-from-an-injected-script-to-the-content-script-with-a-response
var contentScriptRequest = (function() {
  var requestId = 0;
  var prefix = 'TWPT-batchlock-generic';

  function sendRequest(data) {
    var id = requestId++;

    return new Promise(function(resolve, reject) {
      var listener = function(evt) {
        if (evt.source === window && evt.data && evt.data.prefix === prefix &&
            evt.data.requestId == id) {
          // Deregister self
          window.removeEventListener('message', listener);
          resolve(evt.data.data);
        }
      };

      window.addEventListener('message', listener);

      var payload = {data, id, prefix};

      window.dispatchEvent(
          new CustomEvent('TWPT_sendRequest', {detail: payload}));
    });
  }

  return {sendRequest: sendRequest};
})();

function enableEndButtons() {
  var buttons = document.querySelectorAll(
      '.pane[pane-id="default-1"] footer[data-footer-id="1"] material-button');
  buttons.forEach(btn => {
    btn.classList.remove('is-disabled');
  });
}

function addLogEntry(success, action, url, threadId, errDetails = null) {
  var p1 = contentScriptRequest.sendRequest({
    action: 'geti18nMessage',
    msg: 'inject_lockdialog_log_entry_beginning',
    placeholders: [threadId],
  });

  var p2 = contentScriptRequest.sendRequest({
    action: 'geti18nMessage',
    msg: 'inject_lockdialog_log_entry_' + (success ? 'success' : 'error') +
        '_' + action,
    placeholders: [errDetails],
  });

  Promise.all([p1, p2]).then(strings => {
    var log = document.getElementById('TWPT-lock-log');
    var logEntry = document.createElement('p');
    logEntry.classList.add(
        'TWPT-log-entry', 'TWPT-log-entry--' + (success ? 'success' : 'error'));

    var a = document.createElement('a');
    a.href = url;
    a.target = '_blank';
    a.textContent = strings[0];

    var end = document.createTextNode(': ' + strings[1]);

    logEntry.append(a, end);
    log.append(logEntry);
  });
}

function lockThreads(action) {
  var modal = document.querySelector('.pane[pane-id="default-1"]');
  modal.querySelector('footer[data-footer-id="0"]').classList.add('is-hidden');
  modal.querySelector('footer[data-footer-id="1"]')
      .classList.remove('is-hidden');

  var checkboxes = document.querySelectorAll(
      '.thread-group material-checkbox[aria-checked="true"]');

  var p = document.createElement('p');
  p.style.textAlign = 'center';

  var progress = document.createElement('progress');
  progress.max = checkboxes.length;
  progress.value = 0;

  p.append(progress);

  var log = document.createElement('div');
  log.id = 'TWPT-lock-log';
  log.classList.add('TWPT-log');

  modal.querySelector('main').textContent = '';
  modal.querySelector('main').append(p, log);

  var authuser = getAuthUser();

  checkboxes.forEach(checkbox => {
    var url = recursiveParentElement(checkbox, 'EC-THREAD-SUMMARY')
                  .querySelector('a.header-content')
                  .href;
    var thread = parseUrl(url);
    if (thread === false) {
      console.error('Fatal error: thread URL ' + url + ' could not be parsed.');
      return;
    }
    CCApi(
        'SetThreadAttribute', {
          1: thread.forum,
          2: thread.thread,
          3: (action == 'lock' ? 1 : 2),
        },
        /* authenticated = */ true, authuser)
        .then(() => {
          addLogEntry(true, action, url, thread.thread);
        })
        .catch(err => {
          console.error(
              'An error occurred while locking thread ' + url + ': ' + err);
          addLogEntry(false, action, url, thread.thread, err);
        })
        .then(() => {
          progress.value = parseInt(progress.value) + 1;
          if (progress.value == progress.getAttribute('max'))
            enableEndButtons();
        });
  });
}

window.addEventListener('message', e => {
  if (e.source === window && e.data && e.data.prefix === 'TWPT-batchlock' &&
      e.data.action) {
    switch (e.data.action) {
      case 'lock':
      case 'unlock':
        console.debug('Performing action ' + e.data.action);
        lockThreads(e.data.action);
        break;

      default:
        console.error(
            'Action \'' + e.data.action +
            '\' unknown to TWPT-batchlock receiver.');
    }
  }
});
