/**
 * Storage interface
 */
export interface IStorage {
  /**
   * Clear keys
   * @param keys Keys
   * @param persisted Persisted or session data
   */
  clear(keys: string[], persisted?: boolean): void;

  /**
   * Copy keys to session from persisted source
   * @param keys Keys
   * @param removeSource Remove from the source
   */
  copyFrom(keys: string[], removeSource?: boolean): void;

  /**
   * Copy keys to persisted source
   * @param keys Keys
   * @param removeSource Remove from the source
   */
  copyTo(keys: string[], removeSource?: boolean): void;

  /**
   * Get data
   * @param key Key name
   */
  getData<T>(key: string): T | undefined;

  /**
   * Get data with default value
   * @param key Key name
   * @param defaultValue Default value
   */
  getData<T>(key: string, defaultValue: T): T;

  /**
   * Get persisted data
   * @param key Key name
   */
  getPersistedData<T>(key: string): T | undefined;

  /**
   * Get persisted data with default value
   * @param key Key name
   * @param defaultValue Default value
   */
  getPersistedData<T>(key: string, defaultValue: T): T;

  /**
   * Get object data
   * @param key Key name
   */
  getObject<T extends object>(key: string): T | undefined;

  /**
   * Get persisted object data
   * @param key Key name
   */
  getPersistedObject<T extends object>(key: string): T | undefined;

  /**
   * Set data
   * @param key Key name
   * @param data  Data, null for removal
   */
  setData(key: string, data: unknown): void;

  /**
   * Set persisted data
   * @param key Key name
   * @param data  Data, null for removal
   */
  setPersistedData<T>(key: string, data: T): void;
}
