package gc.mda.signal_batch.global.config;

import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * Caffeine Cache 설정
 *
 * 용도: 선박 최신 위치 정보를 메모리에 캐싱하여 DB 부하 감소 및 실시간성 향상
 *
 * 특징:
 * - 최대 60분간 캐시 보관 (TTL)
 * - API 요청 시 minutes 파라미터로 동적 필터링
 * - 1분마다 자동 갱신 (VesselPositionCacheRefreshScheduler)
 */
@Slf4j
@Configuration
@EnableCaching
public class CacheConfig {

    @Value("${vessel.batch.cache.latest-position.ttl-minutes:60}")
    private int cacheTtlMinutes;

    @Value("${vessel.batch.cache.latest-position.max-size:50000}")
    private int cacheMaxSize;

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("vesselLatestPositions");
        cacheManager.setCaffeine(caffeineCacheBuilder());

        log.info("Initialized Caffeine CacheManager with TTL={}min, MaxSize={}",
                cacheTtlMinutes, cacheMaxSize);

        return cacheManager;
    }

    private Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                // TTL: 60분 후 자동 만료 (비활성 선박 제거)
                .expireAfterWrite(cacheTtlMinutes, TimeUnit.MINUTES)

                // 최대 선박 수 제한 (메모리 보호)
                .maximumSize(cacheMaxSize)

                // 통계 수집 활성화 (모니터링용)
                .recordStats()

                // 초기 용량 설정 (rehashing 최소화)
                .initialCapacity(1000);
    }
}
