package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;

import com.alibaba.fastjson.JSONObject;
import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
import com.tzld.piaoquan.ad.engine.commons.util.JSONUtils;
import com.tzld.piaoquan.ad.engine.service.predict.container.RandWContainer;
import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class RandomPredict667Model extends ThresholdPredictModel {
    private final static Logger log = LoggerFactory.getLogger(RandomPredict667Model.class);

    @Override
    String initName() {
        return "random667";
    }


    @Override
    public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
        int hash = modelParam.getMid().hashCode();
        hash = hash < 0 ? -hash : hash;
        double score = (hash + RandWContainer.getRandW()) % 100 / 100d;

        String keySuffix = modelParam.getUserExtraFuture("shareType").toString()
                .replace("return", "")
                .replace("mids", "");

        Integer appType = modelParam.getAppType();
        String thresholdParamKey = appType + "_" + keySuffix;

        double threshold = Double.parseDouble(modelParam.getExtraParam().getOrDefault(thresholdParamKey, -1).toString());
        if (threshold < 0d) {
            thresholdParamKey = "default_" + keySuffix;
            threshold = Double.parseDouble(modelParam.getExtraParam().getOrDefault(thresholdParamKey, "-1").toString());
        }
        double correction = Double.parseDouble(modelParam.getExtraParam().getOrDefault("E620_" + appType + "_" + DateUtils.getCurrentHour(), 1).toString());
        threshold = threshold * correction;

        Map<String, Object> result = new HashMap<>();
        result.put("ad_predict", score < threshold ? 2 : 1);
        result.put("score", score);
        result.put("threshold", threshold);
        result.put("model", initName());

        JSONObject logJson = new JSONObject();
        logJson.putAll(result);
        logJson.put("mid", modelParam.getMid());
        logJson.put("expId", "667");
        logJson.put("appType", modelParam.getAppType());
        logJson.put("thresholdParamKey", thresholdParamKey);
        logJson.put("adPlatformType", modelParam.getAdPlatformType());
        logJson.put("abCode", modelParam.getAbTestCode());
        logJson.put("extraParam", modelParam.getExtraParam());
        logJson.put("shareType", modelParam.getUserExtraFuture("shareType").toString());

        log.info("广告跳出选择 -- 667实验结果: {}, 参数: {}",
                JSONUtils.toJson(result), logJson.toJSONString());

        return result;
    }

}
