/* global storage, _ */
/* global storage: false */

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

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

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

  const PROFILE_ID = 'profiles';

  storage.getProfile = number => {
    const profiles = storage.get(PROFILE_ID, {});
    return profiles[number] || null;
  }

  storage.saveProfile = async (number, profile) => {
    const profiles = storage.get(PROFILE_ID, {});
    const storedProfile = profiles[number];

    // Only store the profile if we have a different object
    if (storedProfile && _.isEqual(storedProfile, profile)) {
      return;
    }

    window.log.info('adding profile ', profile, 'for ', number);
    await storage.put(PROFILE_ID, {
      ...profiles,
      [number]: profile,
    });
  }

  storage.removeProfile = async number => {
    const profiles = storage.get(PROFILE_ID, {});
    if (!profiles[number]) {
      return;
    }

    delete profiles[number];

    window.log.info('removing profile for ', number);
    await storage.put(PROFILE_ID, profiles);
  }

  // Names that user can set for users

  const NICKNAME_ID = 'nickname';

  storage.getNickname = number => {
    const nicknames = storage.get(NICKNAME_ID, {});
    return nicknames[number] || null;
  }

  storage.saveNickname = async (number, name) => {
    const nicknames = storage.get(NICKNAME_ID, {});
    const storedName = nicknames[number];

    // Only store the name if we have a different name
    if (storedName === name) {
      return;
    }

    window.log.info('adding nickname ', name, 'for ', number);
    await storage.put(NICKNAME_ID, {
      ...nicknames,
      [number]: name,
    });
  }

  storage.removeNickname = async number => {
    const nicknames = storage.get(NICKNAME_ID, {});
    if (!nicknames[number]) {
      return;
    }

    delete nicknames[number];

    window.log.info('removing nickname for ', number);
    await storage.put(NICKNAME_ID, nicknames);
  }
})();