/**
 * Escalation Engine — 인간 개입 필요성 판단.
 *
 * Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-2. 신뢰 조건 T4 의 행동 부분:
 * Confidence Engine 이 "얼마나 확실한가" 를 재면, 이 모듈은 "그래서 사람에게
 * 물어야 하는가" 를 결정한다.
 *
 * 설계서 13장 조건: 확신도 낮음 / 영향도 높음 / 정보 부족 / 규칙 충돌 → 인간 검토.
 *
 * v1 은 결정론적 규칙 (LLM 호출 없음). 출력은 답변 아래 footer — 사용자에게
 * "이 부분은 검토해 달라" 고 명시적으로 요청한다. 외부 액션 차단(승인 게이트)은
 * Track 6-3 / approvalQueue 영역으로 분리.
 */

import type { ConfidenceResult } from './confidenceEngine';
import type { CoverageResult } from './requirementGraph';

export interface EscalationDecision {
    escalate: boolean;
    /** 검토 요청 이유 (사용자에게 그대로 표시). */
    reasons: string[];
}

export interface EscalationInputs {
    confidence: ConfidenceResult;
    /** Requirement 커버리지 결과 (업무 미감지 시 ran=false). */
    coverage: CoverageResult;
    /** conflictSeverity != NONE 청크 수. */
    conflictCount: number;
}

/** 산출물 신뢰가 특히 중요한 업무 — '보통' 미만이면 검토 요청. */
const HIGH_IMPACT_TASKS = new Set(['meeting-minutes', 'market-research', 'schedule']);

/** 근거 표시가 필수인 조사 업무에서 '출처' 누락은 단독으로도 에스컬레이션 사유. */
const SOURCE_REQUIRED_TASKS = new Set(['market-research', 'work-research']);

export function decideEscalation(inputs: EscalationInputs): EscalationDecision {
    const { confidence, coverage, conflictCount } = inputs;
    const reasons: string[] = [];

    // 규칙 1 — 확신도 매우 낮음(<50): 업무 유형 무관 무조건 검토.
    if (confidence.band === 'very-low') {
        reasons.push(`확신도 매우 낮음 (${confidence.score}/100) — 추가 조사 또는 정보 제공 필요`);
    }

    // 규칙 2 — 고영향 업무 + 확신도 '보통' 미만(<70).
    if (
        confidence.score < 70 &&
        confidence.band !== 'very-low' && // 규칙 1 과 중복 방지
        coverage.ran !== false && coverage.taskId && HIGH_IMPACT_TASKS.has(coverage.taskId)
    ) {
        reasons.push(`${coverage.taskLabel} 업무인데 확신도 ${confidence.score}/100 — 사용 전 검토 권장`);
    }

    // 규칙 3 — 조사 업무에서 '출처' 요소 누락: 환각 수치 위험.
    if (coverage.ran && coverage.taskId && SOURCE_REQUIRED_TASKS.has(coverage.taskId) && coverage.missing.includes('출처')) {
        reasons.push('조사 결과에 출처 표기가 없음 — 핵심 수치·주장 검증 필요');
    }

    // 규칙 4 — 출처 간 충돌 + 확신도 90 미만: 어느 쪽을 믿을지 사용자 결정.
    if (conflictCount > 0 && confidence.score < 90) {
        reasons.push(`출처 간 충돌 ${conflictCount}건 — 어느 정보를 기준으로 할지 확인 필요`);
    }

    return { escalate: reasons.length > 0, reasons };
}

/** 에스컬레이션 footer — 검토 요청 사유 목록. 미해당 시 빈 문자열. */
export function formatEscalationFooter(decision: EscalationDecision): string {
    if (!decision.escalate) return '';
    const lines = decision.reasons.map((r) => `> - ${r}`).join('\n');
    return `\n\n> 🙋 **검토 요청** — 아래 사유로 사람 확인이 필요합니다:\n${lines}`;
}
