/**
 * Transaction types enum for multi-transactions
 */
export enum MultiTransactionType {
  TRANSFER = "TRANSFER",
  SWAP = "SWAP",
  CUSTOM = "CUSTOM",
  INCOMING = "INCOMING",
}

/**
 * Transaction status enum for individual transactions
 */
export enum TransactionStatus {
  PENDING = "PENDING",
  COMPLETED = "COMPLETED",
  FAILED = "FAILED",
}

/**
 * Overall status enum for multi-transactions
 */
export enum OverallStatus {
  PENDING = "PENDING",
  COMPLETED = "COMPLETED",
  FAILED = "FAILED",
}

/**
 * Receiver interface for transaction recipients
 */
export interface User {
  username?: string;
  walletAddress?: string;
  solana_program_wallet?: string;
  ens?: string;
}

/**
 * Token details interface
 */
export interface TokenDetail {
  amount: string;
  amountFormatted: string;
  tokenAddress: string;
  tokenName: string;
  tokenSymbol: string;
  receiver?: User;
}

/**
 * Interface for individual transaction details
 */
export interface TransactionDetail {
  txnURL: string;
  status: TransactionStatus;
}

/**
 * Token Details
 */
export interface TokenURI {
  tokenName: string;
  tokenSymbol: string;
  tokenAddress: string;
  decimals: number;
  logoURI: string;
}

/**
 * Interface for transaction metadata
 */
export interface TransactionMetadata {
  senderDetails: User;
  receiverDetails: User[];
  inputAmounts: { [key: string]: TokenDetail[] };
  destinationAmounts: { [key: string]: TokenDetail[] };
  status: OverallStatus;
  lastUpdatedTimestamp: number;
  transactions: { [key: string]: { [key: string]: TransactionDetail } };
  inputToken: TokenURI;
  outputToken: TokenURI;
  totalInputAmount: string;
  totalOutputAmount: string;
}

/**
 * Interface for MultiTransaction document
 */
export interface IMultiTransaction {
  multiTransactionId: string;
  transactionType: MultiTransactionType;
  transactionDescription: string;
  sender: User;
  receivers: User[];
  sourceChains: number[];
  destinationChains: number[];
  inputTokens: { [key: string]: TokenDetail[] };
  outputTokens: { [key: string]: TokenDetail[] };
  transactions: { [key: string]: { [key: string]: TransactionDetail } };
  overallStatus: OverallStatus;
  metadata: TransactionMetadata;
  createdTimestamp: number;
  lastUpdatedTimestamp: number;
}
