package org.diagbot.push.convert;

import com.alibaba.fastjson.JSONObject;
import org.diagbot.common.push.bean.ResponseData;
import org.diagbot.common.push.bean.SearchData;
import org.diagbot.nlp.participle.ParticipleUtil;
import org.diagbot.nlp.participle.word.Lexeme;
import org.diagbot.nlp.participle.word.LexemePath;
import org.diagbot.nlp.util.Constants;

import java.util.*;
import java.util.stream.Collectors;

public class PreProcess {

    private static String up = "升高";
    private static String down = "降低";
    private static String normal = "正常";

    private static String pos = "阳性";
    private static String neg = "阴性";

    private List<Map<String, Object>> vitlist = new ArrayList<>();
    private String[] vitkeyset = {"index", "value", "unit"};
    private String[] bptype = {"血压","收缩压","舒张压","/"};

    /**
     * 处理临床数据
     *
     * @param searchdata
     * @return ResponseData
     */
    public SearchData processClinicalData(SearchData searchdata) {
        SearchData sData = searchdata;

//        sData.setLisArr(processLis(sData.getLisArr()));
//
//        if (sData.getLisArr().size() > 0) {
//            List<String> otherVal = sData.getLisArr().stream().map(lisArr -> lisArr.getOtherValue()).collect(Collectors.toList());
//            sData.setLis(String.join(",", otherVal));
//        }

        return sData;
    }

    public ResponseData applyrules(SearchData sData) {

        ResponseData ruleResponse = new ResponseData();
//
//        List<MedicalIndication> reminder;
//        try {
//            Map<String, List<Rule>> rule = ApplicationCacheUtil.get_rule_filter_map();
//
//            reminder = applytolis(sData.getLisArr(), rule);
//
//            reminder.addAll(applytovital(sData.getVital(), rule));
//
//            ruleResponse.setMedicalIndications(reminder);
//
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
            return ruleResponse;
//        }
    }

//    private List<MedicalIndication> applytolis(List<LisDetail> lisarr, Map<String, List<Rule>> rule) {
//
//        List<MedicalIndication> reminder = new ArrayList<>();
//        try {
//            String name;
//            String detail;
//
//            for (LisDetail lis : lisarr) {
//                detail = lis.getDetailName();
////                name = lis.getName();
//                String key = detail;
//                if (rule.get(key) != null) {
//                    reminder.addAll(comparelis(rule.get(key), lis));
//                }
//            }
//
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
//            return reminder;
//        }
//    }
//
//    private List<MedicalIndication> applytovital(String vital, Map<String, List<Rule>> rule) {
//
//        List<MedicalIndication> reminder = new ArrayList<>();
//
//        try {
//            Map<String, Object> vitobj = new HashMap<>();
//            Lexeme lexeme;
//            LexemePath<Lexeme> lexemes = ParticipleUtil.participle(vital);
//            for (int i=0; i<lexemes.size(); i++) {
//                lexeme = lexemes.get(i);
//                if (lexeme.getText().trim().length() > 0) {
//                    if (lexeme.getProperty().equals(Constants.word_property_vital_idx)) {
//                        vitobj = new HashMap<>();
//                        vitobj.put(vitkeyset[0], lexeme.getText());
//                    } else if (lexeme.getProperty().equals(Constants.word_property_number) &&
//                            vitobj.get(vitkeyset[0]) != null) {
//                        vitobj.put(vitkeyset[1], lexeme.getText());
//                    } else if (lexeme.getProperty().equals(Constants.word_property_unit) &&
//                            vitobj.get(vitkeyset[1]) != null) {
//                        vitobj.put(vitkeyset[2], lexeme.getText());
//
//                        if (vitobj.get(vitkeyset[0]).toString().equals(bptype[0]) &&
//                                vitobj.get(vitkeyset[1]).toString().contains(bptype[3])) {
//                            String[] idx = Arrays.asList(bptype).subList(1,3).toArray(new String[2]);
//                            String[] vals = vitobj.get(vitkeyset[1]).toString().split(bptype[3]);
//                            String unit = vitobj.get(vitkeyset[2]).toString();
//
//                            if (idx.length == vals.length) {
//                                for (int j=0; j<idx.length; j++) {
//                                    vitobj = new HashMap<>();
//                                    vitobj.put(vitkeyset[0], idx[j]);
//                                    vitobj.put(vitkeyset[1], vals[j]);
//                                    vitobj.put(vitkeyset[2], unit);
//                                    vitlist.add(vitobj);
//                                }
//                            }
//                        } else {
//                            vitlist.add(vitobj);
//                        }
//                    }
//                }
////                System.out.println(lexeme.getText() + ": " + lexeme.getProperty());
//            }
//
//            for (Map<String, Object> obj : vitlist) {
//                String idx = obj.get(vitkeyset[0]).toString();
//                if (rule.get(idx) != null) {
//                    reminder.addAll(comparevit(rule.get(idx), obj));
//                }
//            }
//            System.out.println("\n");
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
//            return reminder;
//        }
//    }
//
//
//    private List<MedicalIndication> comparelis(List<Rule> rules, LisDetail lis) {
//        List<MedicalIndication> reminder = new ArrayList<>();
//
//        try {
//            String detailname = lis.getDetailName();
//            Double numval = lis.getValue();
//            String unit = lis.getUnits();
//            String otherval = lis.getOtherValue();
//
//            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
//            return reminder;
//        }
//    }
//
//    private List<MedicalIndication> comparevit(List<Rule> rules, Map<String, Object> vit) {
//        List<MedicalIndication> reminder = new ArrayList<>();
//
//        try {
//            String detailname = vit.get(vitkeyset[0]).toString();
//            Double numval = Double.valueOf(vit.get(vitkeyset[1]).toString());
//            String unit = vit.get(vitkeyset[2]).toString();
//            String otherval = "";
//
//            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
//            return reminder;
//        }
//    }
//
//    private List<MedicalIndication> compare(List<Rule> rules, List<MedicalIndication> reminder,
//                                            String detailname, Double numval, String unit, String otherval) {
//        boolean minmatch, maxmatch;
//        Double minval, maxval;
//        String minop, maxop, minunit, maxunit;
//
//        try {
//            if (null == numval && otherval.trim().length() > 0) {
//                for (Rule rule : rules) {
//                    if (rule.getMin_operator().equals("=") && otherval.contains(rule.getMin_value())) {
//                        StringBuffer rulesContent = new StringBuffer();
//                        StringBuffer append = rulesContent.append(rule.getIdx_name()).append(rule.getMin_operator()).append(rule.getMin_value()).append(rule.getMin_unit())
//                                .append(rule.getMax_operator()).append(rule.getMax_value()).append(rule.getMax_unit());
//                        MedicalIndication medind = new MedicalIndication();
//                        List<MedicalIndicationDetail> k = new ArrayList<>();
//                        MedicalIndicationDetail mid = new MedicalIndicationDetail();
//                        JSONObject jsonObject = new JSONObject();
////                        jsonObject.put("name",detailname + ": " + otherval+ ", " +rule.getRemind());
//                        jsonObject.put("name",append.toString());
//                        jsonObject.put("controlType",2);
//                        mid.setType(4);
//                        mid.setContent(jsonObject);
//                        k.add(mid);
//                        medind.setName(rule.getRemind());
//                        medind.setDetails(k);
//                        reminder.add(medind);
//
//                        System.out.println(medind.getRule() + " -> " + medind.getName());
//                    }
//                }
//            } else if (String.valueOf(numval).trim().length() > 0 && unit.length() > 0){
//                for (Rule rule : rules) {
//                    minmatch = maxmatch = false;
//                    minval = (rule.getMin_value().length()==0)?0:Double.valueOf(rule.getMin_value());
//                    maxval = (rule.getMax_value().length()==0)?0:Double.valueOf(rule.getMax_value());
//                    minunit = rule.getMin_unit();
//                    maxunit = rule.getMax_unit();
//                    minop = rule.getMin_operator();
//                    maxop = rule.getMax_operator();
//
//                    if ( String.valueOf(minval).trim().length() > 0 && minunit.equals(unit) ) {
//                        switch (minop) {
//                            case ">":
//                                if (numval > minval) { minmatch = true; }
//                                break;
//                            case ">=":
//                                if (numval >= minval) { minmatch = true; }
//                                break;
//                        }
//                    } else { minmatch = true; }
//
//                    if (String.valueOf(maxval).trim().length() > 0 && maxunit.equals(unit) ) {
//                        switch (maxop) {
//                            case "<":
//                                if (numval < maxval) { maxmatch = true; }
//                                break;
//                            case "<=":
//                                if (numval <= maxval) { maxmatch = true; }
//                                break;
//                        }
//                    } else { maxmatch = true; }
//
//                    if (minmatch && maxmatch) {
//                        StringBuffer rulesContent = new StringBuffer();
//                        StringBuffer append = rulesContent.append(rule.getIdx_name()).append(rule.getMin_operator()).append(rule.getMin_value()).append(rule.getMin_unit())
//                                .append(rule.getMax_operator()).append(rule.getMax_value()).append(rule.getMax_unit());
//
//                        MedicalIndication medind = new MedicalIndication();
//                        List<MedicalIndicationDetail> k = new ArrayList<>();
//                        MedicalIndicationDetail mid = new MedicalIndicationDetail();
//                        JSONObject jsonObject = new JSONObject();
////                        jsonObject.put("name",detailname + ": " + numval + " " + unit+ "," +rule.getRemind());
//                        jsonObject.put("name", append.toString());
//                        jsonObject.put("controlType",2);
//                        mid.setType(4);
//                        mid.setContent(jsonObject);
//                        k.add(mid);
//                        medind.setName(rule.getRemind());
//                        medind.setDetails(k);
//                        reminder.add(medind);
//
//                        System.out.println(medind.getRule() + " -> " + medind.getName());
//                    }
//                }
//            }
//
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        } finally {
//            return reminder;
//        }
//    }
//
//    private List<LisDetail> processLis(List<LisDetail> lisArr) {
//        if (lisArr == null) {
//            return new ArrayList<>();
//        }
//        if (lisArr.size() == 0) {
//            return lisArr;
//        }
//
//        String Otherval = "";
//
//        for (int i = 0; i < lisArr.size(); i++) {
//            LisDetail lisres = lisArr.get(i);
//
////            Otherval = (lisres.getOtherValue().trim().length() > 0) ? lisres.getOtherValue().trim() + "\n" : "";
//            Otherval = lisres.getOtherValue();
//
//            if (Otherval.indexOf(pos) >= 0 || Otherval.indexOf(neg) >= 0) {
//                lisres.setOtherValue(lisres.getDetailName() + Otherval);
//            } else {
//                Otherval = (Otherval.trim().length() > 0) ? Otherval.trim() + "\n" : "";
//                if (lisres.getValue() == null) {
//                    continue;
//                } else if (lisres.getMaxValue() != null && lisres.getValue() > lisres.getMaxValue()) {
//                    lisres.setOtherValue(Otherval + lisres.getDetailName() + up);
//                } else if (lisres.getMinValue() != null && lisres.getValue() < lisres.getMinValue()) {
//                    lisres.setOtherValue(Otherval + lisres.getDetailName() + down);
//                } else {
//                    lisres.setOtherValue(Otherval + lisres.getDetailName() + normal);
//                }
//            }
//        }
//
//        return lisArr;
//    }
}
