import type { TypedDataDefinition } from 'viem';
import type { SupportedEvmChain } from '../../chains.js';
import type { CrossChainOrder } from '../orders/cross-chain.js';
import { EVMIntentProvider } from './intent-provider.js';
import { CROSS_CHAIN_PERMIT2_TYPES, PERMIT2_DOMAIN, SINGLE_CHAIN_LIMIT_PERMIT2_TYPES } from './permit2.js';
import type { SingleChainOrder } from '../orders/single-chain.js';

export async function getEVMSingleChainOrderTypedData(
  order: SingleChainOrder,
): Promise<{ orderTypedData: TypedDataDefinition; nonce: bigint }> {
  const randomNonce = EVMIntentProvider.getRandomNonce();
  const permissionMessage = EVMIntentProvider.getSingleChainLimitPermissionMessage(order, randomNonce);

  const orderTypedData = {
    domain: PERMIT2_DOMAIN(order.chainId as SupportedEvmChain),
    types: SINGLE_CHAIN_LIMIT_PERMIT2_TYPES,
    primaryType: 'PermitWitnessTransferFrom',
    message: permissionMessage,
  };

  return { orderTypedData, nonce: randomNonce };
}

/**
 * Generates typed data for EVM order signatures
 * @param order The order to generate typed data for
 * @returns Object containing the typed data and nonce
 */
export async function getEVMCrossChainOrderTypedData(
  order: CrossChainOrder,
): Promise<{ orderTypedData: TypedDataDefinition; nonce: bigint }> {
  const randomNonce = EVMIntentProvider.getRandomNonce();
  const permissionMessage = EVMIntentProvider.getCrossChainPermissionMessage(order, randomNonce);

  const orderTypedData = {
    domain: PERMIT2_DOMAIN(order.sourceChainId as SupportedEvmChain),
    types: CROSS_CHAIN_PERMIT2_TYPES,
    primaryType: 'PermitWitnessTransferFrom',
    message: permissionMessage,
  };

  return { orderTypedData, nonce: randomNonce };
}
