package com.tzld.piaoquan.recommend.server.service;

import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
import com.tzld.piaoquan.recommend.server.model.RootSessionIdExpConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;

@Slf4j
@Service
public class ExperimentService {

    @ApolloJsonValue("${rank.root.session.id.exp.config:[]}")
    private List<RootSessionIdExpConfig> rootSessionIdExpConfigs;

    /**
     * 是否命中某个实验号
     *
     * @param appType       appType
     * @param rootSessionId rootSessionId
     * @param abExpCodes    AB实验号集合
     * @param expCode       要判断的实验号
     * @return true: 命中要判断的实验号; false: 未命中要判断的实验号
     */
    public boolean judgeHitExp(int appType, String rootSessionId, Set<String> abExpCodes, String expCode) {
        // 要判断的实验号为空，直接返回false
        if (StringUtils.isBlank(expCode)) {
            return false;
        }
        // 先判断AB实验号集合中，是否包含要判断的实验号
        if (CollectionUtils.isNotEmpty(abExpCodes) && abExpCodes.contains(expCode)) {
            return true;
        }

        // rootSessionId尾号实验配置为空或者rootSessionId为空，表示没有尾号实验。直接返回false
        if (CollectionUtils.isEmpty(rootSessionIdExpConfigs) || StringUtils.isBlank(rootSessionId)) {
            return false;
        }

        // 根据appType和rootSessionId尾号，判断是否命中实验
        String tail = rootSessionId.substring(rootSessionId.length() - 1);
        for (RootSessionIdExpConfig config : rootSessionIdExpConfigs) {
            if (config.getAppType().contains(appType) && config.getTail().contains(tail)) {
                if (StringUtils.equals(config.getExpCode(), expCode)) {
                    return true;
                }
                if (CollectionUtils.isNotEmpty(config.getExpCodes()) && config.getExpCodes().contains(expCode)) {
                    return true;
                }
            }
        }

        return false;
    }
}
