import { Module } from '@nestjs/common';
import { HarnessRegistry } from './harness.registry.js';
import { HarnessService } from './harness.service.js';
import {
  HARNESS_CONVERSATION_SERVICE,
  HARNESS_CONVERSATION_SERVICE_UNAVAILABLE,
  HARNESS_REGISTRY,
  HARNESS_SERVICE,
} from './harness.tokens.js';
import { HarnessController } from './harness.controller.js';
import { HarnessSelectionController } from './harness-selection.controller.js';
import { HarnessSelectionService } from './harness-selection.service.js';
import { HarnessSelectionRepository } from './harness-selection.repository.js';

/**
 * Wires the harness-neutral registry/service (Task Two) together with the
 * Slice-Zero catalog and selection HTTP surfaces (Task Three).
 *
 * The registry is provided empty here; real harness adapters are registered in a
 * later task. Because the controllers/services resolve their collaborators through
 * this real module graph, an unresolved provider fails loudly at `app.init()`.
 */
@Module({
  controllers: [HarnessController, HarnessSelectionController],
  providers: [
    { provide: HARNESS_REGISTRY, useFactory: () => new HarnessRegistry() },
    { provide: HARNESS_SERVICE, useClass: HarnessService },
    // Task Five: bind the conversation-service token to its explicit "not yet bound"
    // sentinel. The pi-rpc router treats this as a hard, typed startup failure; Task 14
    // replaces it with a real service. Exported so ChatModule's router can inject it.
    { provide: HARNESS_CONVERSATION_SERVICE, useValue: HARNESS_CONVERSATION_SERVICE_UNAVAILABLE },
    HarnessSelectionRepository,
    HarnessSelectionService,
  ],
  exports: [HARNESS_REGISTRY, HARNESS_SERVICE, HARNESS_CONVERSATION_SERVICE],
})
export class HarnessModule {}
