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

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rf.psychological.scale.dao.model.ScaleEntity;
import com.rf.psychological.utils.Constant;

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

/**
 * @description 性向测试
 */
public class PERScale extends BaseScale {
    public PERScale(JSONArray jsonArray, JSONObject resultJson) {
        super(jsonArray, resultJson);
    }

    public JSONObject scaleCalculate() throws Exception {

        // 自定义路径使用
        /*ScaleUtil.getScaleDll("PERSCALE.dll");
        System.out.println("JSONArray:"+jsonArray);
        System.out.println("resultJson:"+resultJson);
        XScale xScale = new XScale(jsonArray,resultJson);
        String result = xScale.PERScale(jsonArray.toString(), resultJson.toString());
        //System.out.println("dllresult:"+result);
        //解决排序问题
        LinkedHashMap<String, Object> jsonMap = JSON.parseObject(result,LinkedHashMap.class, Feature.OrderedField);
        JSONObject jsonObject = new JSONObject(true);
        jsonObject.putAll(jsonMap);
        System.out.println("jsonObject:"+jsonObject);
        return jsonObject;*/

        //d总分
        int scoreD = 0;
        //I总分
        int scoreI = 0;
        //S总分
        int scoreS = 0;
        //C总分
        int scoreC = 0;

        List<ScaleEntity> scaleEntities = (List<ScaleEntity>) resultJson.get("scaleEntities");

        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
            String[] split = scaleEntities.get(i).getCheckItems().split("；");
            for (int y = 0; y < split.length; y++) {
                if (jsonObject1.getString("checkItems").equals(split[y])) {
                    switch (y) {
                        case 0: {
                            scoreD += 1;
                            break;
                        }
                        case 1: {
                            scoreI += 1;
                            break;
                        }
                        case 2: {
                            scoreS += 1;
                            break;
                        }
                        case 3: {
                            scoreC += 1;
                            break;
                        }
                    }
                }
            }
        }

        //得分列表
        Map<String, String> resultMap = new LinkedHashMap<>();
        resultMap.put("D总分", String.valueOf(scoreD));
        resultMap.put("I总分", String.valueOf(scoreI));
        resultMap.put("S总分", String.valueOf(scoreS));
        resultMap.put("C总分", String.valueOf(scoreC));
        resultJson.put("D总分", String.valueOf(scoreD));
        resultJson.put("I总分", String.valueOf(scoreI));
        resultJson.put("S总分", String.valueOf(scoreS));
        resultJson.put("C总分", String.valueOf(scoreC));
        Math.max(scoreD,scoreI);
        if (Math.max(scoreD,scoreI) == scoreD){
            if (Math.max(scoreD,scoreS) == scoreD){

            }
        }
        int maxScore = MAX(MAX(MAX(scoreD,scoreI),scoreS),scoreC);
        if(maxScore ==  scoreD){
            resultMap.put("结论", "控制型性格（D型，DOMINANCE）；" +
                    "喜欢掌握权利与权威、掌握主动；喜欢创新及多变的活动与挑战；简单直接、讲重点、重结果；自信心强；对办事的速度要求很高；" +
                    "讨厌失去掌控权和主动权；被别人利用；事情没结果、麻烦、复杂；做事拖沓");
            resultJson.put("结论", "控制型性格（D型，DOMINANCE）；" +
                    "喜欢掌握权利与权威、掌握主动；喜欢创新及多变的活动与挑战；简单直接、讲重点、重结果；自信心强；对办事的速度要求很高；" +
                    "讨厌失去掌控权和主动权；被别人利用；事情没结果、麻烦、复杂；做事拖沓");
            resultMap.put("建议", "要学会少命令、学会倾听；认同团队、了解与人配合的重要性；脸部表情柔和些、情绪管理；调整并放松步调；重过程、有耐性；多开口解释事情的来龙去脉");
            resultJson.put("建议", "要学会少命令、学会倾听；认同团队、了解与人配合的重要性；脸部表情柔和些、情绪管理；调整并放松步调；重过程、有耐性；多开口解释事情的来龙去脉");
        }else if(maxScore ==  scoreS){
            resultMap.put("结论", "保守型性格（S型，STEADINESS）；" +
                    "喜欢维持现状、避免冲突；可预期的例行工作；协助他人(被动) 、不需作决定；保守、稳重；重过程、亲和力强；喜和谐、安全感；" +
                    "讨厌现状的改变；冲突；挑战和压力；突发状况；冒险；快速的决定");
            resultJson.put("结论", "保守型性格（S型，STEADINESS）；" +
                    "喜欢维持现状、避免冲突；可预期的例行工作；协助他人(被动) 、不需作决定；保守、稳重；重过程、亲和力强；喜和谐、安全感；" +
                    "讨厌现状的改变；冲突；挑战和压力；突发状况；冒险；快速的决定");
            resultMap.put("建议", "要学会适时拒绝；学习接受挑战；不要顾虑太多，瞻前顾后，婆婆妈妈；尝试改变；要提高自信学会处理冲突");
            resultJson.put("建议", "要学会适时拒绝；学习接受挑战；不要顾虑太多，瞻前顾后，婆婆妈妈；尝试改变；要提高自信学会处理冲突");
        }else if(maxScore ==  scoreI){
            resultMap.put("结论", "影响型性格（I型，INFLUENCE）；" +
                    "喜欢感性，重感觉和直觉；听好话、受人肯定；爱发言、喜自夸、爱表现；乐观合伙、热心；在乎众人的目光；爱热闹、点子多；说好话、赞美别人；" +
                    "讨厌无聊；被忽略；寂寞、孤单；被人误解；理性交往");
            resultJson.put("结论", "影响型性格（I型，INFLUENCE）；" +
                    "喜欢感性，重感觉和直觉；听好话、受人肯定；爱发言、喜自夸、爱表现；乐观合伙、热心；在乎众人的目光；爱热闹、点子多；说好话、赞美别人；" +
                    "讨厌无聊；被忽略；寂寞、孤单；被人误解；理性交往");
            resultMap.put("建议", "要学会有长久的目标，避免三分钟热度；不要轻易相信别人；不要太爱管闲事；不要太乐观，要务实；避免自夸，给人光说不练的感觉");
            resultJson.put("建议", "要学会有长久的目标，避免三分钟热度；不要轻易相信别人；不要太爱管闲事；不要太乐观，要务实；避免自夸，给人光说不练的感觉");
        }else{
            resultMap.put("结论", "谨慎型性格（C型，CONSCIENTIOUS）；" +
                    "喜欢分析，中规中矩；谨慎行事，深思熟虑；注重质量及精确；彬彬有礼(但有距离，不亲切)；明确界定工作要求；重视专业表现，重过程；" +
                    "讨厌不经过分析的决定；不完美、被催促；没计划、没目标；没有标准，不精准");
            resultJson.put("结论", "谨慎型性格（C型，CONSCIENTIOUS）；" +
                    "喜欢分析，中规中矩；谨慎行事，深思熟虑；注重质量及精确；彬彬有礼(但有距离，不亲切)；明确界定工作要求；重视专业表现，重过程；" +
                    "讨厌不经过分析的决定；不完美、被催促；没计划、没目标；没有标准，不精准");
            resultMap.put("建议", "要学会不要太挑剔，钻牛角尖；不要太要求完美；不要疑心病太重，太小心；不要总是用批评性口吻");
            resultJson.put("建议", "要学会不要太挑剔，钻牛角尖；不要太要求完美；不要疑心病太重，太小心；不要总是用批评性口吻");
        }


        List<Map<String, String>> resultMapList = new ArrayList<>();
        resultMapList.add(resultMap);

        JSONObject returnJson = new JSONObject(true);
        returnJson.put("resultMapList", resultMapList);
        returnJson.put("scaleName", Constant.SHEET_NAME_PER);
        returnJson.put("resultJson", resultJson);

        return returnJson;
    }

    public static int MAX(int x,int y){
        if(x>y)
            return x;
        else
            return y;
    }

}
