import type { BatchProgressData, BatchExecutionResult } from '../core/batch-execution';
import type { SessionMeta, TestStats } from '../core/types';

export type RunnerEventType = 
  | 'runner:initialized'
  | 'runner:session-defined' 
  | 'runner:batch-started'
  | 'runner:batch-progress'
  | 'runner:batch-completed'
  | 'runner:batch-failed'
  | 'runner:report-generated'
  | 'runner:combined-report-generated'
  | 'runner:cleared'
  | 'runner:destroyed'
  | 'runner:config-updated';

export interface RunnerEvent {
  type: RunnerEventType;
  timestamp: Date;
  data?: RunnerEventData;
}

export type RunnerEventData = 
  | InitializedEventData
  | SessionDefinedEventData
  | BatchStartedEventData
  | BatchProgressEventData
  | BatchCompletedEventData
  | BatchFailedEventData
  | ReportGeneratedEventData
  | CombinedReportGeneratedEventData
  | ClearedEventData
  | ConfigUpdatedEventData;

export interface InitializedEventData {
  configUsed: any;
  sessionCount: number;
  timestamp: Date;
}

export interface SessionDefinedEventData {
  sessionLabel: string;
  sessionMeta: SessionMeta;
  totalSessions: number;
}

export interface BatchStartedEventData {
  sessionLabels: string[];
  totalSessions: number;
  executionMode: 'sequential' | 'parallel';
  options: any;
}

export interface BatchProgressEventData extends BatchProgressData {
  sessionResults?: Record<string, any>;
}

export interface BatchCompletedEventData extends BatchExecutionResult {
  // Additional completion data
}

export interface BatchFailedEventData {
  error: Error;
  completedSessions: string[];
  failedSession?: string;
  partialResults: Record<string, any>;
}

export interface ReportGeneratedEventData {
  reportType: 'session';
  sessionLabel: string;
  reportSize: number;
  generatedAt: Date;
  stats: TestStats;
}

export interface CombinedReportGeneratedEventData {
  reportType: 'combined';
  totalSessions: number;
  reportSize: number;
  generatedAt: Date;
  summary: any;
}

export interface ClearedEventData {
  clearedSessions: string[];
  clearedReports: string[];
}

export interface ConfigUpdatedEventData {
  oldConfig: any;
  newConfig: any;
  changes: string[];
}
