/**
 * Query Router - 질의 유형 분류기 v2
 * Spec: docs/specs/260225-insuwiki-rag-spec-v2.md § 5
 *
 * 유형:
 *  A. TABLE_QUERY  - 수치 조회 (보험료/해지환급금) → Firestore 구조화 쿼리
 *  B. VECTOR_SEARCH - 횡단 비교 검색 → insurance_chunks Vector Search
 *  C. DEEP_QUERY   - 특정 약관 심층 분석 → Cloud Functions Long-Context
 *  D. COMPLEX      - 복합형 (A/B/C 조합) → 질문 분해 후 순차 처리
 *     AMBIGUOUS    - 판단 불가 → UX에서 사용자 선택 유도
 */

export type QueryType = 'TABLE_QUERY' | 'VECTOR_SEARCH' | 'DEEP_QUERY' | 'COMPLEX' | 'AMBIGUOUS';

export interface QueryContext {
    companyId?: string;
    productId?: string;
}

export function classifyQuery(question: string, context: QueryContext = {}): QueryType {
    const q = question.trim();

    // ── 수치 조회 키워드 ─────────────────────────────────────────────
    const numericKeywords = [
        '보험료', '월납', '연납', '해지환급금', '환급률', '얼마',
        '얼마야', '얼마에요', '얼마인가', '얼마입니까',
        '가격', '금액', '비용', '납입', '환급',
    ];

    // ── 횡단 비교 키워드 ─────────────────────────────────────────────
    const crossKeywords = [
        '가장', '비교', '어느 회사', '어느회사', '추천', '찾아줘', '찾아봐',
        '어디가', '어디서', '비교해줘', '어느 상품',
        '여러', '전체', '모든', '다 비교', '순위', '넓은', '높은', '낮은',
    ];

    // ── 복합 질문 키워드 (v2 §5 D형) ─────────────────────────────────
    const multiKeywords = ['그리고', '또한', '같이', '동시에', '와 ', '과 ', '그리고 '];

    const hasNumeric = numericKeywords.some(k => q.includes(k));
    const hasCross   = crossKeywords.some(k => q.includes(k));
    const hasMulti   = multiKeywords.some(k => q.includes(k));

    // D형: 복합형 — 수치+비교 혼재 or 복합 접속사
    if ((hasNumeric && hasCross) || hasMulti) {
        return 'COMPLEX';
    }

    // A형: 수치 조회 + 회사 특정
    if (hasNumeric && context.companyId) {
        return 'TABLE_QUERY';
    }

    // B형: 횡단 비교
    if (hasCross) {
        return 'VECTOR_SEARCH';
    }

    // C형: 회사+상품 모두 선택된 상태
    if (context.companyId && context.productId) {
        return 'DEEP_QUERY';
    }

    return 'AMBIGUOUS';
}

/** QueryType 한글 레이블 */
export const QUERY_TYPE_LABELS: Record<QueryType, string> = {
    TABLE_QUERY:   '💰 보험료/금액 조회',
    VECTOR_SEARCH: '🔍 여러 회사 비교 검색',
    DEEP_QUERY:    '📄 특정 약관 심층 분석',
    COMPLEX:       '🔀 복합 질문 분해 처리',
    AMBIGUOUS:     '❓ 유형 선택 필요',
};

/** QueryType 설명 (AMBIGUOUS UX 선택지) */
export const QUERY_TYPE_DESCRIPTIONS: Record<Exclude<QueryType, 'AMBIGUOUS' | 'COMPLEX'>, string> = {
    TABLE_QUERY:   '특정 상품의 보험료, 해지환급금 등 정확한 금액을 조회합니다.',
    VECTOR_SEARCH: '여러 보험사 약관에서 관련 내용을 찾아 비교합니다.',
    DEEP_QUERY:    '특정 보험 약관을 AI가 정밀하게 분석합니다. (최대 3분 소요)',
};

/**
 * 복합 질문 분해 (D형)
 * 질문을 A/B/C 단위 서브 질문으로 분해합니다.
 * 실제 AI 분해는 추후 Gemini Flash로 구현 예정.
 */
export function decomposeComplexQuery(question: string): string[] {
    // 간단한 규칙 기반 분해: 접속사 기준
    const separators = /[,，；;]|그리고|또한|와 함께|동시에/;
    const parts = question.split(separators).map(p => p.trim()).filter(Boolean);
    return parts.length > 1 ? parts : [question];
}
