/**
 * Tipos de domínio compartilhados entre exchanges. A lógica de negócio
 * (pricing, sync, chat) fala SEMPRE nestes tipos neutros — nunca nos tipos
 * crus de uma exchange específica. Cada adapter (Binance, Bybit) traduz a
 * sua resposta para cá.
 *
 * Convenção: `tradeType` é sempre do ponto de vista do anunciante (você).
 * Valores monetários são string (DECIMAL), nunca float.
 */

export type Exchange = "binance" | "bybit";
export type TradeType = "BUY" | "SELL";

/** Anúncio de concorrente vindo do mercado público (entrada do pricing). */
export interface MarketAd {
  advNo: string;
  advertiserName: string | null;
  /** Identificador do anunciante na exchange (p/ excluir você mesmo). */
  advertiserId: string | null;
  price: string;
  asset: string;
  fiat: string;
  tradeType: TradeType;
  minAmount: string | null;
  maxAmount: string | null;
  availableAmount: string | null;
  payTypes: string[];
  /** Métricas de filtro (quando disponíveis). */
  finishRate: number | null;
  monthOrderCount: number | null;
  raw: unknown;
}

/** Anúncio próprio, espelhado localmente. */
export interface MyAd {
  advNo: string;
  asset: string;
  fiat: string;
  tradeType: TradeType;
  price: string;
  priceType: number | null;
  status: number | null;
  surplusAmount: string | null;
  minAmount: string | null;
  maxAmount: string | null;
  raw: unknown;
}

/** Ordem espelhada localmente. */
export interface OrderRecord {
  orderNo: string;
  advNo: string | null;
  tradeType: TradeType;
  asset: string;
  fiat: string;
  amount: string | null;
  totalPrice: string | null;
  status: number | null;
  statusText: string | null;
  /** Identificador/nick da contraparte na exchange. */
  counterpartyRef: string | null;
  counterpartyName: string | null;
  /** Marca se a ordem está paga (gatilho de automação). */
  isPaid: boolean;
  createTime: number | null;
  raw: unknown;
}

/** Mensagem de chat neutra. */
export interface ChatMsg {
  /** id da mensagem na exchange (dedupe). */
  id: string;
  orderNo: string;
  /** in = do cliente; out = nossa. */
  direction: "in" | "out";
  type: string;
  content: string;
  createTime: number;
  raw: unknown;
}

/** Parâmetros de busca no mercado público. */
export interface MarketSearchParams {
  asset: string;
  fiat: string;
  /** Ponto de vista do anunciante. O adapter converte p/ o lado da exchange. */
  tradeType: TradeType;
  payTypes?: string[];
  rows?: number;
  page?: number;
  /** Filtra anúncios que aceitam ao menos este valor (transAmount). */
  transAmount?: string;
}

export interface ListOrdersParams {
  page?: number;
  rows?: number;
  /** Só ordens ativas/pendentes quando true. */
  pendingOnly?: boolean;
}
