export type BybitCategory = 'spot' | 'linear' | 'inverse'
export type TradeSide = 'buy' | 'sell'
export type SignalDirection = 'long' | 'short' | 'flat'
export type ExchangeClass = 'cex' | 'dex'
export type InstrumentType = 'spot' | 'perp' | 'future' | 'swap' | 'inverse'
export type ExchangeName = 'BYBIT' | 'BINANCE' | 'OKX' | 'COINBASE' | 'KRAKEN' | 'HYPERLIQUID' | 'DYDX'

export interface TapeTrade {
  exchange: ExchangeName | string
  exchangeClass: ExchangeClass
  instrumentType: InstrumentType
  symbol: string
  timestamp: number
  price: number
  size: number
  notionalUsd: number
  side: TradeSide
  tradeId?: string
  raw?: unknown
}

export interface TapeExchangeBreakdown {
  exchange: string
  tradeCount: number
  notionalUsd: number
  share: number
}

export interface TapeWindowStats {
  windowMs: number
  tradeCount: number
  buyCount: number
  sellCount: number
  totalNotionalUsd: number
  buyNotionalUsd: number
  sellNotionalUsd: number
  deltaRatio: number
  largeTradeCount: number
  largestTradeUsd: number
  firstPrice: number | null
  lastPrice: number | null
  highPrice: number | null
  lowPrice: number | null
  vwap: number | null
  spreadBps: number
  priceMoveBps: number
  notionalPerSecond: number
  cexNotionalUsd: number
  dexNotionalUsd: number
  exchangeBreakdown: TapeExchangeBreakdown[]
}

export interface SignalComponent {
  name: string
  score: number
  direction: SignalDirection
  note: string
}

export interface TapeSignalSnapshot {
  asOf: number
  fast: TapeWindowStats
  slow: TapeWindowStats
  components: SignalComponent[]
  composite: SignalComponent
  reasons: string[]
}

export interface BybitInstrument {
  symbol: string
  baseCoin?: string
  quoteCoin?: string
  status?: string
}
