package cn.wanghaomiao.seimi.config;

import org.redisson.codec.FstCodec;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.redisson.config.MasterSlaveServersConfig;
import org.redisson.config.ReplicatedServersConfig;
import org.redisson.config.SentinelServersConfig;
import org.redisson.config.SingleServerConfig;

/**
 * @author 汪浩淼  [email protected]
 * @since 2018/5/11.
 */
public class SeimiConfig {

    public SeimiConfig() {
        this.redissonConfig = new Config();
    }

    /**
     * 如果开启分布式设置默认启用分布式队列
     */
    public SeimiConfig(Config config) {
        this.enableRedissonQueue = true;
        this.redissonConfig = config;
        this.redissonConfig.setCodec(new FstCodec());
    }

    private boolean enableRedissonQueue = false;
    /**
     * 预期BloomFilter要插入的元素数量
     */
    private long bloomFilterExpectedInsertions;
    /**
     * BloomFilter 的期望误差率
     */
    private double bloomFilterFalseProbability;

    /**
     * 设置SeimiAgent的主机地址,如 seimi.wanghaomiao.cn or 10.10.121.211
     */
    private String seimiAgentHost;

    /**
     * seimiAgent监听端口
     */
    private int seimiAgentPort = 80;

    /**
     * redisson 各种分布式配置可以参考 https://github.com/redisson/redisson/wiki/2.-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95
     */
    private Config redissonConfig;

    public boolean isEnableRedissonQueue() {
        return enableRedissonQueue;
    }

    public SeimiConfig enableDistributedQueue() {
        this.enableRedissonQueue = true;
        return this;
    }

    /**
     * Init master/slave servers configuration.
     *
     * config.useMasterSlaveServers()
     *     //可以用"rediss://"来启用SSL连接
     *     .setMasterAddress("redis://127.0.0.1:6379")
     *     .addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
     *     .addSlaveAddress("redis://127.0.0.1:6399");
     *
     * @return MasterSlaveServersConfig
     */
    public MasterSlaveServersConfig redisMasterSlaveServers() {
        enableDistributedQueue();
        return redissonConfig.useMasterSlaveServers();
    }
    /**
     * Init sentinel servers configuration.
     *
     * config.useSentinelServers()
     *     .setMasterName("mymaster")
     *     //可以用"rediss://"来启用SSL连接
     *     .addSentinelAddress("redis://127.0.0.1:26389", "redis://127.0.0.1:26379")
     *     .addSentinelAddress("redis://127.0.0.1:26319");
     *
     * @return SentinelServersConfig
     */
    public SentinelServersConfig redisSentinelServers() {
        enableDistributedQueue();
        return redissonConfig.useSentinelServers();
    }

    /**
     * Init single server configuration.
     *
     *  config.useSingleServer().setAddress("redis://myredisserver:6379");
     *
     * @return SingleServerConfig
     */
    public SingleServerConfig redisSingleServer() {
        enableDistributedQueue();
        return redissonConfig.useSingleServer();
    }

    /**
     * Init Replicated servers configuration.
     * Most used with Azure Redis Cache or AWS Elasticache
     *
     * config.useReplicatedServers()
     *     .setScanInterval(2000) // 主节点变化扫描间隔时间
     *     //可以用"rediss://"来启用SSL连接
     *     .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
     *     .addNodeAddress("redis://127.0.0.1:7002");
     *
     * @return ReplicatedServersConfig
     */
    public ReplicatedServersConfig redisReplicatedServers() {
        enableDistributedQueue();
        return redissonConfig.useReplicatedServers();
    }

    /**
     * Init cluster servers configuration
     *
     * config.useClusterServers()
     *     .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒
     *     //可以用"rediss://"来启用SSL连接
     *     .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
     *     .addNodeAddress("redis://127.0.0.1:7002");
     *
     * @return config
     */
    public ClusterServersConfig redisClusterServers() {
        enableDistributedQueue();
        return redissonConfig.useClusterServers();
    }

    public long getBloomFilterExpectedInsertions() {
        return bloomFilterExpectedInsertions;
    }

    public void setBloomFilterExpectedInsertions(long bloomFilterExpectedInsertions) {
        this.bloomFilterExpectedInsertions = bloomFilterExpectedInsertions;
    }

    public double getBloomFilterFalseProbability() {
        return bloomFilterFalseProbability;
    }

    public void setBloomFilterFalseProbability(double bloomFilterFalseProbability) {
        this.bloomFilterFalseProbability = bloomFilterFalseProbability;
    }

    public String getSeimiAgentHost() {
        return seimiAgentHost;
    }

    public void setSeimiAgentHost(String seimiAgentHost) {
        this.seimiAgentHost = seimiAgentHost;
    }

    public int getSeimiAgentPort() {
        return seimiAgentPort;
    }

    public void setSeimiAgentPort(int seimiAgentPort) {
        this.seimiAgentPort = seimiAgentPort;
    }

    public Config getRedissonConfig() {
        return redissonConfig;
    }
}