package com.kt.ai.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * Redis 캐시 서비스
 * - Job 상태 관리
 * - AI 추천 결과 캐싱
 * - 트렌드 분석 결과 캐싱
 *
 * @author AI Service Team
 * @since 1.0.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class CacheService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Value("${cache.ttl.recommendation:86400}")
    private long recommendationTtl;

    @Value("${cache.ttl.job-status:86400}")
    private long jobStatusTtl;

    @Value("${cache.ttl.trend:3600}")
    private long trendTtl;

    /**
     * 캐시 저장
     *
     * @param key Redis Key
     * @param value 저장할 값
     * @param ttlSeconds TTL (초)
     */
    public void set(String key, Object value, long ttlSeconds) {
        try {
            redisTemplate.opsForValue().set(key, value, ttlSeconds, TimeUnit.SECONDS);
            log.debug("캐시 저장 성공: key={}, ttl={}초", key, ttlSeconds);
        } catch (Exception e) {
            log.error("캐시 저장 실패: key={}", key, e);
        }
    }

    /**
     * 캐시 조회
     *
     * @param key Redis Key
     * @return 캐시된 값 (없으면 null)
     */
    public Object get(String key) {
        try {
            Object value = redisTemplate.opsForValue().get(key);
            if (value != null) {
                log.debug("캐시 조회 성공: key={}", key);
            } else {
                log.debug("캐시 미스: key={}", key);
            }
            return value;
        } catch (Exception e) {
            log.error("캐시 조회 실패: key={}", key, e);
            return null;
        }
    }

    /**
     * 캐시 삭제
     *
     * @param key Redis Key
     */
    public void delete(String key) {
        try {
            redisTemplate.delete(key);
            log.debug("캐시 삭제 성공: key={}", key);
        } catch (Exception e) {
            log.error("캐시 삭제 실패: key={}", key, e);
        }
    }

    /**
     * Job 상태 저장
     */
    public void saveJobStatus(String jobId, Object status) {
        String key = "ai:job:status:" + jobId;
        set(key, status, jobStatusTtl);
    }

    /**
     * Job 상태 조회
     */
    public Object getJobStatus(String jobId) {
        String key = "ai:job:status:" + jobId;
        return get(key);
    }

    /**
     * AI 추천 결과 저장
     */
    public void saveRecommendation(String eventId, Object recommendation) {
        String key = "ai:recommendation:" + eventId;
        set(key, recommendation, recommendationTtl);
    }

    /**
     * AI 추천 결과 조회
     */
    public Object getRecommendation(String eventId) {
        String key = "ai:recommendation:" + eventId;
        return get(key);
    }

    /**
     * 트렌드 분석 결과 저장
     */
    public void saveTrend(String industry, String region, Object trend) {
        String key = "ai:trend:" + industry + ":" + region;
        set(key, trend, trendTtl);
    }

    /**
     * 트렌드 분석 결과 조회
     */
    public Object getTrend(String industry, String region) {
        String key = "ai:trend:" + industry + ":" + region;
        return get(key);
    }
}
