import { ERC20Abi } from "@src/contracts";
import { ethers } from "ethers";
import { Chain, Token } from "@src/models";

export const getCustomTokenData = async (
  chain: Chain,
  tokenAddress: string,
): Promise<Token> => {
  const rpcUrl = chain.publicRpcUrls[0];

  const customTokenContract = new ethers.Contract(
    tokenAddress.toLowerCase(),
    ERC20Abi,
    ethers.getDefaultProvider(rpcUrl),
  );
  try {
    const query = async (
      contract: ethers.Contract | null,
      method: string,
      args: unknown[] = [],
    ) => {
      if (contract?.provider) {
        const response = await contract[method](...args);
        return response;
      }
      return null;
    };
    const responses = await Promise.all([
      query(customTokenContract, "decimals"),
      query(customTokenContract, "name"),
      query(customTokenContract, "symbol"),
    ]);
    const [decimals, name, symbol] = responses;

    return {
      address: tokenAddress,
      symbol: symbol,
      tokenId: tokenAddress,
      name: name,
      decimals: decimals,
      quickPick: false,
      supported: true,
      priority: 0,
    };
  } catch (_) {
    throw new Error(
      `Provided token ${tokenAddress} does not exists on chain ${chain.displayName}`,
    );
  }
};
