package kr.co.accura.wbx.spring.config;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import redis.embedded.RedisServer;

import java.net.Socket;

/**
 * Embedded Redis 자동 구성.
 *
 * 동작 순서:
 *   1. 외부 Redis가 이미 실행 중이면 → 그대로 사용 (운영 환경)
 *   2. 외부 Redis 없으면 → Embedded Redis 자동 시작 (개발 환경)
 *   3. Embedded Redis도 실패하면 → RedisCacheAutoConfig에서 인메모리 캐시 전환
 *
 * Docker Desktop 없이 개발 PC에서 Redis가 자동 구동됩니다.
 */
@Configuration
public class EmbeddedRedisConfig {

    private static final Logger log = LoggerFactory.getLogger(EmbeddedRedisConfig.class);

    @Value("${spring.data.redis.port:6379}")
    private int redisPort;

    private RedisServer redisServer;

    @PostConstruct
    public void start() {
        if (isRedisRunning()) {
            log.info("[WBX] 외부 Redis 감지 — Embedded Redis 건너뜀 (port: {})", redisPort);
            return;
        }
        try {
            redisServer = RedisServer.builder()
                    .port(redisPort)
                    .setting("maxmemory 128mb")
                    .setting("maxmemory-policy allkeys-lru")
                    .build();
            redisServer.start();
            log.info("[WBX] Embedded Redis 시작 (port: {})", redisPort);
        } catch (Exception e) {
            log.warn("[WBX] Embedded Redis 시작 실패 — 인메모리 캐시로 전환됩니다 ({})", e.getMessage());
            redisServer = null;
        }
    }

    @PreDestroy
    public void stop() {
        if (redisServer != null && redisServer.isActive()) {
            redisServer.stop();
            log.info("[WBX] Embedded Redis 종료");
        }
    }

    private boolean isRedisRunning() {
        try (Socket socket = new Socket("localhost", redisPort)) {
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
