import { TransactionResponse as EvmTransactionResponse } from "@ethersproject/providers";
import { VersionedTransaction as SolanaVersionedTransaction } from "@solana/web3.js";
import { EvmHandlers, SolanaHandlers } from "@src/context";
import { Ecosystem } from "@src/models";
import { Dispatch, SetStateAction } from "react";

export type EnqueueTxProps = {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  executeTransaction: () =>
    | Promise<EvmTransactionResponse | undefined>
    | Promise<SolanaVersionedTransaction | undefined>
    | undefined;
  txStatus: TxStatus;
  txMsg?: string;
  handlers?: EvmHandlers | SolanaHandlers;
  network?: Ecosystem;
  showDefaultSuccessMessage?: boolean;
};

export type TxUIWrapperState = {
  enqueueTransaction: (props: EnqueueTxProps) => number;
  closeTransactionModal: (nonce: number) => void;
  isTxModalOpen: boolean;
  setTxModalOpen: Dispatch<SetStateAction<boolean>>;
  loading: boolean;
  txStatus: TxStatus;
  setTxStatus: Dispatch<SetStateAction<TxStatus>>;
  txExplorerUrl: string;
  txHash: string;
  txError: string;
  txMsg: string;
  setTxMsg: Dispatch<SetStateAction<string>>;
  setTxError: Dispatch<SetStateAction<string>>;
  txNeedsApproval: boolean;
  setTxNeedsApproval: Dispatch<SetStateAction<boolean>>;
};

/**
 * make sure there's always appropriate CONFIRMATION status following the SIGNING one
 * see setTxStatus((prevStatus) => prevStatus + 1) at TxUIWrapper.tsx -> addUILogicToHandlersEVM
 */
export enum TxStatus {
  SWAP_INIT,
  SIGNING_APPROVAL,
  CONFIRMING_APPROVAL,
  SIGNING_TX,
  CONFIRMING_TX,
  COMPLETED,
}

export type TxStats = {
  points?: string;
  rank?: string;
  cashback?: string;
};
