import { useMemo, useState } from "react"

import { dispatchToast } from "../components/ToastContainer"
import { TAsset } from "@/types"
import { isValidEthereumAddress } from "@/utils"
import { getTokenMetadata } from "../api"
import { BASE_CHAIN_ID } from "@/constants"
import { Address } from "../types"
import useConfigStore, { getGenericAsset } from "../store"

const AMOUNT_TO_SHOW = 20

export default function useSearchTokens(assets: TAsset[]) {
  const [filter, setFilter] = useState<string>("")
  const [loading, setLoading] = useState(false)
  const [amountToShow, setAmountToShow] = useState(AMOUNT_TO_SHOW)
  const { addCustomTokens } = useConfigStore()
  const filteredAssetsList = useMemo(() => {
    return assets.filter((token) => {
      const isAssetMatch =
        token.name.toLowerCase().includes(filter.toLowerCase()) ||
        token.address.toLowerCase().includes(filter.toLowerCase()) ||
        (token?.symbol &&
          token.symbol.toLowerCase().includes(filter.toLowerCase()))

      return isAssetMatch
    })
  }, [assets, filter])

  const handleInputChange = async (value: string) => {
    try {
      setFilter(value)
      const assetsFilteredBySearch = assets.filter((token) => {
        const isAssetMatch =
          token.name.toLowerCase().includes(value.toLowerCase()) ||
          token.address.toLowerCase().includes(value.toLowerCase()) ||
          (token?.symbol &&
            token.symbol.toLowerCase().includes(value.toLowerCase()))

        return isAssetMatch
      })

      if (
        !value ||
        !isValidEthereumAddress(value) ||
        assetsFilteredBySearch.length > 0
      )
        return
      // add custom token in config
      setLoading(true)
      const customTokenResponse = await getTokenMetadata(value as Address)
      if (customTokenResponse.error || !customTokenResponse.data) return
      const { symbol, decimals, logo, name } = customTokenResponse.data

      const customToken: TAsset = getGenericAsset(
        value as Address,
        BASE_CHAIN_ID,
        symbol,
        decimals,
        logo,
      )
      addCustomTokens([customToken])
    } catch (err: any) {
      dispatchToast({
        id: "error-adding-token",
        type: "error",
        title: "Error adding repeated Exit DCA to builder",
        description: {
          value: err?.message || "Error fetching token information",
        },
      })
    } finally {
      setLoading(false)
    }
  }

  return {
    loading,
    filter,
    amountToShow,
    filteredAssetsList,
    handleInputChange,
    setAmountToShow,
    setFilter,
  }
}
