/* global , Whisper, storage */
/* global textsecure: false */

/* eslint-disable more/no-then */

// eslint-disable-next-line func-names
(function() {
  'use strict';

  window.Whisper = window.Whisper || {};

  const blockedNumbers = new Whisper.BlockedNumberCollection();
  window.getBlockedNumbers = () => blockedNumbers;

  window.BlockedNumberController = {
    reset() {
      this.unblockAll();
      blockedNumbers.reset([]);
    },
    refresh() {
      window.log.info('BlockedNumberController: starting initial fetch');

      if (!storage) {
        throw new Error(
          'BlockedNumberController: Could not load blocked numbers'
        );
      }

      // Add the numbers to the collection
      const numbers = storage.getBlockedNumbers();
      blockedNumbers.reset(numbers.map(number => ({ number })));
    },
    block(number) {
      const ourNumber = textsecure.storage.user.getNumber();

      // Make sure we don't block ourselves
      if (ourNumber === number) {
        window.log.info('BlockedNumberController: Cannot block yourself!');
        return;
      }

      storage.addBlockedNumber(number);

      // Make sure we don't add duplicates
      if (blockedNumbers.getModel(number)) {
        return;
      }

      blockedNumbers.add({ number });
    },
    unblock(number) {
      storage.removeBlockedNumber(number);

      // Remove the model from our collection
      const model = blockedNumbers.getModel(number);
      if (model) {
        blockedNumbers.remove(model);
      }
    },
    unblockAll() {
      const numbers = blockedNumbers.map(m => m.get('number'));
      numbers.forEach(n => this.unblock(n));
    },
    isBlocked(number) {
      return storage.isBlocked(number);
    },
  };
})();