package com.ruoyi.dk.systemconfig;

import com.ruoyi.component.core.constant.GlobalConstants;
import com.ruoyi.dk.systemconfig.check.SystemCheckResp;
import com.ruoyi.dk.systemconfig.enums.SystemConfigEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 主要用于动态配置管理
 * <p>created on 2022/8/18 17:21</p>
 * @author ZL
 */
@Component
public class SystemConfigManager {
    private final static String REDIS_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "system-config";

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 获取配置信息返回boolean
     * @param systemConfig
     * @return
     */
    public boolean getSystemConfigOfBool(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        return "1".equals(value);
    }

    public BigDecimal getSystemConfigOfBigDecimal(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        return new BigDecimal(value);
    }

    /**
     * 获取配置信息返回Integer
     * @param systemConfig
     * @return
     */
    public Integer getSystemConfigOfInt(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        return Integer.valueOf(value);
    }


    /**
     * 获取配置信息返回Integer
     * @param systemConfig
     * @return
     */
    public Long getSystemConfigOfLong(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        return Long.valueOf(value);
    }

    /**
     * 获取配置信息
     * @param systemConfig
     * @return
     */
    public String getSystemConfig(SystemConfigEnum systemConfig){
        String value = (String) redisTemplate.opsForHash().get(REDIS_KEY, systemConfig.name());
        if(StringUtils.isBlank(value)){
            return systemConfig.getDefaultValue();
        }
        return value;
    }


    public List<String> getSystemConfigOfList(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        if(StringUtils.isBlank(value)){
            value =  systemConfig.getDefaultValue();
        }
        return Stream.of(value.split(",")).collect(Collectors.toList());
    }

    public Set<Long> getSystemConfigOfLongSet(SystemConfigEnum systemConfig){
        String value = getSystemConfig(systemConfig);
        if(StringUtils.isBlank(value)){
            value =  systemConfig.getDefaultValue();
        }
        return Stream.of(value.split(",")).map(Long::valueOf).collect(Collectors.toSet());
    }


    /**
     * 获取所有配置
     * @return
     */
    public Map<String,String> getAllSystemConfig(){
        HashOperations<String, String, String> stringObjectObjectHashOperations = redisTemplate.opsForHash();
        return stringObjectObjectHashOperations.entries(REDIS_KEY);
    }


    public SystemCheckResp setSystemConfig(SystemConfigEnum systemConfig, String value){
        if(systemConfig.getCheck() != null){
            SystemCheckResp check = systemConfig.getCheck().check(value);
            if(!check.isSuccess()){
                return check;
            }
        }
        this.set(systemConfig.name(),value);
        return SystemCheckResp.ok();
    }

    public void set(String key, String value) {
        redisTemplate.opsForHash().put(REDIS_KEY, key,value);
    }
}
