/**
 * 보험 약관 버전 필터링 유틸리티
 *
 * vector-search 등에서 import하여 사용.
 * effectiveDateRange 기반으로 현행/과거 버전을 구분한다.
 *
 * 날짜 형식: "YYYY-MM" (사전식 비교 가능)
 */

import type { InsuranceMetadata, InsuranceChunk } from '@/types/firestore';

/**
 * effectiveDateRange.end가 없는(현행) 메타데이터만 반환한다.
 *
 * @param metadataList - 전체 InsuranceMetadata 배열
 * @returns 현행 버전(end 없음)인 메타데이터 배열
 */
export function filterCurrentVersionMetadata(
    metadataList: InsuranceMetadata[]
): InsuranceMetadata[] {
    return metadataList.filter(isCurrentVersion);
}

/**
 * 특정 시점(YYYY-MM)에 유효한 메타데이터만 반환한다.
 * 조건: start <= targetDate < end (end가 없으면 현재까지 유효)
 *
 * @param metadataList - 전체 InsuranceMetadata 배열
 * @param targetDate   - 조회 기준 날짜 ("YYYY-MM" 형식)
 * @returns 해당 시점에 유효한 메타데이터 배열
 */
export function filterMetadataByDate(
    metadataList: InsuranceMetadata[],
    targetDate: string
): InsuranceMetadata[] {
    return metadataList.filter((meta) => {
        const range = meta.effectiveDateRange;
        if (!range?.start) return false;

        const afterStart = range.start <= targetDate;
        const beforeEnd = !range.end || targetDate < range.end;

        return afterStart && beforeEnd;
    });
}

/**
 * 현행 버전 메타데이터 목록의 effectiveDate와 매칭되는 청크만 반환한다.
 *
 * 현행 메타데이터의 effectiveDateRange.start 값들을 기준으로,
 * 청크의 effectiveDate가 그 중 하나와 일치하는 청크를 필터링한다.
 *
 * @param chunks          - 전체 InsuranceChunk 배열
 * @param currentMetadata - 현행 버전 메타데이터 배열 (filterCurrentVersionMetadata 결과 등)
 * @returns 현행 버전에 속하는 청크 배열
 */
export function filterCurrentChunks(
    chunks: InsuranceChunk[],
    currentMetadata: InsuranceMetadata[]
): InsuranceChunk[] {
    const currentDates = new Set(
        currentMetadata
            .map((meta) => meta.effectiveDateRange?.start)
            .filter((date): date is string => !!date)
    );

    return chunks.filter((chunk) => currentDates.has(chunk.effectiveDate));
}

/**
 * 해당 메타데이터가 현행 버전인지 여부를 반환한다.
 * effectiveDateRange.end가 없으면 현행으로 판단한다.
 *
 * @param metadata - 검사할 InsuranceMetadata
 * @returns 현행 버전이면 true, 과거 버전이면 false
 */
export function isCurrentVersion(metadata: InsuranceMetadata): boolean {
    return !metadata.effectiveDateRange?.end;
}
