/**
 * links 스키마 백필 스크립트
 *
 * 기존 links 문서에 AI linking 필드를 추가합니다:
 *   - method: "manual"
 *   - createdBy: "user"
 *   - status: "active"
 *
 * 사용법:
 *   npx ts-node scripts/backfill-links-schema.ts           # 실제 실행
 *   npx ts-node scripts/backfill-links-schema.ts --dry-run  # dry-run 모드 (변경 없음)
 *
 * MT-4: links 백필 스크립트
 * 생성일: 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();
        console.log('ℹ️ 서비스 계정 키 없음 — 기본 인증 사용 (gcloud auth)');
    }
}

const db = admin.firestore();

// ============================================================
// 상수
// ============================================================
const BATCH_SIZE = 500;
const LINKS_COLLECTION = 'links';

// ============================================================
// 백필 필드 기본값
// ============================================================
const BACKFILL_DEFAULTS = {
    method: 'manual' as const,
    createdBy: 'user' as const,
    status: 'active' as const,
};

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

    const snapshot = await db.collection(LINKS_COLLECTION).get();
    const totalDocs = snapshot.size;

    console.log(`📋 총 ${totalDocs}개 links 문서 조회됨\n`);

    if (totalDocs === 0) {
        console.log('✅ 처리할 문서가 없습니다.');
        return;
    }

    // 백필이 필요한 문서만 필터링 (이미 method 필드가 있으면 제외)
    const docsToUpdate: admin.firestore.QueryDocumentSnapshot[] = [];
    snapshot.forEach(doc => {
        const data = doc.data();
        if (!('method' in data)) {
            docsToUpdate.push(doc);
        }
    });

    console.log(`🔍 백필 대상: ${docsToUpdate.length}개 (이미 처리된 ${totalDocs - docsToUpdate.length}개 제외)\n`);

    if (docsToUpdate.length === 0) {
        console.log('✅ 모든 문서가 이미 최신 스키마를 가지고 있습니다.');
        return;
    }

    // 배치 처리
    let processedCount = 0;
    let batchNumber = 0;

    for (let i = 0; i < docsToUpdate.length; i += BATCH_SIZE) {
        const chunk = docsToUpdate.slice(i, i + BATCH_SIZE);
        batchNumber++;

        if (dryRun) {
            console.log(`[DRY-RUN] 배치 ${batchNumber}: ${chunk.length}개 문서 업데이트 예정`);
            chunk.slice(0, 3).forEach(doc => {
                const data = doc.data();
                console.log(`  - ${doc.id}: "${data.sourceTitle || '?'}" → "${data.targetTitle || '?'}"`);
            });
            if (chunk.length > 3) {
                console.log(`  ... 외 ${chunk.length - 3}개`);
            }
        } else {
            const batch = db.batch();

            chunk.forEach(doc => {
                batch.update(doc.ref, {
                    ...BACKFILL_DEFAULTS,
                    updatedAt: admin.firestore.FieldValue.serverTimestamp(),
                });
            });

            await batch.commit();
            console.log(`✅ 배치 ${batchNumber}: ${chunk.length}개 문서 업데이트 완료`);
        }

        processedCount += chunk.length;
    }

    console.log(`\n${'='.repeat(60)}`);
    if (dryRun) {
        console.log(`[DRY-RUN] 완료: ${processedCount}개 문서가 업데이트될 예정`);
        console.log('실제 실행하려면 --dry-run 플래그 없이 실행하세요.');
    } else {
        console.log(`✅ 백필 완료: ${processedCount}개 문서 업데이트 (${batchNumber}개 배치)`);
    }
    console.log(`${'='.repeat(60)}\n`);
}

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

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