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.ANTFISHV2Entity;
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.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zsy
 * @description:ANT儿童版V2
 * @date 2021/7/20 15:55
 */
public class ANTFISHV2Cognize extends BaseScale {

    public ANTFISHV2Cognize(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("userResponseRecords");
        //总正确率
        String accuracy = jsonObject.getString("accuracy");
        //总平均反应时
        String averageResponseTime = jsonObject.getString("averageResponseTime");
        //一致平均反应时
        String averageConsistencyTime = jsonObject.getString("averageConsistencyTime");
        //不一致平均反应时
        String averageUnconsistencyTime = jsonObject.getString("averageUnconsistencyTime");
        //noCue平均反应时
        String averageNoCueTime = jsonObject.getString("averageNoCueTime");
        //neutralCue平均反应时
        String averageCenterCueTime = jsonObject.getString("averageCenterCueTime");
        //spatialCue平均反应时
        String averageSpatialCueTime = jsonObject.getString("averageSpatialCueTime");
        //dobuleCue平均反应时
        String averageDobuleCueTime = jsonObject.getString("averageDobuleCueTime");
        //警觉分数
        String warnScore = jsonObject.getString("warnScore");
        //定向分数
        String positionScore = jsonObject.getString("positionScore");
        //冲突分数
        String conflictScore = jsonObject.getString("conflictScore");

        fileName = resultJson.getString("fileName") + "-" + Constant.SHEET_NAME_ANT_FISH_V2 + ".xlsx";
        name = Constant.SHEET_NAME_ANT_FISH_V2;


        //专业报告处理
        resultDBJson.put("versionNo",Constant.COGNITION_RESULT_VERSION);

        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);

        //总得分
        JSONArray totalScores = new JSONArray();
        JSONObject totalScore = new JSONObject(true);
        String desc = null;

        double accur = Double.valueOf(accuracy)/100;
        if (accur>0.9){
            desc = "优秀等级：您的注意网络功能十分优秀，在本次测试表现中正确率在90%以上。您能很好地获得并维持对某个信息的警觉状态、能很好且及时有效地从外部信息进行选择、以及能很好地解决反应中的冲突。比如举个例子，上课时您能够全过程跟着老师的思路认真听讲，并能够抓住老师所讲的重点内容，且能够很好地排除课堂上的其他干扰。";
        }else if(accur>0.8 && accur<=0.9){
            desc = "较优秀等级：您的注意网络功能较为优秀，在本次测试表现中正确率在80%-90%之间。您能较好地获得并维持对某个信息的警觉状态、能较好且较及时有效地从外部信息进行选择、以及能较好地解决反应中的冲突。比如举个例子，上课时您能够一定程度上较认真地跟着老师的思路听讲，并能够一定程度上抓住老师所讲的重点内容，且能够较好地排除课堂上的其他干扰。";
        }else if(accur>0.7 && accur<=0.8){
            desc = "一般等级：您的注意网络功能一般，在本次测试表现中正确率在70%-80%之间。您不能很好但可以较好地获得并维持对某个信息的警觉状态、不能很好很及时有效但能较好较及时有效地从外部信息进行选择、以及不能很好但能较好地解决反应中的冲突。比如，上课听讲时您只能一定程度上跟着老师的思路听讲，抓住老师所讲的部分重点内容，能够排除一部分课堂上的其他干扰。";
        }else if(accur>0.6 && accur<=0.7){
            desc = "较差等级：您的注意网络功能较差，在本次测试表现中正确率在60%-70%之间。您不能很好地获得并维持对某个信息的警觉状态、不能很好且及时有效地从外部信息进行选择、以及不能很好地解决反应中的冲突。比如，上课听讲时您不能跟着老师的思路认真听讲，不能抓住老师所讲的重点内容，不能够排除课堂上的其他干扰。";
        }else if(accur<=0.6){
            desc = "极差等级：您的注意网络功能较差，在本次测试表现中正确率在60%以下。您完全不能很好地获得并维持对某个信息的警觉状态、完全不能很好且及时有效地从外部信息进行选择、以及完全不能很好地解决反应中的冲突。比如，上课听讲时您几乎不能跟着老师的思路听讲，几乎不能抓住老师所讲的重点内容，几乎不能够排除课堂上的其他干扰。";
        }
        totalScore.put("totalScore",accuracy);
        totalScore.put("totalScoreDesc",desc);
        totalScores.add(totalScore);
        resultDBJson.put("totalScore",totalScores);
        //各维度得分及结论模块
        JSONArray dimensions = new JSONArray();
        JSONObject scoreA = new JSONObject(true);
        scoreA.put("name","冲突分数");

        String DescribeA = null;
        if (conflictScore.contains("ms")){
            conflictScore = conflictScore.substring(0,conflictScore.indexOf("ms"));
        }
        scoreA.put("score",conflictScore);
        double conflict = Double.parseDouble(conflictScore);
        if (conflict>300){
            DescribeA = "极差等级:您的注意执行控制能力很差，即几乎不能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时他一定会受到噪音干扰，也几乎不能安心学习。";
        }else if(conflict>=200 && conflict<=300  ){
            DescribeA = "较差等级:您的注意执行控制能力较差，即不能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时他会受到噪音干扰，也不能安心学习。";
        }else if(conflict>=130 && conflict<200){
            DescribeA = "一般等级:您具有一般水平的注意执行控制能力，即能够较好但不能很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时他会一定程度上受噪音干扰，但也能安心学习。";
        }else if(conflict>=80 && conflict<130){
            DescribeA = "较优秀等级:您具有较好的注意执行控制能力，即能够较好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时他能够较好地安心学习，一定程度上不受噪音干扰。";
        }else if(conflict<80){
            DescribeA = "优秀等级:您具有很好的注意执行控制能力，即能够很好地处理对外界信息进行反应时的冲突。比如，当您在写作业或看书时，隔壁房间有人在唱歌，此时他能够很好地安心学习，不受噪音干扰。";
        }
        scoreA.put("Describe",DescribeA);
        scoreA.put("maximum","无");
        scoreA.put("groupName","第一组");
        dimensions.add(scoreA);

        JSONObject scoreB = new JSONObject(true);
        scoreB.put("name","定向分数");

        if (positionScore.contains("ms")){
            positionScore = positionScore.substring(0,positionScore.indexOf("ms"));
        }
        scoreB.put("score",positionScore);
        double position = Double.parseDouble(positionScore);
        String DescribeB = null;
        if (position< 50){
            DescribeB = "优秀等级:您具有很好的注意定向能力，即能够很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在骑自行车时，如果前方出现一条小狗，您能够很快发觉并及时做出刹车反应。";
        }else if(position>=50 && position<=70){
            DescribeB = "较优秀等级:您具有较好的注意定向能力，即能够较好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在骑自行车时，如果前方出现一条小狗，您能够较快发觉并做出刹车反应。";
        }else if(position>70 && position<100){
            DescribeB = "一般等级:您具有一般水平的注意定向能力，即不能够很好但能较好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在骑自行车时，如果前方出现一条小狗，您不能够很快但也能发觉并做出刹车反应。";
        }else if(position>=100 && position<=200){
            DescribeB = "较差等级:您的注意定向能力较差，即不能够很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在骑自行车时，如果前方出现一条小狗，您不能够很快发觉并做出刹车反应。";
        }else if(position > 200){
            DescribeB = "极差等级:您的注意定向能力很差，几乎不能很好地发觉情景中进入感觉通道的新异刺激并做出反应。比如，在骑自行车时，如果前方出现一条小狗，您几乎不能够发觉并做出刹车反应。";
        }
        scoreB.put("Describe",DescribeB);
        scoreB.put("maximum","无");
        scoreB.put("groupName","第一组");
        dimensions.add(scoreB);

        JSONObject scoreC = new JSONObject(true);
        scoreC.put("name","警觉分数");

        if (warnScore.contains("ms")){
            warnScore = warnScore.substring(0,warnScore.indexOf("ms"));
        }
        scoreC.put("score",warnScore);
        double warn = Double.parseDouble(warnScore);
        String DescribeC = null;
        if (warn <50){
            DescribeC = "优秀等级:您具有很好的注意警觉能力，即能够很好地保持对某一刺激的警觉投入状态。比如，在上课时，您能在上课的40分钟内很好地跟着老师的思路认真听讲，而不会中间走神或疲惫。";
        }else if(warn>=50 && warn<=70){
            DescribeC = "较优秀等级:您具有较好的注意警觉能力，即能够较好地保持对某一刺激的警觉投入状态。比如，在上课时，您能在上课的40分钟内较好地跟着老师的思路认真听讲，中间很少走神或疲惫。";
        }else if(warn> 70 && warn< 100){
            DescribeC = "一般等级:您具有一般水平的注意警觉能力，并不能够很好但能较好地保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内并不能完全很好地跟着老师的思路听讲但能一定程度上跟着老师的思路投入课堂，而且中间会略微走神或疲惫。";
        }else if(warn>= 100 && warn<=200){
            DescribeC = "较差等级:您的注意警觉能力较差，不能够很好地保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内并不能很好地跟着老师的思路听讲，而且中间会一定程度地走神或疲惫。";
        }else if(warn >200){
            DescribeC = "极差等级:您的注意警觉能力很差，几乎不能保持对某一刺激的警觉投入状态。比如，在上课时，您在上课的40分钟内不能跟着老师的思路听讲，而且中间很容易走神或疲惫。";
        }
        scoreC.put("Describe",DescribeC);
        scoreC.put("maximum","无");
        scoreC.put("groupName","第一组");
        dimensions.add(scoreC);
        resultDBJson.put("dimensions", dimensions);


        Map<String, String> resultMap = new LinkedHashMap<>();
        resultMap.put("总正确率", accuracy);
        resultDBJson.put("总正确率", accuracy);
        resultMap.put("总平均反应时", averageResponseTime);
        resultDBJson.put("总平均反应时", averageResponseTime);
        resultMap.put("一致平均反应时", averageConsistencyTime);
        resultDBJson.put("一致平均反应时", averageConsistencyTime);
        resultMap.put("不一致平均反应时", averageUnconsistencyTime);
        resultDBJson.put("不一致平均反应时", averageUnconsistencyTime);
        resultMap.put("noCue平均反应时", averageNoCueTime);
        resultDBJson.put("noCue平均反应时", averageNoCueTime);
        resultMap.put("neutralCue平均反应时", averageCenterCueTime);
        resultDBJson.put("neutralCue平均反应时", averageCenterCueTime);
        resultMap.put("spatialCue平均反应时", averageSpatialCueTime);
        resultDBJson.put("spatialCue平均反应时", averageSpatialCueTime);
        resultMap.put("dobuleCue平均反应时", averageDobuleCueTime);
        resultDBJson.put("dobuleCue平均反应时", averageDobuleCueTime);
        resultMap.put("警觉分数", warnScore);
        resultDBJson.put("警觉分数", warnScore);
        resultMap.put("定向分数", positionScore);
        resultDBJson.put("定向分数", positionScore);
        resultMap.put("冲突分数", conflictScore);
        resultDBJson.put("冲突分数", conflictScore);
        resultMapList.add(resultMap);

        String datas = jsonArray.toString();
        ExcelUtil.createExcelFile(ANTFISHV2Entity.class, jsonArray.toJavaList(ANTFISHV2Entity.class), resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_ANT_FISH_V2), fileName, name);

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

        return returnJson;
    }


}
