import { getFirebaseAdmin } from '@/lib/firebase-admin';
import { FieldValue } from 'firebase-admin/firestore';

// 단서조항 키워드 목록
const PROVISO_KEYWORDS = ['다만', '단,', '단 ', '그러나', '다만,', '단서', '예외적으로', '불구하고'];

// "제N조" 패턴 (조항 카운트용)
const ARTICLE_PATTERN = /제\s*\d+\s*조/g;

/**
 * 평균 청크 크기 계산 (문자 수 기준)
 */
function calcAvgChunkSize(chunks: string[]): number {
    if (chunks.length === 0) return 0;
    const totalLen = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
    return Math.round(totalLen / chunks.length);
}

/**
 * 단서조항 보존율 계산
 * - 단서 키워드("다만", "단,", "그러나" 등)가 포함된 청크 비율
 */
function calcProvisoPreservationRate(chunks: string[]): number {
    if (chunks.length === 0) return 0;
    const provisoChunks = chunks.filter(chunk =>
        PROVISO_KEYWORDS.some(keyword => chunk.includes(keyword))
    );
    return Math.round((provisoChunks.length / chunks.length) * 1000) / 1000;
}

/**
 * 청크 배열에서 "제N조" 패턴을 카운트하여 조항 수 반환
 */
function countArticles(chunks: string[]): number {
    const articleSet = new Set<string>();
    for (const chunk of chunks) {
        const matches = chunk.match(ARTICLE_PATTERN);
        if (matches) {
            matches.forEach(m => articleSet.add(m.replace(/\s/g, '')));
        }
    }
    return articleSet.size;
}

/**
 * 인덱싱 완료 시 호출하여 index_logs 컬렉션에 품질 지표를 기록합니다.
 *
 * @param params.productId        보험 상품 ID
 * @param params.companyId        보험사 ID
 * @param params.jobId            완료된 job 문서 ID
 * @param params.isReindex        재인덱싱 여부
 * @param params.blueGreenMode    Blue-Green 배포 모드 여부
 * @param params.previousChunksCount  이전 인덱싱의 청크 수 (0이면 최초 인덱싱)
 * @param params.newChunksCount   이번 인덱싱의 청크 수
 * @param params.chunks           이번 인덱싱에서 생성된 청크 텍스트 배열 (품질 지표 계산용)
 */
export async function logIndexingResult(params: {
    productId: string;
    companyId: string;
    jobId: string;
    isReindex: boolean;
    blueGreenMode: boolean;
    previousChunksCount: number;
    newChunksCount: number;
    chunks: string[];
}): Promise<void> {
    const {
        productId,
        companyId,
        jobId,
        isReindex,
        blueGreenMode,
        previousChunksCount,
        newChunksCount,
        chunks,
    } = params;

    // 품질 지표 계산
    const avgChunkSize = calcAvgChunkSize(chunks);
    const provisoPreservationRate = calcProvisoPreservationRate(chunks);

    // 조항 수 변화 계산 (이전 청크가 없으면 신규 조항만 기록)
    const newArticlesCount = countArticles(chunks);
    // previousChunksCount > 0 이면 이전 job의 chunks가 없으므로 delta 기반으로 추정
    // 실제 이전 청크를 모르므로 추가/삭제 조항은 새 청크 기준으로 기록하고
    // isReindex + previousChunksCount > 0 인 경우만 delta를 유의미하게 처리
    const chunksDelta = newChunksCount - previousChunksCount;
    // 조항 delta: 청크 비율로 비례 추정 (이전 청크 텍스트 없을 경우의 최선)
    let addedArticles = 0;
    let removedArticles = 0;
    if (isReindex && previousChunksCount > 0) {
        if (chunksDelta > 0) {
            addedArticles = Math.max(0, Math.round(newArticlesCount * (chunksDelta / newChunksCount)));
            removedArticles = 0;
        } else if (chunksDelta < 0) {
            addedArticles = 0;
            removedArticles = Math.max(0, Math.round(newArticlesCount * (Math.abs(chunksDelta) / previousChunksCount)));
        }
    }

    const db = getFirebaseAdmin().firestore();

    const logData = {
        productId,
        companyId,
        jobId,
        isReindex,
        blueGreenMode,
        // diff 정보
        previousChunksCount,
        newChunksCount,
        chunksDelta,
        addedArticles,
        removedArticles,
        // 품질 지표
        avgChunkSize,
        provisoPreservationRate,
        totalArticlesCount: newArticlesCount,
        // Blue-Green 스위칭 시각 (blueGreenMode 시 현재 시각으로 기록)
        switchedAt: blueGreenMode ? FieldValue.serverTimestamp() : null,
        // 공통 타임스탬프
        createdAt: FieldValue.serverTimestamp(),
    };

    await db.collection('index_logs').add(logData);

    console.log(
        `[indexLogger] logged index_log for jobId=${jobId}, productId=${productId}, ` +
        `avgChunkSize=${avgChunkSize}, provisoRate=${provisoPreservationRate}, ` +
        `articles=${newArticlesCount}, chunksDelta=${chunksDelta}`
    );
}
