import type { RunnerEvent, RunnerEventType } from './runner-events';
import type { SessionEvent, SessionEventType } from './session-events';

export interface IUnifiedEventBus {
  // Runner-level events
  emitRunnerEvent(event: RunnerEvent): void;
  onRunnerEvent(eventType: RunnerEventType, callback: (event: RunnerEvent) => void): () => void;
  
  // Session-level events (integration with existing mocha-multiple-sessions)
  emitSessionEvent(event: SessionEvent): void;
  onSessionEvent(eventType: SessionEventType, callback: (event: SessionEvent) => void): () => void;
  
  // Universal listener
  onAnyEvent(callback: (event: RunnerEvent | SessionEvent) => void): () => void;
  
  // Event filtering and querying
  getEventHistory(filter?: EventFilter): (RunnerEvent | SessionEvent)[];
  clearEventHistory(): void;
  
  // Event utilities
  hasListeners(eventType?: RunnerEventType | SessionEventType): boolean;
  getListenerCount(eventType?: RunnerEventType | SessionEventType): number;
  
  // Lifecycle
  destroy(): void;
}

export interface EventFilter {
  eventTypes?: (RunnerEventType | SessionEventType)[];
  sessionLabel?: string;
  timeRange?: { start: Date; end: Date };
  maxEvents?: number;
  severity?: 'info' | 'warning' | 'error';
}
