export const useStorage = () => {
  const getStorage = <T = string>(key: string, isLocalStorage = false): T | null => {
    let value: T | null = null
    const storageValue =
      typeof window !== "undefined" ? (isLocalStorage ? localStorage.getItem(key) : sessionStorage.getItem(key)) : ""
    try {
      if (storageValue) value = JSON.parse(storageValue) as T
    } catch (error) {
      console.error(">>>>>>>>>>>>>>>> Error in getStorage: ", error)
      value = storageValue as T
    }

    return value
  }

  const setStorage = <T>(key: string, value: T, isLocalStorage = false) => {
    const payload = typeof value === "string" ? value : JSON.stringify(value)
    if (isLocalStorage) localStorage.setItem(key, payload)
    else sessionStorage.setItem(key, payload)
  }

  const removeStorage = (key: string, isLocalStorage = false) =>
    isLocalStorage ? localStorage.removeItem(key) : sessionStorage.removeItem(key)

  const clearStorage = (isLocalStorage = false) => (isLocalStorage ? localStorage.clear() : sessionStorage.clear())

  const clearAllStorage = () => {
    localStorage.clear()
    sessionStorage.clear()
  }

  return {
    getStorage,
    setStorage,
    removeStorage,
    clearAllStorage,
    clearStorage,
  }
}
