import { Controller, Get, Param, Query } from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { Permission } from '@pac/types';
import { RequirePermission } from '../../../common/decorators/permissions.decorator';
import {
  TenantScope,
  TenantScopeContext,
} from '../../../common/decorators/tenant-scope.decorator';
import {
  RecallDebugService,
  type RecallDebugReport,
  type PatientCandidate,
  type TransactionRaw,
} from './recall-debug.service';

/**
 * 召回归因调试 — /admin/recall-debug
 *
 * 给研发用:一个患者「为什么召 / 为什么没召」一页讲清。
 *   - 为什么召:倒读 plan → reason →(evidence.factIds)→ fact →(transactionIds)→ transaction(T0 快照)
 *   - 为什么没召:跑真·引擎 ground truth + 人话闸门漏斗(合规/冷静期/已治疗/未来预约)定位卡点
 *
 * Scope:host self(TenantScope 自动锁 hostId,碰不到别家)。权限 PLATFORM_MANAGE。
 *
 * 路由顺序:静态段(search / transaction)必须在 `:patientId` 之前声明,否则会被参数路由吞掉。
 */
@ApiTags('admin')
@ApiBearerAuth('accessToken')
@Controller('admin/recall-debug')
@RequirePermission(Permission.PLATFORM_MANAGE)
export class RecallDebugController {
  constructor(private readonly debug: RecallDebugService) {}

  /** 按姓名 / 病历号 / external_id / 手机号查患者(重名返回多条供挑选)。 */
  @Get('search')
  @ApiOperation({ summary: '查患者(姓名/病历号/external_id/手机号)' })
  search(
    @TenantScope() scope: TenantScopeContext,
    @Query('q') q: string,
  ): Promise<PatientCandidate[]> {
    return this.debug.search(scope, q ?? '');
  }

  /** 链底:某 transaction 的 rawPayload(懒加载,证据链溯源最后一跳)。 */
  @Get('transaction/:txId/raw')
  @ApiOperation({ summary: '看 transaction 原始 rawPayload(证据链链底)' })
  raw(
    @TenantScope() scope: TenantScopeContext,
    @Param('txId') txId: string,
  ): Promise<TransactionRaw> {
    return this.debug.getRawPayload(scope, txId);
  }

  @Get(':patientId')
  @ApiOperation({ summary: '患者召回归因(为什么召 / 为什么没召)' })
  explain(
    @TenantScope() scope: TenantScopeContext,
    @Param('patientId') patientId: string,
  ): Promise<RecallDebugReport> {
    return this.debug.explain(scope, patientId);
  }
}
