import { ADDRESSES, BatchQueryAbi } from "@src/contracts";
import { useSwapContext } from "@src/context";
import useEvmContractApi from "./useEvmContractApi";
import { Ecosystem } from "@src/models";
import { ethers } from "ethers";
import { useCallback } from "react";

export const useBatchQuery = () => {
  const evmContractApi = useEvmContractApi();
  const { supportedChains } = useSwapContext();

  const contract = useCallback(
    (chainId: string) => {
      const rpcUrl = supportedChains.find(
        (chain) =>
          chain.ecosystem === Ecosystem.EVM && chain.chainId === chainId,
      )?.publicRpcUrls[0];
      const contractAddress = ADDRESSES[chainId]?.BatchQuery;
      if (rpcUrl && contractAddress) {
        return new ethers.Contract(
          contractAddress,
          BatchQueryAbi,
          ethers.getDefaultProvider(rpcUrl),
        );
      }
      return null;
    },
    [supportedChains],
  );

  return {
    batchQuery: useCallback(
      async (
        chainId: string,
        targetAddresses: string[],
        calldatas: string[],
      ) => {
        return await evmContractApi.query(contract(chainId), "batchQuery", [
          targetAddresses,
          calldatas,
        ]);
      },
      [contract, evmContractApi],
    ),
  };
};
