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

/**
 * M-AI-03-09: Result Projector 接口（ADR-003 §6.1 冻结）
 *
 * 每个 Projector 负责将 validatedOutput 投影到具体业务实体。
 * 在 Prisma Transaction 内执行，与 AiJobArtifact + markSucceeded 共享事务。
 */

export interface ArtifactReference {
  artifactType: string;
  artifactId: string;
  ordinal: number;
}

export interface ProjectionContext {
  job: {
    id: string;
    userId: string;
    jobType: string;
    targetType: string | null;
    targetId: string | null;
    snapshotId: string | null;
    promptVersion: string | null;
    outputSchemaVersion: string | null;
  };
  snapshot: any;
  validatedOutput: Record<string, any>;
}

export interface ResultProjector {
  /** 全局唯一 key，对应 JobDefinition.projectorKey */
  readonly key: string;

  /**
   * 在 Prisma Transaction 内执行投影。
   * 如果业务实体已存在（幂等），返回已有 Artifact 引用。
   */
  project(
    tx: Prisma.TransactionClient,
    context: ProjectionContext,
  ): Promise<ArtifactReference[]>;
}

/** NestJS 注入 Token */
export const RESULT_PROJECTORS = 'RESULT_PROJECTORS';
