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.DeathRecordDoc;
import com.lantone.structure.util.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;


import java.util.*;


/**
 * @Description:死亡记录
 * @author: cy
 * @time: 2021/2/24 09:33
 */
@Slf4j
public class DeathRecordTran extends TargetTran {

    @Override
    public Map<String, String> convert(String text) {
        DeathRecordDoc deathRecordDoc = new DeathRecordDoc();
        deathRecordDoc.setText(text);
        inputInfo.setDeathRecordDoc(deathRecordDoc);
        Map<String, String> structureMap = cutWord(text);
        Map<String, String> retMap = new HashMap<String, String>();
        deathRecordContrast(inputInfo.getDeathRecordDoc(), 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.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));
            }
        }
    }


    /**
     * 抽取文本中的最后时间
     *
     * @param top
     * @return
     */
    public static String lastTime(String top) {
        int length = top.trim().length();
        String stringDate = top.trim().substring(length - 11, length);
        Date date = null;
        try {
             date = DateUtils.parseDate(stringDate, StringUtil.dateFormats);
        } catch (Exception e) {
           log.error(e.getMessage(),e);
        }
        if(date!= null){
            return stringDate;
        }else{
            return "";
        }
    }


    public void deathRecordContrast(  DeathRecordDoc deathRecordDoc, Map<String, String> retMap) {
        if(deathRecordDoc != null) {
            //年龄
            if (StringUtil.isNotEmpty(retMap.get("年龄"))) {
                String value = retMap.get("年龄");
                if (value.contains("岁")) {
                    retMap.put("年龄（岁）", value);
                    retMap.remove("年龄");
                }
                if (value.contains("月")) {
                    retMap.put("年龄（月）", value);
                    retMap.remove("年龄");
                }
            }



            //直接死亡原因名称
            if (StringUtil.isNotEmpty(retMap.get("死亡诊断"))) {
                String deathDiagnosislName = retMap.get("死亡诊断");
               Boolean flag = false;
                if(deathDiagnosislName.contains("/")){
                     deathDiagnosislName = deathDiagnosislName.substring(0, deathDiagnosislName.lastIndexOf("/"));
                     flag = true;
                }
                if(deathDiagnosislName.contains("管理员")){
                    deathDiagnosislName = deathDiagnosislName.substring(0, deathDiagnosislName.lastIndexOf("管理员"));
                    flag = true;
                }
                if(deathDiagnosislName.contains("      ")){
                    String[] split = deathDiagnosislName.split("      ");
                    if(split.length>2){
                        deathDiagnosislName =  split[0];
                        flag = true;
                    }
                }
                if(flag && StringUtil.isNotEmpty(deathDiagnosislName)){
                retMap.put("死亡诊断",deathDiagnosislName);
                retMap.put("死亡诊断-西医诊断名称",deathDiagnosislName);
                }else{
                    retMap.remove("死亡诊断");
                }
                comatible(deathDiagnosislName,retMap);
            }

            //死亡诊断名称兼容最后诊断
            if (StringUtil.isNotEmpty(retMap.get("最后诊断"))) {
                String deathDiagnosislName = retMap.get("最后诊断");
                comatible(deathDiagnosislName,retMap);
                retMap.put("死亡诊断名称",retMap.get("最后诊断"));
                retMap.remove("最后诊断");
            }

            //如果诊疗经过为空则取治疗经过  需要拼接抢救措施
            if (StringUtil.isEmpty(retMap.get("诊疗经过"))) {
                if (StringUtil.isNotEmpty(retMap.get("治疗经过"))) {
                    retMap.put("诊疗过程描述",retMap.get("治疗经过"));
                    if (StringUtil.isNotEmpty(retMap.get("抢救措施"))) {
                        retMap.put("诊疗过程描述",retMap.get("治疗经过")+" "+"抢救措施:"+retMap.get("抢救措施"));
                        retMap.remove("治疗经过");
                        retMap.remove("抢救措施");
                    }
                }
            }else{
                String str = retMap.get("诊疗经过");
                if (StringUtil.isNotEmpty(retMap.get("抢救措施"))) {
                    retMap.put("诊疗经过",str+" "+"抢救措施:"+retMap.get("抢救措施"));
                    retMap.remove("抢救措施");
                }
            }

            //签名日期时间
            if(StringUtil.isNotEmpty(retMap.get("死亡原因（包括死亡讨论结果）"))){
                String lastText = retMap.get("死亡原因（包括死亡讨论结果）");
                String sginTime= lastTime(lastText);
                if(StringUtil.isNotEmpty(sginTime)){
                    retMap.put("签名日期时间", sginTime);
                }
                retMap.remove("死亡原因（包括死亡讨论结果）");
            }

            //兼容日间
            //主诉
            if (StringUtil.isEmpty(retMap.get("主诉"))) {
                retMap.remove("主诉");
            }

            //入院情况
            if (StringUtil.isEmpty(retMap.get("入院情况"))) {
                retMap.remove("入院情况");
            }else{
                String firStr = retMap.get("入院情况");
                if(firStr.contains("初步诊断：")){
                    String str = firStr.substring(0, firStr.lastIndexOf("初步诊断："));
                    if(StringUtil.isNotEmpty(str)){
                    retMap.put("入院情况",str);
                    }else{
                        retMap.remove("入院情况");
                    }
                }
            }
            //死亡时间
            if (StringUtil.isEmpty(retMap.get("死亡时间"))) {
                retMap.remove("死亡时间");
            }

            //死亡原因
            if (StringUtil.isEmpty(retMap.get("死亡原因"))) {
                retMap.remove("死亡原因");
            }

            //初步诊断
            if (StringUtil.isNotEmpty(retMap.get("表格<诊断>内容"))) {
                String firStr = retMap.get("表格<诊断>内容");
                String retStr = "";
                if(firStr.contains("初步诊断：")){

                    retStr = firStr.substring(firStr.lastIndexOf("初步诊断：")+"初步诊断：".length());
                }
                if(retStr.contains("补充诊断：")){
                    retStr = retStr.split("补充诊断：")[0];
                }
                if(StringUtil.isNotEmpty(retStr.trim()) && retStr.contains("医师签名")){
                    retStr= retStr.substring(0,retStr.lastIndexOf("医师签名"));
                }else{
                    if( !retStr.contains("日  期") && retStr.contains("年") && retStr.contains("月")){
                        String date = lastTime(retStr);
                        if(StringUtil.isNotEmpty(date)) {
                            retStr= retStr.substring(retStr.lastIndexOf("初步诊断：")+"初步诊断：".length(),retStr.lastIndexOf(date));
                        }
                    }
                }

                if (StringUtil.isNotEmpty(retStr.trim())) {
                    retMap.put("入院诊断-西医诊断名称",retStr);
                }
                retMap.remove("表格<诊断>内容");
            }else{
                retMap.remove("表格<诊断>内容");
            }


            //入院时间
            if (StringUtil.isEmpty(retMap.get("入院时间"))) {
                retMap.remove("入院时间");
            }
      /*      String text = deathRecordDoc.getText();
            String[] split = text.split("\n");
            for (int i = 0; i < split.length; i++) {
                if( split[i].contains("姓    名：")){
                    String nameStr = split[i].substring(split[i].indexOf("姓    名：")+"姓    名：".length());
                    if (StringUtil.isNotEmpty(nameStr) && StringUtil.isEmpty(retMap.get("姓名"))) {
                        retMap.put("姓名",nameStr);
                    }
                }
                if( split[i].contains("性    别：")){
                    String nameStr = split[i].substring(split[i].indexOf("性    别：")+"性    别：".length());
                    if (StringUtil.isNotEmpty(nameStr) && StringUtil.isEmpty(retMap.get("性别"))) {
                        retMap.put("性别",nameStr);
                    }
                }

                if( split[i].contains("年    龄：")){
                    String nameStr = split[i].substring(split[i].indexOf("年    龄：")+"年    龄：".length());
                    if (StringUtil.isNotEmpty(nameStr) && StringUtil.isEmpty(retMap.get("年龄（岁）"))|| StringUtil.isEmpty(retMap.get("年龄（月）"))) {
                        if (nameStr.contains("岁")) {
                            retMap.put("年龄（岁）", nameStr);
                            retMap.remove("年龄");
                        }
                        if (nameStr.contains("月")) {
                            retMap.put("年龄（月）", nameStr);
                            retMap.remove("年龄");
                        }
                    }
                }

                if( split[i].contains("职    业：")){
                    String nameStr = split[i].substring(split[i].indexOf("职    业：")+"职    业：".length());
                    if (StringUtil.isNotEmpty(nameStr) && StringUtil.isEmpty(retMap.get("职业"))) {
                        retMap.put("职业",nameStr);
                    }
                }

            }*/
        }
    }

    public static void comatible(String deathDiagnosislName,Map<String,String>retMap){
        String trueRet = "";
        if (deathDiagnosislName.contains("2.")) {
            trueRet = deathDiagnosislName.substring(0, deathDiagnosislName.indexOf("2."));
            if (trueRet.contains("1.")) {
                trueRet = trueRet.substring(2);
            }
        }else{
            if (deathDiagnosislName.contains("1.")) {
                trueRet = deathDiagnosislName;
            }else{
                trueRet=  deathDiagnosislName.trim().split(" ")[0];
            }
        }
       if(StringUtil.isNotEmpty(trueRet)){
            retMap.put("直接死亡原因名称", trueRet);
        }
    }
}