import { useSelector } from 'react-redux';
import { useCallback, useState } from 'react';
import { isBalanceSufficient } from '../pages/send/send.utils';
import { getSelectedAccount } from '../selectors';
import { getConversionRate } from '../ducks/metamask/metamask';

import { getMaximumGasTotalInHexWei } from '../../shared/modules/gas.utils';
import { useIncrementedGasFees } from './useIncrementedGasFees';

/**
 * Determine whether a transaction can be cancelled and provide a method to
 * kick off the process of cancellation.
 *
 * Provides a reusable hook that, given a transactionGroup, will return
 * whether or not the account has enough funds to cover the gas cancellation
 * fee, and a method for beginning the cancellation process
 * @param {Object} transactionGroup
 * @return {[boolean, Function]}
 */
export function useCancelTransaction(transactionGroup) {
  const { primaryTransaction } = transactionGroup;

  const customCancelGasSettings = useIncrementedGasFees(transactionGroup);

  const selectedAccount = useSelector(getSelectedAccount);
  const conversionRate = useSelector(getConversionRate);

  const [showCancelEditGasPopover, setShowCancelEditGasPopover] = useState(
    false,
  );

  const closeCancelEditGasPopover = () => setShowCancelEditGasPopover(false);

  const cancelTransaction = useCallback((event) => {
    event.stopPropagation();
    return setShowCancelEditGasPopover(true);
  }, []);

  const hasEnoughCancelGas =
    primaryTransaction.txParams &&
    isBalanceSufficient({
      amount: '0x0',
      gasTotal: getMaximumGasTotalInHexWei(customCancelGasSettings),
      balance: selectedAccount.balance,
      conversionRate,
    });

  return {
    hasEnoughCancelGas,
    customCancelGasSettings,
    cancelTransaction,
    showCancelEditGasPopover,
    closeCancelEditGasPopover,
  };
}