import { Injectable, Logger } from '@nestjs/common';
import { AiGatewayService } from '../ai/gateway/ai-gateway.service';
import { ActiveRecallAnalysisResultSchema } from '../ai/prompts/schemas/active-recall-analysis.schema';
import type { ActiveRecallAnalysisResult } from '../ai/prompts/schemas/active-recall-analysis.schema';
import type { ActiveRecallSnapshot } from './active-recall-snapshot-builder';

/**
 * M-AI-04-03: Active Recall Executor
 *
 * 将 ActiveRecall 输入快照适配到统一 Job Engine 的 EXECUTE 阶段。
 *
 * 职责：
 * 1. 从 Snapshot 构造模型请求消息（复用现有 prompt 模板逻辑）
 * 2. 通过 AiGatewayService 调用模型（不直接导入 Provider SDK）
 * 3. 接收 timeout → 委托给 AiGatewayService 内部的 AbortController
 * 4. 返回 AiGatewayService 的原始响应（parsed output）
 *
 * 不负责（由 Engine 统一处理）：
 * - 写数据库（无副作用）
 * - 写 Job 状态
 * - 重试逻辑
 * - 写 Artifact
 * - 解析 Credential
 *
 * 兼容性：
 * - 使用与旧链路相同的 promptKey（active-recall-analysis）和 outputSchema
 * - 消息构造逻辑与 ActiveRecallAnalysisWorkflow.execute() 一致
 */

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

  constructor(private readonly aiGateway: AiGatewayService) {}

  /**
   * 执行 ActiveRecall AI 分析。
   *
   * @param snapshot - ActiveRecallSnapshot（由 SnapshotBuilder 产出）
   * @param timeoutMs - 超时毫秒数（来自 Definition.execution.timeoutMs）
   * @returns AiGateway 响应（含 parsed + usage）
   */
  async execute(
    snapshot: ActiveRecallSnapshot,
    timeoutMs: number,
  ) {
    const s = snapshot.snapshot;

    // 构造用户消息（与旧链路 ActiveRecallAnalysisWorkflow.execute() 一致）
    // M-AI-04-01 发现 #5：knowledgeItemContent 当前为空字符串（legacy 行为）
    // 未来可通过 knowledgeItemId 查询实际内容
    const userMessage = [
      `【知识点原文】`,
      '',  // ← knowledgeItemContent: legacy 传递空字符串，Executor 复现此行为
      '',
      `【用户的主动回忆回答】`,
      s.userAnswer,
      '',
      `请根据以上内容进行分析。`,
    ].join('\n');

    this.logger.log(
      `ActiveRecall Executor calling AI: userId=${s.userId} ` +
      `answerId=${s.answerId} ` +
      `promptKey=${s.promptKey} promptVersion=${s.promptVersion} ` +
      `model=${s.modelProvider}/${s.modelName} timeoutMs=${timeoutMs} ` +
      `temperature=${s.temperature}`,
    );

    // temperature: Snapshot 记录的 temperature（来自 AI_GATEWAY_DEFAULT_TEMPERATURE）
    // 与 AiGatewayService.generate() 内部硬编码值（ai-gateway.service.ts:62）一致。
    // GatewayRequest 接口当前不含 temperature 字段，因此无法从外部显式传入。
    // 若 AiGateway 的默认 temperature 变更，需同步更新 SnapshotBuilder 中的
    // AI_GATEWAY_DEFAULT_TEMPERATURE 常量（active-recall-snapshot-builder.ts:45）。
    const response = await this.aiGateway.generate(
      {
        feature: 'active-recall-analysis',
        userId: s.userId,
        tier: s.modelTier as any,
        promptKey: s.promptKey,
        promptVersion: s.promptVersion,
        messages: [
          { role: 'user' as const, content: userMessage },
        ],
        outputSchema: ActiveRecallAnalysisResultSchema,
        maxTokens: s.maxTokens,
      },
      timeoutMs,
    );

    this.logger.log(
      `ActiveRecall Executor completed: userId=${s.userId} ` +
      `answerId=${s.answerId} ` +
      `score=${(response.parsed as any)?.score} ` +
      `tokens=${response.usage.inputTokens}/${response.usage.outputTokens}`,
    );

    return response;
  }
}
