// Copyright 2022 @paritytech/contracts-ui authors & contributors
// SPDX-License-Identifier: GPL-3.0-only

import { transformUserInput } from 'api/util';

import {
  BlueprintOptions,
  ContractQuery,
  ContractOptions,
  ContractTx,
  KeyringPair,
  ContractDryRunParams,
} from 'types';

export function prepareContractTx(
  tx: ContractTx<'promise'>,
  options: BlueprintOptions,
  args: unknown[]
) {
  return args.length > 0 ? tx(options, ...args) : tx(options);
}

export function sendContractQuery(
  query: ContractQuery<'promise'>,
  sender: KeyringPair,
  options: ContractOptions,
  args: unknown[]
) {
  return args?.length > 0
    ? query(sender.address, options, ...args)
    : query(sender.address, options);
}

export function dryRun({
  contract,
  message,
  payment: value,
  sender,
  argValues,
}: ContractDryRunParams) {
  const { isPayable, method } = message;
  const transformed = transformUserInput(contract.registry, message.args, argValues);

  return sendContractQuery(
    contract.query[method],
    sender,
    { gasLimit: -1, value: isPayable ? value : 0 },
    transformed
  );
}