package com.lantone.structure.facade.tran;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.lantone.common.util.StringUtil;
import com.lantone.structure.facade.tran.util.CommonAnalysisUtil;
import com.lantone.structure.model.doc.LeaveHospitalDoc;
import com.lantone.structure.util.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;


import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Description:出院小结
 * @author: cy
 * @time: 2021/2/24 09:33
 */
@Slf4j
public class LeaveHospitalTran extends TargetTran {

    @Override
    public Map<String, String> convert(String text) {
        LeaveHospitalDoc leaveHospitalDoc = new LeaveHospitalDoc();
        leaveHospitalDoc.setText(text);
        inputInfo.setLeaveHospitalDoc(leaveHospitalDoc);
        Map<String, String> structureMap = cutWord(text);
        Map<String, String> retMap = new HashMap<String, String>();
        leaveHospitalContrast(inputInfo.getLeaveHospitalDoc(), structureMap);
        mapKeyContrastCommon(structureMap,stagesContrasts,retMap);
        return retMap;
    }

    private List<String> stagesContrasts = Lists.newArrayList(
            "入院日期=入院日期时间",
            "出院日期=出院日期时间",
            "阳性结果=阳性辅助检查结果",
            "治疗经过=诊疗过程描述",
            "诊疗经过=诊疗过程描述",
            "经治/主治医师=住院医师签名",
            "首席医师=上级医师签名",
            "填写日期=签名日期时间"
    );
    private Map<String, String> cutWord(String text) {
        Map<String, String> sourceMap = Maps.newHashMap();
        List<String> titles = CommonAnalysisUtil.sortTitles(
                Lists.newArrayList("入院日期","出院日期","入院诊断","入院情况","主要阳性结果","主要阴性结果","阳性结果","阴性结果","住院期间的辅助检查","治疗经过","诊疗经过","出院情况","并发症","治疗效果","出院医嘱","营养指导","出院注意事项","首席医师",
                      "经治/主治医师：", "经治/主治医师","填写日期"),
                text
        );

        CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
        if(sourceMap.containsKey("入院诊断")||(sourceMap.containsKey("住院期间的辅助检查"))||(sourceMap.containsKey("出院注意事项"))||sourceMap.containsKey("阴性结果")||sourceMap.containsKey("主要阴性结果")||sourceMap.containsKey("营养指导")){
            sourceMap.remove("入院诊断");
            sourceMap.remove("住院期间的辅助检查");
            sourceMap.remove("出院注意事项");
            sourceMap.remove("阴性结果");
            sourceMap.remove("主要阴性结果");
            sourceMap.remove("营养指导");
        }
        return sourceMap;
    }


    public static void mapKeyContrastCommon(Map sourceMap, List<String> keyContrasts, Map<String, String> retMap) {
        Map<String, String> sourceMap_ = MapUtil.copyMap(sourceMap);
        String[] arry = null;
        String sourceKey = null, targetKey;
        Set<String> removeKey = new HashSet<>();
        for (String keyContrast : keyContrasts) {
            arry = keyContrast.split("=");
            sourceKey = arry[0];
            if (arry.length == 1) {
                targetKey = arry[0];
            } else {
                targetKey = arry[1];
            }
            if (StringUtil.isNotBlank(sourceMap_.get(sourceKey))
                    && (!retMap.containsKey(targetKey) || StringUtil.isBlank(retMap.get(targetKey)))) {
                retMap.put(targetKey, sourceMap_.get(sourceKey));
            }
            removeKey.add(sourceKey);
        }
        Set<String> keySet = retMap.keySet();
        for (String key : sourceMap_.keySet()) {
            if (!keySet.contains(key) && !removeKey.contains(key)) { // 如果之前已放过key就不用放了
                retMap.put(key, sourceMap_.get(key));
            }
        }
    }





    public void leaveHospitalContrast( LeaveHospitalDoc leaveHospitalDoc, Map<String, String> retMap) {
        if (leaveHospitalDoc != null) {
            if (StringUtil.isNotEmpty(retMap.get("出院日期"))) {
                String value = retMap.get("出院日期");
                if (value.contains("日")) {
                    String[] targetStr = value.split("日");
                    retMap.put("出院日期", targetStr[0]+"日");
                    retMap.put("实际住院天数", targetStr[1]);
                }
            }

        if (StringUtil.isNotEmpty(retMap.get("出院医嘱"))) {
            String doctorAdvice = retMap.get("出院医嘱");
           if(doctorAdvice.contains("出院带药")){
               doctorAdvice =  doctorAdvice.substring(doctorAdvice.indexOf("出院带药")+5);
               retMap.put("出院医嘱", doctorAdvice);
           }
        }

        //阳性辅助检查结果
            if (StringUtil.isEmpty(retMap.get("阳性结果"))) {
                if (StringUtil.isNotEmpty(retMap.get("主要阳性结果"))) {
                    String manRes = retMap.get("主要阳性结果");
                    retMap.put("阳性辅助检查结果", manRes);
                    retMap.remove("主要阳性结果");
                }
            }

            if (StringUtil.isNotEmpty(retMap.get("出院情况"))) {
                retMap.put("出院时症状与体征", retMap.get("出院情况"));
                if (StringUtil.isNotEmpty(retMap.get("并发症"))) {
                    retMap.put("出院情况", retMap.get("出院情况")+"并发症："+retMap.get("并发症"));
                }
                if (StringUtil.isNotEmpty(retMap.get("治疗效果"))) {
                    retMap.put("出院情况", retMap.get("出院情况")+"治疗效果："+retMap.get("治疗效果"));
                }
                retMap.remove("并发症");
                retMap.remove("治疗效果");

            }

            if (StringUtil.isNotEmpty(retMap.get("首席医师")) &&StringUtil.isNotEmpty(retMap.get("首席医师").trim())) {
                String firDoctor = retMap.get("首席医师");
                if(firDoctor.contains("经治/主治医师")){
                    String ote = firDoctor.split("经治/主治医师")[0];
                    if(StringUtil.isNotEmpty(ote) && StringUtil.isNotEmpty(ote.trim())){
                        firDoctor = ote.trim();
                        retMap.put("首席医师",firDoctor);
                    }else{
                        retMap.remove("首席医师");
                    }
                    String otc = firDoctor.split("经治/主治医师")[1];
                    if(StringUtil.isNotEmpty(otc) && StringUtil.isNotEmpty(otc.trim())){
                        String value =otc.trim();
                        if(value.contains("：")){
                            value =  value.substring(value.indexOf("：")+1);
                        }
                        retMap.put("经治/主治医师",value);
                    }
                }
            }else{
                retMap.remove("首席医师");
            }

            if (StringUtil.isNotEmpty(retMap.get("填写日期"))) {
                String fileDate = retMap.get("填写日期").replace(" ","").trim();
                String sginTime= lastTime(fileDate);
                retMap.put("填写日期",sginTime);
            }

            if (StringUtil.isNotEmpty(retMap.get("经治/主治医师"))) {
                String value = retMap.get("经治/主治医师");
                String retValue = parseString(value);
                retMap.put("经治/主治医师",retValue);
            }
        }
    }

    public static String parseString(String text){
        if(text.contains("/")){
            text = text.substring(text.lastIndexOf("/")+1);
            text= parseString(text);
        }
        return text;
    }

    /**
     * 抽取文本中的最后时间
     *
     * @param top
     * @return
     */
    public static String lastTime(String top) {
        Date date = null;
        try {
            date = DateUtils.parseDate(top, StringUtil.dateFormats);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        if(date!= null){
            return top;
        }else{
            if(top.contains("年") && top.contains("月") && top.contains("日")){
               top = extractDate(top);
                 lastTime(top);
            }
            return top;
        }
    }

    /**
     * 抽取文本中的第一个时间
     *
     * @param top
     * @return
     */
    public static String extractDate(String top) {
        Pattern pattern = Pattern.compile("[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}");
        Matcher matcher = pattern.matcher(top);
        if (matcher.find()) {
            return matcher.group(0);
        } else {
            Pattern p1 = Pattern.compile("[0-9]{4}年[0-9]+月[0-9]+日");
            Matcher m1 = p1.matcher(top);
            if (m1.find()) {
                return m1.group(0);
            }
        }
        return null;
    }
}