// A simple key value store that uses LocalStorage
let safeLocalStorage;

try {
  safeLocalStorage = localStorage;
  if (localStorage["disableLocalStorage"] === "true") {
    safeLocalStorage = null;
  } else {
    // makes sure we can write to the local storage
    safeLocalStorage["safeLocalStorage"] = true;
  }
} catch (e) {
  // cookies disabled, we don't care
  safeLocalStorage = null;
}

const KeyValueStore = function(ctx) {
  this.context = ctx;
};

KeyValueStore.prototype = {
  abandonLocal() {
    if (!safeLocalStorage) { return; }

    let i = safeLocalStorage.length - 1;
    while (i >= 0) {
      let k = safeLocalStorage.key(i);
      if (k.substring(0, this.context.length) === this.context) {
        safeLocalStorage.removeItem(k);
      }
      i--;
    }
    return true;
  },

  remove(key) {
    if (!safeLocalStorage) { return; }
    return safeLocalStorage.removeItem(this.context + key);
  },

  set(opts) {
    if (!safeLocalStorage) { return false; }
    safeLocalStorage[this.context + opts.key] = opts.value;
  },

  setObject(opts) {
    this.set({ key: opts.key, value: JSON.stringify(opts.value) });
  },

  get(key) {
    if (!safeLocalStorage) { return null; }
    return safeLocalStorage[this.context + key];
  },

  getInt(key, def) {
    if (!def) { def = 0; }
    if (!safeLocalStorage) { return def; }
    const result = parseInt(this.get(key));
    if (!isFinite(result)) { return def; }
    return result;
  },

  getObject(key) {
    if (!safeLocalStorage) { return null; }
    try { return JSON.parse(safeLocalStorage[this.context + key]); }
    catch (e) { }
  }
};

// API compatibility with `localStorage`
KeyValueStore.prototype.getItem = KeyValueStore.prototype.get;
KeyValueStore.prototype.removeItem = KeyValueStore.prototype.remove;
KeyValueStore.prototype.setItem = function(key, value) {
  this.set({ key, value });
};

export default KeyValueStore;
