<?php
/**
* Service Definitions for DI Container.
*
* All repositories and services are explicitly registered to ensure
* proper database connections and avoid instantiation in controllers.
*
* @param Framework\Container $container
*/
use Application\ContentCollectionService;
use Application\PipelineStepService;
use Framework\Container;
use Infrastructure\AI\AIConfig;
use Infrastructure\AI\ChatService;
use Infrastructure\AI\OllamaService;
use Infrastructure\AI\QdrantService;
use Infrastructure\AI\VectorSearchService;
use Infrastructure\Config\DatabaseFactory;
use Infrastructure\Docs\ChunkSyncService;
use Infrastructure\Docs\HybridSearchService;
use Infrastructure\Formatter\ApiResponseFormatter;
use Infrastructure\Formatting\ChatMessageFormatter;
use Infrastructure\Logging\AuditLogger;
use Infrastructure\Persistence\ChatMessageRepository;
use Infrastructure\Persistence\ChatSessionRepository;
use Infrastructure\Persistence\CollectionRepository;
use Infrastructure\Persistence\ContentConfigRepository;
use Infrastructure\Persistence\ContentRepository;
use Infrastructure\Persistence\ContractRepository;
use Infrastructure\Persistence\CriticsRepository;
use Infrastructure\Persistence\DokumentationRepository;
use Infrastructure\Persistence\FileBackupRepository;
use Infrastructure\Persistence\KiProtokollRepository;
use Infrastructure\Persistence\PipelineRepository;
use Infrastructure\Persistence\PromptsRepository;
use Infrastructure\Persistence\SystemExplorerRepository;
use Infrastructure\Persistence\TaskAssignmentRepository;
use Infrastructure\Persistence\TaskCommentRepository;
use Infrastructure\Persistence\TaskRepository;
use Infrastructure\Persistence\TaskResultRepository;
use Infrastructure\SemanticExplorerRepository;
use Infrastructure\Validation\CollectionValidator;
use Domain\Repository\ChatMessageRepositoryInterface;
use Domain\Repository\ChatSessionRepositoryInterface;
use Domain\Repository\CollectionRepositoryInterface;
use Domain\Repository\TaskRepositoryInterface;
use Infrastructure\AI\ContentQualityValidator;
use UseCases\Chat\ExportChatSessionUseCase;
use UseCases\Chat\ManageChatSessionsUseCase;
use UseCases\Chat\SendChatMessageUseCase;
use UseCases\Config\ManageConfigUseCase;
use UseCases\Content\GenerateContentUseCase;
use UseCases\Critics\ManageCriticsUseCase;
use UseCases\Docs\DocumentationChatUseCase;
use UseCases\Pipeline\PipelineRunStatusUseCase;
use UseCases\Pipeline\RunPipelineUseCase;
use UseCases\Pipeline\UpdatePipelineConfigUseCase;
use UseCases\Prompts\ManagePromptsUseCase;
use UseCases\Protokoll\ViewProtokollUseCase;
use UseCases\Task\AssignTaskUseCase;
use UseCases\Task\CreateTaskUseCase;
use UseCases\Task\DeleteTaskUseCase;
use UseCases\Task\ExecuteAITaskUseCase;
use UseCases\Task\GetTasksUseCase;
use UseCases\Task\SaveTaskResultUseCase;
use UseCases\Task\UpdateTaskStatusUseCase;
return function (Container $container): void {
// =========================================================================
// DATABASE CONNECTIONS
// =========================================================================
// ki_dev database connection
$container->set('pdo.dev', fn () => DatabaseFactory::dev());
// ki_content database connection
$container->set('pdo.content', fn () => DatabaseFactory::content());
// =========================================================================
// REPOSITORIES - ki_dev database
// =========================================================================
$container->set(SystemExplorerRepository::class, fn () => new SystemExplorerRepository());
$container->set(DokumentationRepository::class, fn () => new DokumentationRepository());
$container->set(FileBackupRepository::class, fn () => new FileBackupRepository());
$container->set(ContractRepository::class, fn () => new ContractRepository());
$container->set(TaskRepository::class, fn () => new TaskRepository());
$container->set(TaskAssignmentRepository::class, fn () => new TaskAssignmentRepository());
$container->set(TaskResultRepository::class, fn () => new TaskResultRepository());
$container->set(TaskCommentRepository::class, fn () => new TaskCommentRepository());
$container->set(KiProtokollRepository::class, fn () => new KiProtokollRepository());
$container->set(CollectionRepository::class, fn () => new CollectionRepository());
$container->set(PipelineRepository::class, fn () => new PipelineRepository());
// =========================================================================
// REPOSITORIES - ki_content database
// =========================================================================
$container->set(ContentRepository::class, fn () => new ContentRepository());
$container->set(SemanticExplorerRepository::class, fn () => new SemanticExplorerRepository());
$container->set(ChatSessionRepository::class, fn () => new ChatSessionRepository());
$container->set(ChatMessageRepository::class, fn () => new ChatMessageRepository());
$container->set(PromptsRepository::class, fn () => new PromptsRepository());
$container->set(CriticsRepository::class, fn () => new CriticsRepository());
$container->set(ContentConfigRepository::class, fn () => new ContentConfigRepository());
// =========================================================================
// INTERFACE ALIASES (Domain → Infrastructure)
// =========================================================================
$container->set(TaskRepositoryInterface::class, fn (Container $c) => $c->get(TaskRepository::class));
$container->set(ChatSessionRepositoryInterface::class, fn (Container $c) => $c->get(ChatSessionRepository::class));
$container->set(ChatMessageRepositoryInterface::class, fn (Container $c) => $c->get(ChatMessageRepository::class));
$container->set(CollectionRepositoryInterface::class, fn (Container $c) => $c->get(CollectionRepository::class));
// =========================================================================
// AI SERVICES
// =========================================================================
$container->set(AIConfig::class, fn () => AIConfig::fromCredentialsFile());
$container->set(ChatService::class, function (Container $c) {
return $c->get(AIConfig::class)->createChatService();
});
$container->set(OllamaService::class, function (Container $c) {
return $c->get(AIConfig::class)->createOllamaService();
});
$container->set(QdrantService::class, function (Container $c) {
return $c->get(AIConfig::class)->createQdrantService();
});
$container->set(VectorSearchService::class, fn () => new VectorSearchService());
// =========================================================================
// APPLICATION SERVICES
// =========================================================================
$container->set(AuditLogger::class, fn () => new AuditLogger());
$container->set(ChunkSyncService::class, fn () => new ChunkSyncService());
$container->set(HybridSearchService::class, fn () => new HybridSearchService());
$container->set(CollectionValidator::class, function (Container $c) {
return new CollectionValidator($c->get(CollectionRepository::class));
});
$container->set(ContentCollectionService::class, function (Container $c) {
return new ContentCollectionService(
$c->get(CollectionRepository::class),
$c->get(CollectionValidator::class)
);
});
$container->set(PipelineStepService::class, function (Container $c) {
return new PipelineStepService($c->get(PipelineRepository::class));
});
// =========================================================================
// USE CASES
// =========================================================================
$container->set(DocumentationChatUseCase::class, function (Container $c) {
return new DocumentationChatUseCase(
$c->get(ChunkSyncService::class),
$c->get(OllamaService::class)
);
});
$container->set(RunPipelineUseCase::class, function (Container $c) {
return new RunPipelineUseCase($c->get(PipelineRepository::class));
});
$container->set(PipelineRunStatusUseCase::class, function (Container $c) {
return new PipelineRunStatusUseCase($c->get(PipelineRepository::class));
});
$container->set(UpdatePipelineConfigUseCase::class, function (Container $c) {
return new UpdatePipelineConfigUseCase($c->get(PipelineRepository::class));
});
// =========================================================================
// FORMATTERS
// =========================================================================
$container->set(ApiResponseFormatter::class, fn () => new ApiResponseFormatter());
$container->set(ChatMessageFormatter::class, fn () => new ChatMessageFormatter());
// =========================================================================
// ADDITIONAL USE CASES
// =========================================================================
$container->set(ManageCriticsUseCase::class, fn () => new ManageCriticsUseCase());
$container->set(GenerateContentUseCase::class, fn () => new GenerateContentUseCase());
$container->set(ManageChatSessionsUseCase::class, fn () => new ManageChatSessionsUseCase());
$container->set(SendChatMessageUseCase::class, fn () => new SendChatMessageUseCase());
$container->set(ExportChatSessionUseCase::class, fn () => new ExportChatSessionUseCase());
$container->set(ViewProtokollUseCase::class, fn () => new ViewProtokollUseCase());
// =========================================================================
// TASK USE CASES
// =========================================================================
$container->set(GetTasksUseCase::class, fn () => new GetTasksUseCase());
$container->set(CreateTaskUseCase::class, fn () => new CreateTaskUseCase());
$container->set(DeleteTaskUseCase::class, fn () => new DeleteTaskUseCase());
$container->set(AssignTaskUseCase::class, fn () => new AssignTaskUseCase());
$container->set(UpdateTaskStatusUseCase::class, fn () => new UpdateTaskStatusUseCase());
$container->set(SaveTaskResultUseCase::class, fn () => new SaveTaskResultUseCase());
$container->set(ExecuteAITaskUseCase::class, fn () => new ExecuteAITaskUseCase());
};