import { Injectable, Logger } from '@nestjs/common';
import { AiGatewayService } from '../ai/gateway/ai-gateway.service';
import { ReviewCardGenerationResultSchema } from '../ai/prompts/schemas/review-card-generation.schema';
import type { ReviewCardGenerationResult } from '../ai/prompts/schemas/review-card-generation.schema';
import type { ReviewCardGenerationSnapshot } from './review-card-generation-snapshot-builder';

/**
 * M-AI-06-04: ReviewCard Generation Executor
 *
 * 将 ReviewCard Generation 输入快照适配到统一 Job Engine 的 EXECUTE 阶段。
 *
 * 职责：
 * 1. 从 Child Snapshot 构造模型请求消息（复用现有 prompt 模板逻辑）
 * 2. 通过 AiGatewayService 调用模型（不直接导入 Provider SDK）
 * 3. 接收 timeout → 委托给 AiGatewayService 内部的 AbortController
 * 4. 返回 AiGatewayService 的原始响应（parsed output）
 *
 * 不负责（由 Engine 统一处理）：
 * - 写数据库（无副作用）
 * - 写 Job 状态
 * - 重试逻辑
 * - 写 Artifact
 * - 解析 Credential
 *
 * 兼容性（契约 §附录 B）：
 * - 使用与旧链路相同的 promptKey（review-card-generation）和 outputSchema
 * - 消息构造逻辑与 ReviewCardGenerationWorkflow.execute() 一致
 *   (src/modules/ai/workflows/review-card-generation.workflow.ts:17-43)
 * - 使用 cheap tier（与旧链路一致）
 */

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

  constructor(private readonly aiGateway: AiGatewayService) {}

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

    // 构造用户消息（与旧链路 ReviewCardGenerationWorkflow.execute() 一致）
    // workflow.ts:18-29 的消息格式：
    //   【知识点标题】+ title + 【知识点内容】+ content + cardCount 指示
    const userMessage = [
      `【知识点标题】`,
      s.title,
      '',
      `【知识点内容】`,
      s.summary,
      '',
      s.cardCount
        ? `请为以上知识点生成 ${s.cardCount} 张复习卡片。`
        : '请为以上知识点生成合适的复习卡片。',
    ].join('\n');

    this.logger.log(
      `ReviewCard Generation Executor calling AI: userId=${s.userId} ` +
      `parentJobId=${s.parentJobId} ` +
      `cardCount=${s.cardCount} ` +
      `promptKey=${s.promptKey} promptVersion=${s.promptVersion} ` +
      `modelTier=${s.modelTier} timeoutMs=${timeoutMs}`,
    );

    const response = await this.aiGateway.generate(
      {
        feature: 'review-card-generation',
        userId: s.userId,
        tier: s.modelTier as any,
        promptKey: s.promptKey,
        promptVersion: s.promptVersion,
        messages: [
          { role: 'user' as const, content: userMessage },
        ],
        outputSchema: ReviewCardGenerationResultSchema,
      },
      timeoutMs,
    );

    this.logger.log(
      `ReviewCard Generation Executor completed: userId=${s.userId} ` +
      `parentJobId=${s.parentJobId} ` +
      `cardCount=${(response.parsed as any)?.cards?.length} ` +
      `totalCount=${(response.parsed as any)?.totalCount} ` +
      `tokens=${response.usage.inputTokens}/${response.usage.outputTokens}`,
    );

    return response;
  }
}
