import { logError } from "./logger";

const bridgeNotFountMessage = (storage: string) =>
  `${storage} native module not found`;

class BridgeNotFound extends Error {
  constructor(storage: string) {
    super(bridgeNotFountMessage(storage));
    logError(storage, this);
  }
}

export function throwBridgeNotFoundError(storage: string) {
  // @ts-ignore
  if (process.env.NODE_ENV === "test") return;
  throw new BridgeNotFound(storage);
}

class UndefinedKeyError extends Error {
  constructor(message, storage: string) {
    super(message);
    logError(storage, this);
  }
}

export function throwUndefinedKeyError(storage: string, message: string) {
  throw new UndefinedKeyError(message, storage);
}

class UndefinedValueError extends Error {
  constructor(message, _storage: string, key) {
    super(message);
    logError(message, this, { key });
  }
}

export function throwUndefinedValueError(storage, message, key) {
  throw new UndefinedValueError(message, storage, key);
}

class NativeStorageError extends Error {
  constructor(message, storage: string, data: Record<string, any>) {
    super(message);
    logError(storage, this, data);
  }
}

export function throwNativeStorageError(
  storage: string,
  message: string,
  key: string,
  namespace: string = "Applicaster.v2",
  value?: any
) {
  throw new NativeStorageError(message, storage, { key, namespace, value });
}

export const getItemError = ({ message }: Error, secure = false) =>
  `An error occured while getting an item from native${
    secure ? " secure" : ""
  } storage: ${message}`;

export const setItemError = ({ message }: Error, secure = false) =>
  `An error occured while setting an item in native${
    secure ? " secure" : ""
  }  storage: ${message}`;

export const removeItemError = ({ message }: Error, secure = false) =>
  `An error occured while removing an item from native${
    secure ? " secure" : ""
  }  storage: ${message}`;
