package com.zd.exam.service.convert;

import cn.hutool.json.JSONUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.zd.common.core.domain.R;
import com.zd.exam.service.impl.ElPaperServiceImpl;
import com.zd.system.api.laboratory.RemoteLaboratoryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

/**
 * 黑名单，负面清单处理回调
 */
@Service
public class BonusPointsService {
    private static final Logger logger = LoggerFactory.getLogger(BonusPointsService.class);
    @Autowired
    private RemoteLaboratoryService remoteLaboratoryService;

    /**
     * 黑名单处理回调
     * @param data 回调数据
     * @param type 1 考试，2 练习，3 学习
     */
    public void blackCallback(Long userId,Map<String, Object> data, Integer type){

        try {
            // 2 如果是负面清单和黑名单考试且用户也在其中，则处理该违规，并回复信用分，否则不处理
            Integer userStatus = getUserStatus(userId);
            if (userStatus == null) {
                return ;
            }
            data.put("joinUserId", userId);
            if(userStatus == 1){
                // 吉换说 处理方式同黑名单一致
                logger.error("blackCallback: 负面清单处理回调：{}", JSONUtil.toJsonStr(data));
                //remoteLaboratoryService.negativelistLearningRules(data);
            }else if(userStatus == 2){
                logger.error("blackCallback: 黑名单处理回调：{}", JSONUtil.toJsonStr(data));
            }
            /*{
              // 考试 传这两个值
              "testStatus":"-99",       考试通过状态，如果有，传0，没有传-99
              "joinUserId":"45398",  用户id

              // 学习
              "learnStatus":"-99",    学习状态，如果有，传0，没有传-99
              "learnTime":"0",         学习时长，学习的时候传入
              "joinUserId":"45398",  用户id

              // 练习
              "practiceStatus":"0",     答题状态，如果有，传0，没有传-99
              "numberTopics":"6",    答题数量，答题的时候， 传入
              "numberAccuracy":"6"    答题准确率，答题的时候传入
              "joinUserId":"45398",  用户id
          }*/

            // 入参区分黑名单和负面清单
            data.put("negativeOrBlack", userStatus);

            remoteLaboratoryService.blacklistLearningRules(data);
        }catch (Exception e){
            e.printStackTrace();
            logger.error("blackCallback: ERROR" + e.getMessage());
        }

    }

    /**
     * 负面清单处理回调
     * @param data 回调数据
     * @param type 1 考试，2 练习，3 学习
     */
    public void negativeCallback(Long userId,Map<String, Object> data, Integer type){

        try {
            Integer userStatus = getUserStatus(userId);
            if (userStatus == null) {
                return ;
            }

            if(userStatus == 1){
//                ILabNegativeListRecordsService.delexam
                remoteLaboratoryService.blacklistLearningRules(data);
            }
        }catch (Exception e){
            e.printStackTrace();
            logger.error("negativeCallback: ERROR" + e.getMessage());
        }

    }

    /**
     * 检测用户是否处于黑名单，并返回黑名单处罚项， 不处于黑名单则返回null
     * @param userId
     */
    public LabBlackConfig getBlackTimeArea(Long userId){
        try {
            Integer userStatus = getUserStatus(userId);
            if (userStatus == null) {
                return null;
            }
            Map<String, Object> map = new HashMap<>();
            map.put("joinUserId", userId);
            // 区分黑名单和负面清单
            map.put("negativeOrBlack", userStatus);
            R r = remoteLaboratoryService.getBlackTimeArea(map);
            if(r != null && r.getData() != null){
                LabBlackConfig labBlackConfig = JSON.parseObject(JSONUtils.toJSONString(r.getData()),LabBlackConfig.class);

                return labBlackConfig;
            }

        }catch (Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
        }
        return null;
    }

    /**
     * 查询用户是否违规
     * 用户违规状态 0 无，1 负面清单，2 黑名单
     * @param userId 用户ID
     */
    public Integer getUserStatus(Long userId){
        R r = remoteLaboratoryService.userexist(userId);

        if(r == null || r.getData() == null){
            // 用户未违规直接结束
            logger.error("查询到用户未违规：" + userId);
            return null;
        }
        return (int) r.getData();
    }

}
