export * from './composition.js'
export * from './contracts.js'
export * from './environment.js'
export * from './observability.js'

import { composeWorker } from './composition.js'
import type { WorkerDependencies, WorkerService } from './contracts.js'
import type { WorkerEnvironment } from './environment.js'
import { createHealthReporter, noopMetrics } from './observability.js'

/** Composition root for host adapters. All operational behavior remains injected. */
export function createWorkerShell(
  environment: WorkerEnvironment,
  dependencies: Pick<WorkerDependencies, 'loop'> & Partial<Omit<WorkerDependencies, 'loop'>>,
): WorkerService {
  return composeWorker(environment, {
    loop: dependencies.loop,
    health: dependencies.health ?? createHealthReporter(environment.workerId, dependencies.now),
    metrics: dependencies.metrics ?? noopMetrics,
    ...(dependencies.now ? { now: dependencies.now } : {}),
    ...(dependencies.setTimer ? { setTimer: dependencies.setTimer } : {}),
    ...(dependencies.clearTimer ? { clearTimer: dependencies.clearTimer } : {}),
  })
}
