import { SupportedChainIds, TAsset } from "@/types"
import { create } from "zustand"
import { Address } from "../types"
import { truncateString } from "@/utils"
import { getTokenMetadata } from "../api"
import { BASE_CHAIN_ID } from "@/constants"

type ConfigStore = {
  assets: TAsset[]
  setAssets: (assets: TAsset[]) => void
  addCustomTokens: (assets: TAsset[]) => void
  fetchAndAddToConfig: (addresses: Address[]) => Promise<void>
}

const useConfigStore = create<ConfigStore>((set, get) => ({
  assets: [],
  setAssets: (assets: TAsset[]) => set({ assets: assets }),
  addCustomTokens: (assets: TAsset[]) =>
    set((prev) => ({ assets: [...prev.assets, ...assets] })),

  fetchAndAddToConfig: async (addresses: Address[]) => {
    const { addCustomTokens } = get()
    const customTokens: TAsset[] = []

    for (const address of addresses) {
      const customTokenResponse = await getTokenMetadata(address as Address)
      if (customTokenResponse.data) {
        const { symbol, decimals, logo, name } = customTokenResponse.data

        const customToken: TAsset = getGenericAsset(
          address as Address,
          BASE_CHAIN_ID,
          symbol,
          decimals,
          logo,
        )
        customTokens.push(customToken)
      }
    }
    addCustomTokens(customTokens)
  },
}))

export default useConfigStore

export const LOGO_FALLBACK_URL =
  "https://brahma-static.s3.us-east-2.amazonaws.com/Protocols/AssetGeneric-1.svg"

export const getGenericAsset = (
  address: Address,
  tokenChainId: SupportedChainIds,
  name?: string,
  decimal?: number,
  logo?: string,
): TAsset => {
  return {
    address,
    decimals: decimal || 18,
    chainId: tokenChainId,
    name: name || truncateString(address),
    logo: logo || LOGO_FALLBACK_URL,
    value: "0",
    prices: { default: 0 },
  }
}
