import type { AiResponse } from './schema.js';
import type { ParseResult } from '../services/dueDateParser.js';

export interface GenerateInput {
  text: string;
  todayKst: string; // ISO YYYY-MM-DD in KST
  dueDateCandidates: ParseResult[];
  vocab?: string[]; // v0.2.3 #3 — top-N kebab-case 태그. 미전달 시 빈 배열로 처리.
  // v0.3.1 Cut F — 첨부 이미지. 미전달 시 텍스트 전용 처리.
  images?: Array<{ base64: string; mime: string }>;
}

export interface GenerateOptions {
  /** v0.3.1 Cut F — vision 전용 model 지정. null/미전달 시 기본 model 사용. */
  visionModel?: string | null;
}

export interface HealthResult { ok: boolean; model?: string; reason?: string; }

export interface InferenceProvider {
  readonly name: string;
  generate(input: GenerateInput, opts?: GenerateOptions): Promise<AiResponse>;
  healthCheck(): Promise<HealthResult>;
  /** v0.2.3.1 — 외부에서 in-flight generate 강제 중단. ProviderHolder.replace 시 사용. */
  abort?: () => void;
  /**
   * v0.2.9 Cut B Task 9 — raw JSON 응답 호출. classifyStatus 같은 자체 prompt 호출용.
   * Ollama `/api/generate` 의 raw `response` 문자열을 그대로 반환한다 (보통 JSON 문자열).
   * 미구현 provider 는 undefined; classifyStatus 는 그 경우 안전 fallback 으로 동작.
   */
  generateRaw?: (prompt: string) => Promise<string>;
}
