package com.rf.psychological.scale.resultBusiness.cognitiveResult;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rf.psychological.dao.model.ANTEntity;
import com.rf.psychological.dao.model.GTCTEntity;
import com.rf.psychological.file.excel.ExcelClass;
import com.rf.psychological.scale.resultBusiness.scaleResult.BaseScale;
import com.rf.psychological.utils.Constant;
import com.rf.psychological.utils.ExcelUtil;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zsy
 * @description:ANT测试
 * @date 2021/7/20 15:55
 */
public class ANTCognize extends BaseScale {

    public ANTCognize(JSONArray jsonArray, JSONObject resultJson) {
        super(jsonArray, resultJson);
    }

    public  JSONObject scaleCalculate() throws Exception {
        List<Map<String, String>> resultMapList = new ArrayList<>();
        JSONObject jsonObject = resultJson.getJSONObject("jsonObject");
        String fileName;
        String name;

        JSONObject resultDBJson = new JSONObject(true);

        JSONArray jsonArray = jsonObject.getJSONArray("data");
        //准确率
        String rightRate = jsonObject.getString("rightRate");
        //总反应时长
        String totalResponseTime = jsonObject.getString("totalResponseTime");

        fileName = resultJson.getString("fileName") + "-" + Constant.SHEET_NAME_ANT + ".xlsx";
        name = Constant.SHEET_NAME_ANT;
        JSONObject result = jsonObject.getJSONObject("result");
        //命中率
        double hitRate = result.getDouble("hitRate");
        //冲突分数
        double conflictScore = result.getDouble("conflictScore");
        //定向分数
        double directionScore = result.getDouble("directionScore");
        //警觉分数
        double warnScore = result.getDouble("warnScore");

        resultDBJson.put("versionNo",Constant.COGNITION_RESULT_VERSION);
        JSONArray totalScores = new JSONArray();
        JSONObject totalScore = new JSONObject(true);
        String desc = null;
        totalScore.put("totalScore",hitRate);

        if (hitRate>0.8){
            desc = "优秀等级：您具有很好的注意警觉、定向和执行控制能力，即您能很好地获得并维持对某个信息的警觉状态、能很好且及时有效地从外部信息进行选择、以及能很好地解决反应中的冲突。比如举个例子，上课时您能够全过程跟着老师的思路认真听讲，并能够抓住老师所讲的重点内容，且能够很好地排除课堂上的其他干扰。";
        }else if(hitRate>0.75 && hitRate<=0.8){
            desc = "较优秀等级：您具有较好的注意警觉、定向和执行控制能力，即您能较好地获得并维持对某个信息的警觉状态、能较好且较及时有效地从外部信息进行选择、以及能较好地解决反应中的冲突。比如举个例子，上课时您能够一定程度上较认真地跟着老师的思路听讲，并能够一定程度上抓住老师所讲的重点内容，且能够较好地排除课堂上的其他干扰。";
        }else if(hitRate>0.7 && hitRate<=0.75){
            desc = "一般等级：您具有一般水平的注意警觉、定向和执行控制能力，即您不能很好但可以较好地获得并维持对某个信息的警觉状态、不能很好很及时有效但能较好较及时有效地从外部信息进行选择、以及不能很好但能较好地解决反应中的冲突。比如，上课听讲时您只能一定程度上跟着老师的思路听讲，抓住老师所讲的部分重点内容，能够排除一部分课堂上的其他干扰。";
        }else if(hitRate>0.65 && hitRate<=0.7){
            desc = "较差等级：您的注意警觉、定向和执行控制能力较差，即您不能很好地获得并维持对某个信息的警觉状态、不能很好且及时有效地从外部信息进行选择、以及不能很好地解决反应中的冲突。比如，上课听讲时您不能跟着老师的思路认真听讲，不能抓住老师所讲的重点内容，不能够排除课堂上的其他干扰。";
        }else if(hitRate<=0.65){
            desc = "极差等级：您的注意警觉、定向和执行控制能力很差，即您完全不能很好地获得并维持对某个信息的警觉状态、完全不能很好且及时有效地从外部信息进行选择、以及完全不能很好地解决反应中的冲突。比如，上课听讲时您几乎不能跟着老师的思路听讲，几乎不能抓住老师所讲的重点内容，几乎不能够排除课堂上的其他干扰。";
        }
        totalScore.put("totalScoreDesc",desc);
        totalScores.add(totalScore);
        resultDBJson.put("totalScore",totalScores);
        //维度得分及结论模块
        JSONArray dimensions = new JSONArray();
        JSONObject scoreA = new JSONObject(true);
        scoreA.put("name","冲突分数");
        scoreA.put("score",String.valueOf(conflictScore));
        String DescribeA = null;
        if (conflictScore>50000){
            DescribeA = "极差等级:您的注意执行控制能力很差，您几乎不能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时您一定会受到噪音干扰，也几乎不能安心学习。";
        }else if(conflictScore>40000 && conflictScore<=50000){
            DescribeA = "较差等级:您的注意执行控制能力较差，您不能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时您会受到噪音干扰，也不能安心学习。";
        }else if(conflictScore>30000 && conflictScore<=40000){
            DescribeA = "一般等级:您具有一般水平的注意执行控制能力，您能够较好但不能很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时您会一定程度上受噪音干扰，但也能安心学习。";
        }else if(conflictScore>20000 && conflictScore<=30000){
            DescribeA = "较优秀等级:您具有较好的注意执行控制能力，您能够较好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时您能够较好地安心学习，一定程度上不受噪音干扰。";
        }else if(conflictScore<=20000){
            DescribeA = "优秀等级:您具有很好的注意执行控制能力，您能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时您能够很好地安心学习，不受噪音干扰。";
        }
        scoreA.put("Describe",DescribeA);
        scoreA.put("maximum","无");
        scoreA.put("groupName","第一组");
        dimensions.add(scoreA);
        JSONObject scoreB = new JSONObject(true);
        scoreB.put("name","定向分数");
        scoreB.put("score",String.valueOf(directionScore));
        String DescribeB = null;
        if (directionScore> -2000){
            DescribeB = "优秀等级:您具有很好的注意定向能力，能够很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在开车时，如果前方出现一条小狗，您能够很快发觉并及时做出刹车反应。";
        }else if(directionScore> -3000 && directionScore<=-2000){
            DescribeB = "较优秀等级:您具有较好的注意定向能力，能够较好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在开车时，如果前方出现一条小狗，您能够较快发觉并做出刹车反应。";
        }else if(directionScore> -4000 && directionScore<=-3000){
            DescribeB = "一般等级:您具有一般水平的注意定向能力，您不能够很好但能较好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在开车时，如果前方出现一条小狗，您不能够很快但也能发觉并做出刹车反应。";
        }else if(directionScore> -5000 && directionScore<=-4000){
            DescribeB = "较差等级:您的注意定向能力较差，不能够很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在开车时，如果前方出现一条小狗，您不能够很快发觉并做出刹车反应。";
        }else if(directionScore<=-5000){
            DescribeB = "极差等级:您的注意定向能力很差，几乎不能很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在开车时，如果前方出现一条小狗，您几乎不能够发觉并做出刹车反应。";
        }
        scoreB.put("Describe",DescribeB);
        scoreB.put("maximum","无");
        scoreB.put("groupName","第一组");
        dimensions.add(scoreB);
        resultDBJson.put("dimensions", dimensions);
        JSONObject scoreC = new JSONObject(true);
        scoreC.put("name","警觉分数");
        scoreC.put("score",String.valueOf(warnScore));
        String DescribeC = null;
        if (warnScore> 4000){
            DescribeC = "极差等级:您的注意警觉能力很差，您几乎不能保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内不能跟着老师的思路听讲，而且中间很容易走神或疲惫。";
        }else if(warnScore> 3000 && warnScore<=4000){
            DescribeC = "较差等级:您的注意警觉能力较差，您不能够很好地保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内并不能很好地跟着老师的思路听讲，而且中间会一定程度地走神或疲惫。";
        }else if(warnScore> 2000 && warnScore<=3000){
            DescribeC = "一般等级:您具有一般水平的注意警觉能力，您并不能够很好但能较好地保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内并不能完全很好地跟着老师的思路听讲但能一定程度上跟着老师的思路投入课堂，而且中间会略微走神或疲惫。";
        }else if(warnScore> 1000 && warnScore<=2000){
            DescribeC = "较优秀等级:您具有较好的注意警觉能力，您能够较好地保持对某一刺激的警觉投入状态。比如，在上课时，您能在上课的40分钟内较好地跟着老师的思路认真听讲，中间很少走神或疲惫。";
        }else if(warnScore<=1000){
            DescribeC = "优秀等级:您具有很好的注意警觉能力，您能够很好地保持对某一刺激的警觉投入状态。比如，在上课时，您能在上课的40分钟内很好地跟着老师的思路认真听讲，而不会中间走神或疲惫。";
        }
        scoreC.put("Describe",DescribeC);
        scoreC.put("maximum","无");
        scoreC.put("groupName","第一组");
        dimensions.add(scoreC);
        resultDBJson.put("dimensions", dimensions);


        JSONObject ifShow = new JSONObject(true);
        ifShow.put("totalScore",true);
        ifShow.put("dimensions",true);
        ifShow.put("note",false);
        ifShow.put("radar",false);
        ifShow.put("table",false);
        resultDBJson.put("ifShow",ifShow);



        Map<String, String> resultMap = new LinkedHashMap<>();
        resultMap.put("准确率", rightRate);
        resultDBJson.put("准确率", rightRate);
        resultMap.put("总反应时长", totalResponseTime);
        resultDBJson.put("总反应时长", totalResponseTime);
        resultMapList.add(resultMap);

        Map<String, String> resultMap1 = new LinkedHashMap<>();
        resultMap1.put("总命中次数", String.valueOf(result.get("hitsAll")));
        resultDBJson.put("总命中次数", String.valueOf(result.get("hitsAll")));
        resultMap1.put("一致性命中次数", String.valueOf(result.get("hitscongruent")));
        resultDBJson.put("一致性命中次数", String.valueOf(result.get("hitscongruent")));
        resultMap1.put("不一致性命中次数", String.valueOf(result.get("hitsincongruent")));
        resultDBJson.put("不一致性命中次数", String.valueOf(result.get("hitsincongruent")));
        resultMap1.put("NoCue命中次数", String.valueOf(result.get("hitsNoCue")));
        resultDBJson.put("NoCue命中次数", String.valueOf(result.get("hitsNoCue")));
        resultMap1.put("NeutralCue命中次数", String.valueOf(result.get("hitsNeutralCue")));
        resultDBJson.put("NeutralCue命中次数", String.valueOf(result.get("hitsNeutralCue")));
        resultMap1.put("SpatialCue命中次数", String.valueOf(result.get("hitsSpatialCue")));
        resultDBJson.put("SpatialCue命中次数", String.valueOf(result.get("hitsSpatialCue")));
        resultMap1.put("命中率", String.valueOf(result.get("hitRate")));
        resultDBJson.put("命中率", String.valueOf(result.get("hitRate")));
        resultMap1.put("一致性命中率", String.valueOf(result.get("congruentHitRate")));
        resultDBJson.put("一致性命中率", String.valueOf(result.get("congruentHitRate")));
        resultMap1.put("不一致性命中率", String.valueOf(result.get("incongruentHitRate")));
        resultDBJson.put("不一致性命中率", String.valueOf(result.get("incongruentHitRate")));
        resultMap1.put("NoCue命中率", String.valueOf(result.get("noCueHitRate")));
        resultDBJson.put("NoCue命中率", String.valueOf(result.get("noCueHitRate")));
        resultMap1.put("NeutralCue命中率", String.valueOf(result.get("neutralCueHitRate")));
        resultDBJson.put("NeutralCue命中率", String.valueOf(result.get("neutralCueHitRate")));
        resultMap1.put("SpatialCue命中率", String.valueOf(result.get("spatialCueHitRate")));
        resultDBJson.put("SpatialCue命中率", String.valueOf(result.get("spatialCueHitRate")));
        resultMap1.put("反应时", String.valueOf(result.get("responseTimeAll")));
        resultDBJson.put("反应时", String.valueOf(result.get("responseTimeAll")));
        resultMap1.put("一致性反应时", String.valueOf(result.get("responseTimeCongruent")));
        resultDBJson.put("一致性反应时", String.valueOf(result.get("responseTimeCongruent")));
        resultMap1.put("不一致性反应时", String.valueOf(result.get("responseTimeIncongruent")));
        resultDBJson.put("不一致性反应时", String.valueOf(result.get("responseTimeIncongruent")));
        resultMap1.put("NoCue反应时", String.valueOf(result.get("responseTimeNoCue")));
        resultDBJson.put("NoCue反应时", String.valueOf(result.get("responseTimeNoCue")));
        resultMap1.put("NeutralCue反应时", String.valueOf(result.get("responseTimeNeutralCue")));
        resultDBJson.put("NeutralCue反应时", String.valueOf(result.get("responseTimeNeutralCue")));
        resultMap1.put("SpatialCue反应时", String.valueOf(result.get("responseTimeSpatialCue")));
        resultDBJson.put("SpatialCue反应时", String.valueOf(result.get("responseTimeSpatialCue")));
        resultMap1.put("警觉分数", String.valueOf(result.get("warnScore")));
        resultDBJson.put("警觉分数", String.valueOf(result.get("warnScore")));
        resultMap1.put("定向分数", String.valueOf(result.get("directionScore")));
        resultDBJson.put("定向分数", String.valueOf(result.get("directionScore")));
        resultMap1.put("冲突分数", String.valueOf(result.get("conflictScore")));
        resultDBJson.put("冲突分数", String.valueOf(result.get("conflictScore")));
        resultMapList.add(resultMap1);
        String datas = jsonArray.toString();
        ExcelUtil.createExcelFile(ANTEntity.class, jsonArray.toJavaList(ANTEntity.class), resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_ANT), fileName, Constant.SHEET_NAME_ANT);

        JSONObject returnJson = new JSONObject(true);
        returnJson.put("fileName",fileName);
        returnJson.put("name", name);
        returnJson.put("resultJson",resultDBJson);
        returnJson.put("datas",datas);

        return returnJson;
    }


}
