/**
 * M-AI-03-04: Job Definition TypeScript 接口（冻结）
 *
 * 对应 ADR-003 §2.1。后续 Issue 不得自行扩展此接口。
 */

/** 允许的队列名（ADR-003 §3.1） */
export const ALLOWED_QUEUE_NAMES = ['ai-interactive', 'ai-background'] as const;
export type AllowedQueueName = (typeof ALLOWED_QUEUE_NAMES)[number];

/** 允许的凭据模式 */
export const ALLOWED_CREDENTIAL_MODES = [
  'platform_key',
  'user_deepseek_key',
] as const;

export type AllowedCredentialMode = (typeof ALLOWED_CREDENTIAL_MODES)[number];

export interface JobDefinition {
  /** 全局唯一 jobType，与 AiJob.jobType 对应。必须匹配 /^[a-z][a-z0-9_]{1,63}$/ */
  readonly jobType: string;

  /** 元数据 */
  readonly metadata: {
    /** 人类可读标签 */
    readonly label: string;
    /** 描述 */
    readonly description: string;
    /** 所属领域 */
    readonly domain: 'analysis' | 'generation' | 'import' | 'maintenance';
    /** 版本 */
    readonly version: string;
  };

  /** 路由策略 */
  readonly queue: {
    /** 目标队列名 */
    readonly queueName: AllowedQueueName;
    /** 优先级 0=最高, 100=最低 */
    readonly defaultPriority: number;
  };

  /** 执行策略 */
  readonly execution: {
    /** 超时（毫秒），范围 [1000, 600000] */
    readonly timeoutMs: number;
    /** 最大重试次数，范围 [0, 10] */
    readonly maxRetries: number;
    /** BullMQ 重试退避 */
    readonly retryBackoff: { type: 'exponential'; delay: number };
    /** 是否支持取消 */
    readonly cancellable: boolean;
    /** AbortSignal 超时后行为 */
    readonly abortStrategy: 'fail' | 'retry';
  };

  /** 输入 Schema 版本（对应 SnapshotBuilder 产出） */
  readonly input: {
    readonly schemaVersion: string;
  };

  /** 输出 Schema 版本（对应 AI Provider 产出 JSON Schema） */
  readonly output: {
    readonly schemaVersion: string;
  };

  /** Prompt 配置 */
  readonly prompt: {
    readonly promptKey: string;
    readonly promptVersion: string;
  };

  /** 模型配置 */
  readonly model: {
    readonly modelTier: string;
    readonly modelProvider: string;
    readonly modelName: string;
    /** 请求最大 token */
    readonly maxTokens?: number;
  };

  /** 凭据模式 */
  readonly credential: {
    /** 支持的凭据模式 */
    readonly allowedModes: readonly AllowedCredentialMode[];
    /** 默认模式 */
    readonly defaultMode: AllowedCredentialMode;
  };

  /** Projector key（对应 ResultProjector 注册 key） */
  readonly projectorKey?: string;

  /** 安全约束 */
  readonly security: {
    /** 是否需要内容安全检查 */
    readonly contentSafetyCheck: boolean;
    /** 输出是否需要脱敏后存储 */
    readonly outputRedaction: boolean;
  };
}
