import type { WorkerEnvironment } from './environment.js'

export type HealthStatus = 'starting' | 'ready' | 'stopping' | 'stopped' | 'failed'

export type HealthSnapshot = Readonly<{
  status: HealthStatus
  workerId: string
  startedAt: Date
  checkedAt: Date
  detail?: string
}>

export interface HealthReporter {
  setStatus(status: HealthStatus, detail?: string): void
  snapshot(): HealthSnapshot
}

export interface Metrics {
  increment(name: string, labels?: Readonly<Record<string, string>>): void
  observe(name: string, value: number, labels?: Readonly<Record<string, string>>): void
}

export interface WorkerLoop {
  start(context: Readonly<{ environment: WorkerEnvironment; signal: AbortSignal }>): Promise<void>
}

export interface WorkerService {
  start(): Promise<void>
  stop(reason?: string): Promise<void>
  health(): HealthSnapshot
}

export interface WorkerDependencies {
  loop: WorkerLoop
  health: HealthReporter
  metrics: Metrics
  now?: () => Date
  setTimer?: typeof setTimeout
  clearTimer?: typeof clearTimeout
}
