package com.sonic.frog.config;

import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    /**
     * 配置 RedissonClient，支持单机和集群模式
     */
    @Bean
    public RedissonClient redissonClient(RedisProperties redisProperties) {
        Config config = new Config();

        // 设置 Netty 线程数，使用默认值 0（Redisson 默认使用 CPU 核心数的两倍）
        config.setNettyThreads(0);

        // 判断是否配置了集群节点
        if (redisProperties.getCluster() != null && redisProperties.getCluster().getNodes() != null
                && !redisProperties.getCluster().getNodes().isEmpty()) {
            // 集群模式配置
            config.useClusterServers()
                    .setScanInterval(2000) // 集群状态扫描间隔，单位毫秒
                    .addNodeAddress(redisProperties.getCluster().getNodes().stream()
                            .map(node -> "redis://" + node)
                            .toArray(String[]::new))
                    .setPassword(StringUtils.isNotBlank(redisProperties.getPassword())
                            ? redisProperties.getPassword() : null);
        } else {
            // 单机模式配置
            config.useSingleServer()
                    .setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort())
                    .setPassword(StringUtils.isNotBlank(redisProperties.getPassword())
                            ? redisProperties.getPassword() : null)
                    .setDatabase(redisProperties.getDatabase());
        }

        // 如果启用了 SSL，设置 SSL 相关配置
        if (redisProperties.isSsl()) {
            config.useSingleServer().setSslEnableEndpointIdentification(false); // 禁用主机名验证
            // 集群模式下，Redisson 会自动应用 SSL 配置
        }

        return Redisson.create(config);
    }
}