import type {
  ChatMsg,
  Exchange,
  ListOrdersParams,
  MarketAd,
  MarketSearchParams,
  MyAd,
  OrderRecord,
} from "./types.js";

/**
 * Interface comum a todas as exchanges (Binance, Bybit). A lógica de negócio
 * depende SÓ desta interface — `src/exchange/index.ts` resolve qual
 * implementação usar a partir da conta.
 *
 * Cada método já devolve tipos neutros (`src/exchange/types.ts`); a tradução
 * dos campos crus mora no adapter de cada exchange.
 */
export interface ExchangeClient {
  readonly exchange: Exchange;
  /** Id da conta (`exchange_accounts.id`) que originou este cliente. */
  readonly accountId: number;

  /** Anúncios de concorrentes no mercado público (entrada do pricing). */
  searchMarketAds(params: MarketSearchParams): Promise<MarketAd[]>;

  /** Meus anúncios (para espelhar). */
  listMyAds(): Promise<MyAd[]>;

  /** Atualiza o preço de um anúncio (efeito externo — idempotente/auditado). */
  updateAdPrice(advNo: string, price: string): Promise<void>;

  /** Minhas ordens (ativas e/ou histórico). */
  listOrders(params?: ListOrdersParams): Promise<OrderRecord[]>;

  /** Histórico de mensagens de uma ordem. */
  getChatMessages(orderNo: string): Promise<ChatMsg[]>;

  /** Envia mensagem no chat de uma ordem (efeito externo — auditado). */
  sendChatMessage(orderNo: string, text: string): Promise<void>;
}
