package service

import dev.langchain4j.community.rag.content.retriever.lucene.LuceneEmbeddingStore
import dev.langchain4j.model.embedding.EmbeddingModel
import dev.langchain4j.store.embedding.EmbeddingSearchRequest
import java.util.concurrent.ConcurrentHashMap

object UrlCacheManager {
    // 1. Thread-safe한 메모리 캐시 (M3 Pro의 멀티코어 환경 대응)
    private val processedUrls = ConcurrentHashMap.newKeySet<String>()

    /**
     * Lucene 저장소에서 모든 link 메타데이터를 읽어와 캐시를 초기화합니다.
     */
    fun initialize(embeddingStore: LuceneEmbeddingStore, embeddingModel: EmbeddingModel) {
        try {
            // 1. 더미 텍스트로 기준 벡터 생성 (또는 0으로 채워진 리스트 생성)
            // 모델에게 아무 단어나 던져서 기준이 될 벡터 하나를 임시로 만듭니다.
            val dummyEmbedding = embeddingModel.embed("initial_load").content()

            // 2. 검색 요청에 더미 벡터 포함
            val searchRequest = EmbeddingSearchRequest.builder()
                .queryEmbedding(dummyEmbedding) // [필수] 기준 벡터 주입으로 에러 해결
                .maxResults(2000)
                .build()

            val result = embeddingStore.search(searchRequest)

            result.matches().forEach { match ->
                val url = match.embedded().metadata().getString("link") as? String
                if (url != null) {
                    processedUrls.add(url)
                }
            }
            println("✅ [Cache] Lucene으로부터 ${processedUrls.size}개의 URL 로드 완료")
        } catch (e: Exception) {
            println("⚠️ [Cache] 초기화 실패: ${e.message}")
        }
    }

    fun isInitialized(): Boolean {
        return processedUrls.isNotEmpty()
    }
    /**
     * 중복 여부 확인 (O(1) 속도)
     */
    fun isAlreadyProcessed(url: String): Boolean = processedUrls.contains(url)

    /**
     * 캐시 업데이트
     */
    fun addToCache(url: String) {
        processedUrls.add(url)
    }
}