/**
 * 内置 audit hook —— 把每个 PreToolUse / PostToolUse 事件落到 TrajectoryService。
 *
 * 现有 messages.service 在 tool 调用前后直接调 trajectory.append；本 hook 把这部分
 * **标准化** 为 hook 调用，让后续业务也能像审计一样挂多个 hook（不用改 messages.service）。
 *
 * 注：当前 trajectory.append 仍由 messages.service 直接调（不通过 hook），是双轨。
 * Phase 2 把内置写 trajectory 这部分迁到 hook，让所有审计都走 hook 通道。
 *
 * 本 hook 当前作用：debug log + 计数（不重复落 trajectory，避免 PR 大改）。
 */

import { Injectable, OnModuleInit, Logger } from '@nestjs/common';
import { HooksRegistry } from './hooks.registry';

@Injectable()
export class AuditHooks implements OnModuleInit {
  private readonly logger = new Logger(AuditHooks.name);

  constructor(private readonly hooks: HooksRegistry) {}

  onModuleInit(): void {
    this.hooks.registerPreToolUse('audit', (ctx) => {
      this.logger.debug(`[pre_tool_use] ${ctx.toolName} session=${ctx.sessionId.slice(0, 8)}`);
    }, 10);
    this.hooks.registerPostToolUse('audit', (ctx) => {
      const status = ctx.ok ? 'ok' : 'fail';
      this.logger.debug(
        `[post_tool_use] ${ctx.toolName} ${status} in ${ctx.durationMs}ms session=${ctx.sessionId.slice(0, 8)}`,
      );
    }, 10);
    this.hooks.registerOnTurnStart('audit', (ctx) => {
      this.logger.debug(`[on_turn_start] session=${ctx.sessionId.slice(0, 8)} turn=${ctx.turnId.slice(0, 8)}`);
    }, 10);
    this.hooks.registerOnTurnEnd('audit', (ctx) => {
      this.logger.debug(
        `[on_turn_end] session=${ctx.sessionId.slice(0, 8)} iter=${ctx.iterations} latency=${ctx.totalLatencyMs}ms tokens=${ctx.totalInputTokens}+${ctx.totalOutputTokens}`,
      );
    }, 10);
  }
}
