/* global , Whisper, storage, ConversationController */
/* 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 = {
    getAll() {
      try {
        this.load();
      } catch (e) {
        window.log.warn(e);
      }
      return blockedNumbers;
    },
    reset() {
      blockedNumbers.reset([]);
    },
    load() {
      window.log.info('BlockedNumberController: starting initial fetch');

      if (blockedNumbers.length) {
        throw new Error('BlockedNumberController: Already loaded!');
      }

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

      // Add the numbers to the collection
      const numbers = storage.getBlockedNumbers();
      blockedNumbers.add(
        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.getNumber(number))
        return;

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

      // Make sure we don't add duplicates
      const model = blockedNumbers.getNumber(number);
      if (model) {
        blockedNumbers.remove(model);
      }
    },
    unblockAll() {
      const all = blockedNumbers.models;
      all.forEach(number => {
        storage.removeBlockedNumber(number);
        blockedNumbers.remove(number);
      });
    },
    isBlocked(number) {
      return storage.isBlocked(number);
    },
  };
})();