import type { ExtraTransfer } from '../core/orders/common.js';

export type OrderStatus = 'Auction' | 'NoBids' | 'Executing' | 'Fulfilled' | 'Cancelled' | 'Outdated';

export type ApiCrossChainOrder = {
  orderId: string;
  // Flattened fields from the API response
  user: string;
  srcChainId: number;
  tokenIn: string;
  minStablecoinsAmount: string;
  destChainId: number;
  tokenOut: string;
  amountOutMin: string;
  destinationAddress: string;
  extraTransfers?: ExtraTransfer[];
  deadline: number;
  executionDetailsHash: string;
  amountIn: string;
  // Cross-chain specific fields
  executionDetails: string;
  orderCreationTime: number;
  orderStatus: OrderStatus;
  tokensInWereSwappedToStablecoins: boolean;
  lockedStablecoins: string;
  nonce?: string;
  orderFulfillmentTimestamp?: number;
  transactionHash?: string;
  amountOut?: string;
};

export type ApiSingleChainOrder = {
  orderId: string;
  // Flattened fields from the API response
  user: string;
  chainId: number;
  tokenIn: string;
  tokenOut: string;
  amountOutMin: string;
  destinationAddress: string;
  extraTransfers?: ExtraTransfer[];
  deadline: number;
  amountIn: string;
  // Single-chain specific fields
  orderCreationTime: number;
  orderStatus: OrderStatus;
  nonce?: string;
  orderFulfillmentTimestamp?: number;
  transactionHash?: string;
  amountOut?: string;
};

export type ApiUserOrders = {
  singleChainLimitOrders: ApiSingleChainOrder[];
  crossChainLimitOrders: ApiCrossChainOrder[];
};

export type ValidResponseData = ApiUserOrders | string | null;

export type ApiResponse<T extends ValidResponseData = ValidResponseData> = {
  success: boolean;
  code: number;
  data?: T;
  error?: unknown;
  extra_error_data?: unknown;
};

export function isSuccessApiResponse<T extends ValidResponseData>(
  response: ApiResponse<T>,
): response is ApiResponse<T> & { success: true; data: T } {
  return response.success;
}

export function isErrorApiResponse<T extends ValidResponseData>(
  response: ApiResponse<T>,
): response is ApiResponse<T> & { success: false; error: unknown } {
  return !response.success;
}

// Keep the nested types for internal use if needed
export interface CrossChainGenericData {
  user: string;
  srcChainId: number;
  tokenIn: string;
  minStablecoinsAmount: string;
  destChainId: number;
  tokenOut: string;
  amountOutMin: string;
  destinationAddress: string;
  extraTransfers?: ExtraTransfer[];
  deadline: number;
  executionDetailsHash: string;
}

export interface CrossChainLimitOrderGenericData {
  commonData: CrossChainGenericData;
  amountIn: string;
}

export interface SingleChainGenericData {
  user: string;
  chainId: number;
  tokenIn: string;
  tokenOut: string;
  amountOutMin: string;
  destinationAddress: string;
  extraTransfers?: ExtraTransfer[];
  deadline: number;
}

export interface SingleChainLimitOrderGenericData {
  commonData: SingleChainGenericData;
  amountIn: string;
}
