import type { InferenceProvider } from './InferenceProvider.js';
import type { NoteStatus } from '@shared/types';

export interface ClassifyStatusInput {
  provider: InferenceProvider;
  rawText: string;
  summary: string;
  reason: string;
}

export interface ClassifyStatusOutput {
  recommended: NoteStatus;
  rationale: string;
}

const VALID: readonly NoteStatus[] = ['completed', 'archived', 'trashed'];

const PROMPT_TEMPLATE = `다음 메모를 분류하세요.
가능한 status:
- completed: 작업이 끝났고 더 이상 행동 불필요
- archived: 장기 보관 — 회수 가능, 지금은 보지 않음
- trashed: 불필요, 의미 없는 메모

JSON 출력만 하세요: { "recommended": "completed|archived|trashed", "rationale": "<한 문장 한국어>" }

메모 본문:
{{rawText}}

메모 요약:
{{summary}}

사용자 이동 사유:
{{reason}}`;

const FALLBACK: ClassifyStatusOutput = {
  recommended: 'archived',
  rationale: '판단 실패 — 안전하게 보관 추천'
};

/**
 * v0.2.9 Cut B Task 9 — AI 자동 분류 (status 추천).
 *
 * provider.generateRaw 가 있으면 raw JSON 응답 사용, 없으면 generate() 재사용 시도
 * (그 경우 응답 형태 불일치로 보통 fallback). 에러/parse 실패 시 'archived' 안전 default
 * (사용자 데이터 보존 우선).
 */
export async function classifyStatus(
  input: ClassifyStatusInput
): Promise<ClassifyStatusOutput> {
  const prompt = PROMPT_TEMPLATE
    .replace('{{rawText}}', input.rawText.length > 0 ? input.rawText : '(빈 메모)')
    .replace('{{summary}}', input.summary.length > 0 ? input.summary : '(요약 없음)')
    .replace('{{reason}}', input.reason.length > 0 ? input.reason : '(사유 없음)');

  let rawJson: string;
  try {
    if (typeof input.provider.generateRaw === 'function') {
      rawJson = await input.provider.generateRaw(prompt);
    } else {
      // 호환 경로 — provider.generate 가 raw 응답을 노출하지 않으므로 안전 fallback.
      return FALLBACK;
    }
  } catch {
    return FALLBACK;
  }

  let parsed: unknown;
  try {
    parsed = JSON.parse(rawJson);
  } catch {
    return FALLBACK;
  }

  if (typeof parsed !== 'object' || parsed === null) return FALLBACK;
  const obj = parsed as { recommended?: unknown; rationale?: unknown };
  if (typeof obj.recommended !== 'string' || !VALID.includes(obj.recommended as NoteStatus)) {
    return FALLBACK;
  }
  return {
    recommended: obj.recommended as NoteStatus,
    rationale: typeof obj.rationale === 'string' ? obj.rationale : ''
  };
}
