import { Module } from '@nestjs/common';
import { BullBoardModule } from '@bull-board/nestjs';
import { ExpressAdapter } from '@bull-board/express';
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter';
import { BullModule } from '@nestjs/bullmq';
import { QueueName } from './queue-names';

/**
 * Bull Board UI — 挂到 /admin/queues 路径,可视化队列状态(active/waiting/failed)。
 *
 * ⚠️ **默认不挂载**;要用得显式设 `PAC_BULL_BOARD=1`(见 app.module.ts 的条件 import)。
 *
 * 【为什么默认关】原注释写的是「本路由由 NestJS 路由系统接管;需要走全局 JwtAuthGuard」——
 *   **这条不成立**。`@bull-board/nestjs` 用 ExpressAdapter 自己挂了一个独立的 Express handler,
 *   压根不经过 Nest 的路由与守卫。2026-08-05 从公网实测旧生产(网关把 /admin/queues 转到了 3101):
 *     GET /admin/queues              → 200,面板 HTML
 *     GET /admin/queues/api/queues   → 200,队列数据,且 `readOnlyMode:false` `allowRetries:true`
 *   即:未鉴权就能翻 job payload(含 patientId / hostId / tenantId)并重试、清理任务。
 *
 *   加守卫要在 Express 中间件层做,而这个面板平时没人用(前端没有任何入口链接,只在
 *   docs/monitoring 里作为排障手段提过),所以选了成本最低的解法:**默认不挂载**。
 *   本地 / 测试排查队列时 `PAC_BULL_BOARD=1 pnpm dev` 即可。
 *
 *   ⚠️ 注意:关掉的只是这个**面板**。队列本身、定时任务、job 消费全部照常 —— 它只是个查看器。
 */
@Module({
  imports: [
    BullBoardModule.forRoot({
      route: '/admin/queues',
      adapter: ExpressAdapter,
    }),
    BullBoardModule.forFeature(
      { name: QueueName.PERSONA_RECOMPUTE, adapter: BullMQAdapter },
      { name: QueueName.PLAN_RECOMPUTE, adapter: BullMQAdapter },
      { name: QueueName.PLAN_ASSET_GENERATE, adapter: BullMQAdapter },
    ),
    // 必须重新 import,Bull Board 内部要读到对应 BullQueue token
    BullModule.registerQueue(
      { name: QueueName.PERSONA_RECOMPUTE },
      { name: QueueName.PLAN_RECOMPUTE },
      { name: QueueName.PLAN_ASSET_GENERATE },
    ),
  ],
})
export class QueuesBullBoardModule {}
