import { ErrorTypes, StorageType } from "./../types";
import {
  getConsoleErrors,
  getNetworkLogs,
  getUnhandledErrors,
} from "../db/index";
import store from "../state/store";
import { StorageTypes } from "../types";
import downloadJSON from "./download-json";

export const downloadNetworkLogs = async () => {
  const getLogs = async () => {
    const { storeName: storeNameObj, dbName, storageType } = store.getState();
    const storeName = storeNameObj.networkLogs;
    switch (storageType) {
      case StorageTypes.IndexedDB:
        return await getNetworkLogs();
      case StorageTypes.LocalStorage:
        return (
          JSON.parse(localStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
      case StorageTypes.SessionStorage:
        return (
          JSON.parse(sessionStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
    }
  };
  try {
    const logs = await getLogs();
    downloadJSON(
      { type: ErrorTypes.Network, logs },
      `${ErrorTypes.Network}_${new Date().getTime()}`
    );
  } catch (err) {}
};

export const downloadConsoleErrors = async () => {
  const getLogs = async () => {
    const { storeName: storeNameObj, dbName, storageType } = store.getState();
    const storeName = storeNameObj.consoleErrors;
    switch (storageType) {
      case StorageTypes.IndexedDB:
        return await getConsoleErrors();
      case StorageTypes.LocalStorage:
        return (
          JSON.parse(localStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
      case StorageTypes.SessionStorage:
        return (
          JSON.parse(sessionStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
    }
  };
  try {
    const logs = await getLogs();
    downloadJSON(
      { type: ErrorTypes.Errors, logs },
      `${ErrorTypes.Errors}_${new Date().getTime()}`
    );
  } catch (err) {}
};

export const downloadUnhandledErrors = async () => {
  const getLogs = async () => {
    const { storeName: storeNameObj, dbName, storageType } = store.getState();
    const storeName = storeNameObj.unhandledErrors;
    switch (storageType) {
      case StorageTypes.IndexedDB:
        return await getUnhandledErrors();
      case StorageTypes.LocalStorage:
        return (
          JSON.parse(localStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
      case StorageTypes.SessionStorage:
        return (
          JSON.parse(sessionStorage.getItem(dbName) || "{}")?.[storeName] || []
        );
    }
  };
  try {
    const logs = await getLogs();

    downloadJSON(
      { type: ErrorTypes.UnhandledRejections, logs },
      `${ErrorTypes.UnhandledRejections}_${new Date().getTime()}`
    );
  } catch (err) {}
};
