/**
 * Hooks 类型定义 —— Agent 生命周期事件挂载点（对齐 CC 的 6 个）。
 *
 * 设计：
 * - 每个事件有自己的 context 类型
 * - hook 函数返回 void（监听 / 副作用）或 partial context（修改 — 仅 PreToolUse / OnAssistantText）
 * - hook 同步顺序执行；返回 reject = true 则阻断后续 hook + 主流程（仅 PreToolUse 用）
 * - hook 抛错：写 warn log，不阻塞主流程（fail-soft）
 *
 * 用途：
 * - 审计：把每个 tool call 落 trajectory（已部分实现，hooks 让它标准化）
 * - 安全门：PreToolUse 检查 args 含敏感字段 → 拒绝 / 脱敏
 * - 业务定制：org 级 hook（比如"调 approval_submit 前自动加签金额>1万的审批人"）
 * - Cost tracking：OnAssistantText 算 token 成本
 */

import type { AgentMessage } from '@prisma/client';

/** 所有 hook context 共享字段 */
export interface HookBaseContext {
  organizationId: string;
  userId: string;
  sessionId: string;
  turnId: string;
}

export interface OnTurnStartContext extends HookBaseContext {
  /** 用户原始 prompt */
  prompt: string;
}

export interface PreToolUseContext extends HookBaseContext {
  toolName: string;
  input: Record<string, unknown>;
  /** hook 返回值可有 { reject: true, reason: '...' } 阻断该工具调用 */
}

export interface PreToolUseResult {
  reject?: boolean;
  reason?: string;
  /** 可选：修改 input 后传给工具 */
  patchedInput?: Record<string, unknown>;
}

export interface PostToolUseContext extends HookBaseContext {
  toolName: string;
  input: Record<string, unknown>;
  ok: boolean;
  output: unknown;
  errorMessage?: string;
  durationMs: number;
}

export interface OnAssistantTextContext extends HookBaseContext {
  text: string;
  model: string;
  /** hook 可返回 { patchedText: '...' } 改写文本 */
}

export interface OnAssistantTextResult {
  patchedText?: string;
}

export interface PostCompactContext extends HookBaseContext {
  /** compaction 节省的 token 数估算 */
  savedTokens: number;
  beforeMessageCount: number;
  afterMessageCount: number;
}

export interface OnTurnEndContext extends HookBaseContext {
  totalLatencyMs: number;
  iterations: number;
  stopReason: string;
  totalInputTokens: number;
  totalOutputTokens: number;
  /** turn 内所有 message（含 user/assistant/tool 等） */
  messages: AgentMessage[];
}

/** hook 函数签名 */
export type OnTurnStartHook = (ctx: OnTurnStartContext) => Promise<void> | void;
export type PreToolUseHook = (ctx: PreToolUseContext) => Promise<PreToolUseResult | void> | PreToolUseResult | void;
export type PostToolUseHook = (ctx: PostToolUseContext) => Promise<void> | void;
export type OnAssistantTextHook = (ctx: OnAssistantTextContext) => Promise<OnAssistantTextResult | void> | OnAssistantTextResult | void;
export type PostCompactHook = (ctx: PostCompactContext) => Promise<void> | void;
export type OnTurnEndHook = (ctx: OnTurnEndContext) => Promise<void> | void;

export type HookEvent =
  | 'on_turn_start'
  | 'pre_tool_use'
  | 'post_tool_use'
  | 'on_assistant_text'
  | 'post_compact'
  | 'on_turn_end';
