/**
 * config/normalizeMap 시드 스크립트
 *
 * Firestore config/normalizeMap 문서에 정규화 테이블을 시드합니다.
 * insurance_terms의 commonAliases를 기반으로 자동 생성하며,
 * 추가 하드코딩 정규화 규칙도 포함합니다.
 *
 * 사용법:
 *   npx ts-node scripts/seed-normalize-map.ts           # 실제 실행
 *   npx ts-node scripts/seed-normalize-map.ts --dry-run  # dry-run 모드
 *
 * MT-6: normalizeMap 시드 스크립트
 * 생성일: 2026-03-22
 */

import * as admin from 'firebase-admin';
import * as path from 'path';
import * as fs from 'fs';

// ============================================================
// Firebase Admin 초기화
// ============================================================
if (!admin.apps.length) {
    const localKeyPath = path.resolve(__dirname, '../temp.j2h/insuwiki-j2h-902be7d0b6f5.json');
    if (fs.existsSync(localKeyPath)) {
        try {
            const serviceAccount = JSON.parse(fs.readFileSync(localKeyPath, 'utf8'));
            admin.initializeApp({
                credential: admin.credential.cert(serviceAccount),
                projectId: 'insuwiki-j2h',
            });
        } catch {
            admin.initializeApp();
            console.warn('⚠️ 서비스 계정 키 파싱 실패 — 기본 인증 사용');
        }
    } else {
        admin.initializeApp();
    }
}

const db = admin.firestore();

// ============================================================
// 정규화 맵 초기 데이터
// insurance_terms의 commonAliases 기반 + 추가 하드코딩 규칙
//
// 형식: { "원본 표기": "정규화된 표기" }
// 용도: 공백이나 표기 차이가 있는 용어를 통일된 형태로 매핑
// ============================================================

// TODO: insurance_terms 컬렉션이 존재하면 commonAliases를 읽어서 자동으로 normalizeMap을 확장하는 로직 추가
// 현재는 하드코딩된 초기 데이터만 포함
const HARDCODED_NORMALIZE_MAP: Record<string, string> = {
    // 뇌혈관질환 계열
    '뇌혈관 질환': '뇌혈관질환',
    '뇌 졸중': '뇌졸중',
    '뇌 경색': '뇌경색',

    // 심장질환 계열
    '심 근경색': '심근경색',
    '심장 마비': '심장마비',
    '심장 발작': '심장발작',
    '허혈성 심장질환': '허혈성심장질환',

    // 암 관련
    '악성 신생물': '악성신생물',
    '암 보험': '암보험',
    '암 보험금': '암보험금',

    // 보험 용어
    '보험 계약': '보험계약',
    '보험 계약자': '보험계약자',
    '피 보험자': '피보험자',
    '보험 수익자': '보험수익자',
    '보험 기간': '보험기간',
    '보험료 납입': '보험료납입',
    '입원 일당': '입원일당',
    '수술 보험금': '수술보험금',
    '장기 요양': '장기요양',
    '실손 보험': '실손보험',
    '실손 의료비': '실손의료비',

    // 진단 관련
    '진단 확정': '진단확정',
    '진단 보험금': '진단보험금',

    // TODO: insurance_terms 컬렉션에서 commonAliases 기반 자동 생성 로직 추가 필요
    // 예: const termsSnap = await db.collection('insurance_terms').get();
    //     termsSnap.forEach(doc => {
    //         const term = doc.data();
    //         term.commonAliases?.forEach(alias => {
    //             if (alias !== term.term) {
    //                 normalizeMap[alias] = term.term;
    //             }
    //         });
    //     });
};

// ============================================================
// 메인 로직
// ============================================================
async function seedNormalizeMap(dryRun: boolean): Promise<void> {
    console.log(`\n${'='.repeat(60)}`);
    console.log(`config/normalizeMap 시드 시작 (${dryRun ? 'DRY-RUN 모드' : '실제 실행 모드'})`);
    console.log(`${'='.repeat(60)}\n`);

    // insurance_terms에서 commonAliases 기반 자동 생성
    console.log('📖 insurance_terms에서 commonAliases 로드 중...');
    const termsSnap = await db.collection('insurance_terms').get();
    const autoGeneratedMap: Record<string, string> = {};

    termsSnap.forEach(doc => {
        const data = doc.data();
        const term: string = data.term || '';
        const aliases: string[] = data.commonAliases || [];

        aliases.forEach((alias: string) => {
            if (alias && alias !== term) {
                // alias → term 매핑 (공백 차이 등 정규화 목적)
                const aliasLower = alias.toLowerCase();
                const termLower = term.toLowerCase();
                if (aliasLower !== termLower) {
                    autoGeneratedMap[aliasLower] = termLower;
                }
            }
        });
    });

    console.log(`  - insurance_terms: ${termsSnap.size}개 용어 처리`);
    console.log(`  - 자동 생성된 매핑: ${Object.keys(autoGeneratedMap).length}개`);

    // 하드코딩 + 자동 생성 통합 (하드코딩이 우선)
    const finalMap: Record<string, string> = {
        ...autoGeneratedMap,
        ...HARDCODED_NORMALIZE_MAP,
    };

    const totalEntries = Object.keys(finalMap).length;
    console.log(`\n📋 최종 normalizeMap 엔트리: ${totalEntries}개`);

    if (dryRun) {
        console.log('\n[DRY-RUN] 다음 데이터가 config/normalizeMap에 저장될 예정:');
        Object.entries(finalMap).slice(0, 10).forEach(([k, v]) => {
            console.log(`  "${k}" → "${v}"`);
        });
        if (totalEntries > 10) {
            console.log(`  ... 외 ${totalEntries - 10}개`);
        }
    } else {
        await db.collection('config').doc('normalizeMap').set(finalMap, { merge: true });
        console.log(`\n✅ config/normalizeMap 저장 완료 (${totalEntries}개 엔트리)`);
    }

    console.log(`\n${'='.repeat(60)}\n`);
}

// ============================================================
// 실행
// ============================================================
const isDryRun = process.argv.includes('--dry-run');

seedNormalizeMap(isDryRun)
    .then(() => process.exit(0))
    .catch(err => {
        console.error('\n❌ 시드 실패:', err);
        process.exit(1);
    });
