import { Abi, AbiFunction } from "abitype"
import { WriteOnlyFunctionForm } from "~~/app/admin/debug/_components/contract"
import {
  Contract,
  ContractName,
  GenericContract,
  InheritedFunctions,
} from "~~/utils/xchange/contract"

export const ContractWriteMethods = ({
  onChange,
  deployedContractData,
}: {
  onChange: () => void
  deployedContractData: Contract<ContractName>
}) => {
  if (!deployedContractData) {
    return null
  }

  const functionsToDisplay = (
    (deployedContractData.abi as Abi).filter(
      part => part.type === "function"
    ) as AbiFunction[]
  )
    .filter(fn => {
      const isWriteableFunction =
        fn.stateMutability !== "view" && fn.stateMutability !== "pure"
      return isWriteableFunction
    })
    .map(fn => {
      return {
        fn,
        inheritedFrom: (
          (deployedContractData as GenericContract)
            ?.inheritedFunctions as InheritedFunctions
        )?.[fn.name],
      }
    })
    .sort((a, b) =>
      b.inheritedFrom ? b.inheritedFrom.localeCompare(a.inheritedFrom) : 1
    )

  if (!functionsToDisplay.length) {
    return <>No write methods</>
  }

  return (
    <>
      {functionsToDisplay.map(({ fn, inheritedFrom }, idx) => (
        <WriteOnlyFunctionForm
          abi={deployedContractData.abi as Abi}
          key={`${fn.name}-${idx}}`}
          abiFunction={fn}
          onChange={onChange}
          contractAddress={deployedContractData.address}
          inheritedFrom={inheritedFrom}
        />
      ))}
    </>
  )
}
