import type { AppConfig } from '../../core/config.js'
import { BybitPublicTradeStreamer } from '../bybit/public-stream.js'
import { BybitRestClient } from '../bybit/rest.js'
import { BinanceTradeStreamer } from './binance.js'
import { CoinbaseTradeStreamer } from './coinbase.js'
import { DydxTradeStreamer } from './dydx.js'
import { HyperliquidTradeStreamer } from './hyperliquid.js'
import { KrakenTradeStreamer } from './kraken.js'
import { OkxTradeStreamer } from './okx.js'
import type { TradeSource } from './multi-venue.js'

export function createTradeSources(config: AppConfig, restClient: BybitRestClient): TradeSource[] {
  const enabled = new Set(config.enabledExchanges)
  const sources: TradeSource[] = []

  if (enabled.has('bybit')) {
    sources.push(
      new BybitPublicTradeStreamer(restClient, {
        categories: config.publicCategories,
        symbolPrefix: config.symbolPrefix,
        subscriptionChunkSize: config.subscriptionChunkSize
      })
    )
  }

  if (enabled.has('binance')) {
    sources.push(
      new BinanceTradeStreamer({
        includeFutures: config.binanceIncludeFutures
      })
    )
  }

  if (enabled.has('okx')) {
    sources.push(new OkxTradeStreamer())
  }

  if (enabled.has('coinbase')) {
    sources.push(new CoinbaseTradeStreamer())
  }

  if (enabled.has('kraken')) {
    sources.push(new KrakenTradeStreamer())
  }

  if (enabled.has('hyperliquid')) {
    sources.push(new HyperliquidTradeStreamer())
  }

  if (enabled.has('dydx')) {
    sources.push(new DydxTradeStreamer())
  }

  return sources
}
