import { makeAutoObservable } from 'mobx';

/**
 * Class representing a local storage instance.
 * @class
 */
export class LocalStorage {
  /**
   * Storage instance.
   * @type {Storage}
   */
  db: Storage;

  /**
   * Constructs a new LocalStorage instance.
   * @constructor
   */
  constructor() {
    this.db = window.localStorage;
    makeAutoObservable(this);
  }

  /**
   * Sets a value in the local storage.
   * @param {string} id - The id/key of the value to set.
   * @param {any} data - The data value to set.
   */
  set(id: string, data: unknown) {
    const value = JSON.stringify(data);
    this.db.setItem(id, value);
  }

  /**
   * Retrieves a value from the local storage.
   * @param {string} id - The id/key of the value to retrieve.
   * @returns {string | undefined} - The retrieved value.
   */
  get(id: string): string | undefined {
    return this.db.getItem(id) || undefined;
  }

  /**
   * Removes a value from the local storage.
   * @param {string} id - The id/key of the value to remove.
   */
  remove(id: string) {
    this.db.removeItem(id);
  }
}

/**
 * Default instance of the LocalStorage class.
 * @type {LocalStorage}
 */
export const localStorage = new LocalStorage();
