import { Module, forwardRef } from '@nestjs/common';
import { PrismaModule } from '@core/database/prisma/prisma.module';
import { DevtrackerModule } from '@modules/devtracker/devtracker.module';
import { KnowledgeBaseModule } from '@modules/knowledge-base/knowledge-base.module';
import { ApprovalModule } from '@engines/approval/approval.module';
import { AgentSessionsController } from './controllers/sessions.controller';
import { AgentProjectsController } from './controllers/projects.controller';
import { AgentProjectsService } from './services/projects.service';
import { AgentMemoriesController, AgentAdminMemoriesController } from './controllers/memories.controller';
import { AgentMemoriesService } from './services/memories.service';
import { AgentPersonasController } from './controllers/personas.controller';
import { AgentPersonasService } from './services/personas.service';
import { AgentMessagesController } from './controllers/messages.controller';
import { AgentRoutingController } from './controllers/routing.controller';
import { AgentTrajectoryController } from './controllers/trajectory.controller';
import { AgentToolsController } from './controllers/tools.controller';
import { AgentArtifactController } from './controllers/artifact.controller';
import { AgentAdminRulesController } from './controllers/admin-rules.controller';
import { AgentArtifactService } from './artifact/artifact.service';
import { TaskTrackerService } from './subagent/task-tracker.service';
import { DelegateTaskTool } from './tools/delegate-task.tool';
import { SendMessageTool } from './tools/send-message.tool';
import { HooksRegistry } from './hooks/hooks.registry';
import { AuditHooks } from './hooks/audit.hook';
import { StorageService } from './storage/storage.service';
import { LocalStorageAdapter } from './storage/local.adapter';
import { OneDriveStorageAdapter } from './storage/onedrive.adapter';
import { EnvelopeEncryptionService } from './storage/envelope-encryption.service';
import { FileSaveTool } from './tools/file-save.tool';
import { AgentScratchpadService } from './scratchpad/scratchpad.service';
import { ScratchpadReadTool, ScratchpadWriteTool } from './tools/scratchpad.tools';
import { AskUserTool } from './tools/ask-user.tool';
import {
  FileReadTool,
  FileWriteTool,
  FileListTool,
  ClipboardReadTool,
  ClipboardWriteTool,
  NotifyPushTool,
  ShellOpenExternalTool,
  ShellExecTool,
} from './tools/client-executor.tools';
import { AgentSessionsService } from './services/sessions.service';
import { AgentMessagesService } from './services/messages.service';
import { ProviderRegistry } from './providers/provider-registry.service';
import { MockProvider } from './providers/mock.provider';
import { AnthropicProvider } from './providers/anthropic.provider';
import { OpenAIProvider } from './providers/openai.provider';
import { QwenProvider } from './providers/qwen.provider';
import { ModelRouter } from './router/model-router.service';
import { TrajectoryService } from './trajectory/trajectory.service';
import { TrajectoryAnchorService } from './trajectory/trajectory-anchor.service';
import { TrajectoryRetentionService } from './trajectory/trajectory-retention.service';
import { McpClient } from './tools/mcp-client.skeleton';
import { McpManagerService } from './services/mcp-manager.service';
import { McpAdminController } from './controllers/mcp-admin.controller';
import { QuotaService } from './quota/quota.service';
import { QueryEngine } from './engine/query-engine.service';
import { ToolRegistry } from './tools/tool-registry.service';
import { AgentToolsModule, AgentToolBootstrap } from './registry';
import { ProjectQueryTool } from './tools/project-query.tool';
import { KnowledgeQueryTool } from './tools/knowledge-query.tool';
import { WebSearchTool } from './tools/web-search.tool';
import { WebSearchService } from './services/web-search.service';
import { WebFetchTool } from './tools/web-fetch.tool';
import { WebFetchService } from './services/web-fetch.service';
import { TodoWriteTool } from './tools/todo-write.tool';
import {
  TaskCreateTool,
  TaskUpdateTool,
  TaskListTool,
  TaskStopTool,
} from './tools/task-tracker.tools';
import { AgentCronsService } from './services/crons.service';
import {
  CronCreateTool,
  CronListTool,
  CronUpdateTool,
  CronDeleteTool,
} from './tools/cron.tools';
import { ApprovalSubmitTool } from './tools/approval-submit.tool';
import {
  EnterPlanModeTool,
  ExitPlanModeTool,
  SetPermissionModeTool,
} from './tools/mode-control.tools';

@Module({
  imports: [
    PrismaModule,
    DevtrackerModule,
    KnowledgeBaseModule,
    ApprovalModule,
    // #410 PR-A: AgentToolsModule (全局, 提供 AgentToolsCollector 单例);
    // 业务模块通过 AgentToolsModule.forFeature([...]) 把 @AgentTool service 登记到全局收集器;
    // AgentToolBootstrap 在启动期扫描已登记的 service 并把方法适配为 AgentTool 注册到 ToolRegistry
    AgentToolsModule,
  ],
  controllers: [
    AgentSessionsController,
    AgentProjectsController,
    AgentMemoriesController,
    AgentAdminMemoriesController,
    AgentPersonasController,
    AgentMessagesController,
    AgentRoutingController,
    AgentTrajectoryController,
    AgentToolsController,
    AgentArtifactController,
    AgentAdminRulesController,
    McpAdminController,
  ],
  providers: [
    AgentSessionsService,
    AgentProjectsService,
    AgentMemoriesService,
    AgentPersonasService,
    AgentMessagesService,
    ProviderRegistry,
    MockProvider,
    AnthropicProvider,
    OpenAIProvider,
    QwenProvider,
    ModelRouter,
    TrajectoryService,
    QuotaService,
    QueryEngine,
    ToolRegistry,
    AgentToolBootstrap, // #410 PR-A: 启动期扫描 forFeature 登记的 service + 注册 @AgentTool 方法
    ProjectQueryTool,
    KnowledgeQueryTool,
    WebSearchService,
    WebSearchTool,
    WebFetchService,
    WebFetchTool,
    TodoWriteTool,
    TaskCreateTool,
    TaskUpdateTool,
    TaskListTool,
    TaskStopTool,
    AgentCronsService,
    CronCreateTool,
    CronListTool,
    CronUpdateTool,
    CronDeleteTool,
    ApprovalSubmitTool,
    EnterPlanModeTool,
    ExitPlanModeTool,
    SetPermissionModeTool,
    TrajectoryAnchorService,
    TrajectoryRetentionService,
    McpClient,
    AgentArtifactService,
    TaskTrackerService,
    DelegateTaskTool,
    SendMessageTool,
    HooksRegistry,
    AuditHooks,
    McpManagerService,
    StorageService,
    LocalStorageAdapter,
    OneDriveStorageAdapter,
    EnvelopeEncryptionService,
    FileSaveTool,
    AgentScratchpadService,
    ScratchpadReadTool,
    ScratchpadWriteTool,
    AskUserTool,
    FileReadTool,
    FileWriteTool,
    FileListTool,
    ClipboardReadTool,
    ClipboardWriteTool,
    NotifyPushTool,
    ShellOpenExternalTool,
    ShellExecTool,
  ],
  exports: [
    AgentSessionsService,
    AgentMessagesService,
    ProviderRegistry,
    ModelRouter,
    TrajectoryService,
    QuotaService,
    QueryEngine,
    ToolRegistry,
  ],
})
export class AgentModule {}
