package edu.whut.infrastructure.dcc;
import edu.whut.types.annotations.DCCValue;
import edu.whut.types.common.Constants;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * DCC动态配置服务  Dynamic Configuration Center
 */
@Service
public class DCCService {

    /**
     * 降级开关 0关闭、1开启  当外部依赖异常、系统负载过高等场景下，主动关闭或简化某些功能
     * 默认值为0，即关闭降级
     */
    @DCCValue("downgradeSwitch:0")
    private String downgradeSwitch;

    /**
     * 人群切量开关，只让部分人群先使用新功能或新版本
     * 默认值为100，即不对人群过滤
     */
    @DCCValue("cutRange:100")
    private String cutRange;

    /**
     * 对指定“来源+渠道”进行拦截
     */
    @DCCValue("scBlacklist:s02c02,s03c03")
    private String scBlacklist;

    @DCCValue("cacheSwitch:1")
    private String cacheOpenSwitch;

    /**
     * 判断是否降级
     * @return
     */
    public boolean isDowngradeSwitch() {
        return "1".equals(downgradeSwitch);
    }

    public boolean isCutRange(String userId) {
        // 计算哈希码的绝对值
        int hashCode = Math.abs(userId.hashCode());

        // 获取最后两位
        int lastTwoDigits = hashCode % 100;

        // 判断是否在切量范围内
        // 在范围内，可以继续参加活动
        if (lastTwoDigits <= Integer.parseInt(cutRange)) {
            return true;
        }

        return false;
    }

    /**
     * 判断黑名单拦截渠道，true 拦截、false 放行
     */
    public boolean isSCBlackIntercept(String source, String channel) {
        List<String> list = Arrays.asList(scBlacklist.split(Constants.SPLIT));   //可能拦截多渠道：s02c02,s03c03
        return list.contains(source + channel);
    }

    /**
     * 缓存开启开关，true为开启，0为关闭
     */
    public boolean isCacheOpenSwitch(){
        return "1".equals(cacheOpenSwitch);
    }

}
