const HAS_WINDOW = typeof window !== 'undefined'

function LocalStorage() {
  let memoryStorage: any = {};

  function hasLocalStorage() {
    return HAS_WINDOW &&  typeof window.localStorage !== "undefined";
  }

  function clear() {
    if (hasLocalStorage()) {
      localStorage.clear();
    } else {
      memoryStorage = {};
    }
  }

  function setItem(key: string, value: any) {
    if (hasLocalStorage()) {
      localStorage.setItem(key, value);
    } else {
      memoryStorage[key] = value;
    }
  }

  function getItem(key: string) {
    if (hasLocalStorage()) {
      return localStorage.getItem(key);
    }
    return memoryStorage[key];
  }

  function removeItem(key: string) {
    if (hasLocalStorage()) {
      return localStorage.removeItem(key);
    } else if (key in memoryStorage) {
      delete memoryStorage[key];
    }
  }

  return {
    clear,
    setItem,
    getItem,
    removeItem,
  };
}

export default LocalStorage();
