import { ADDRESSES, StakingStableAPRAbi } from "@src/contracts";
import { useBatchQuery } from "./useBatchQuery";
import { BigNumber, ethers } from "ethers";
import { useCallback } from "react";

const iface = new ethers.utils.Interface(StakingStableAPRAbi);

export const useXPower = (chainId: string) => {
  const { batchQuery } = useBatchQuery();

  return {
    getXPower: useCallback(
      async (address: string) => {
        if (
          !ADDRESSES[chainId]?.StakingCosmicCadets ||
          !ADDRESSES[chainId]?.StakingSolarDivision ||
          !ADDRESSES[chainId]?.StakingIntergalacticCommand
        ) {
          return "0";
        }

        const stakingAddresses: string[] = [
          ADDRESSES[chainId]?.StakingCosmicCadets,
          ADDRESSES[chainId]?.StakingSolarDivision,
          ADDRESSES[chainId]?.StakingIntergalacticCommand,
        ];

        const calldata = iface.encodeFunctionData("getStaker", [address]);
        const responses = await batchQuery(
          chainId,
          stakingAddresses,
          stakingAddresses.map(() => calldata),
        );
        if (responses) {
          return responses
            .map(
              (stakerResponse) =>
                ethers.utils.defaultAbiCoder.decode(
                  [
                    "address",
                    "uint256",
                    "uint256",
                    "uint256",
                    "uint256",
                    "uint256",
                  ],
                  stakerResponse,
                )[1],
            )
            .reduce((prev, curr) => prev.add(curr), BigNumber.from(0))
            .toString();
        }
        return "0";
      },
      [batchQuery, chainId],
    ),
  };
};
