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.util.MapUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description: 特殊检查及特殊治疗同意书
 * @author: wsy
 * @time: 2021/3/11 14:49
 */
@Slf4j
public class SpecialCureConsentDocTran extends TargetTran {
    @Override
    public Map<String, String> convert(String text) {
        Map<String, String> structureMap = cutWord(text);
        Map<String, String> retMap = new HashMap<String, String>();
        CommonAnalysisUtil.mapKeyContrastCommon(structureMap, keyContrasts, retMap);
        retMap.entrySet().removeIf(entry -> StringUtil.isBlank(entry.getValue()));
        retMap.entrySet().removeIf(entry ->
                !entry.getValue().matches("[\\d]+年[\\d]+月[\\d]+日[\\d]+时[\\d]+分") && ("患者/法定代理人签名日期时间".equals(entry.getKey()) || "医师签名日期时间".equals(entry.getKey()))
        );
        return retMap;
    }

    private Map<String, String> cutWord(String text) {
        Map<String, String> sourceMap = Maps.newHashMap();
        String dataStr = "";
        if (text.contains("有创操作安全核查表")) {
            text = text.substring(0, text.indexOf("有创操作安全核查表"));
        }
        //切取（特殊检查及特殊治疗项目名称）
        cutProjectName(sourceMap, text);
        text = text.replace("年   月   日    时   分", "")
                .replace("我的医师已经告知我将要进行的治疗方式必要性、步骤、成功率、治疗及治疗后可能发生的风险和并发症、不实施该医疗措施的风险，操作中或操作后可能发生疼痛，及产生疼痛后的治疗措施，我经慎重考虑，已充分理解本知情同意书的各项内容，并授权医师对操作涉及的病变器官、组织、标本及影像资料等进行处理。如果患者无法签署知情同意书，请其授权的代理人在此签名。愿意承担由于疾病本身或现有医疗技术所限而致的医疗意外和并发症，并选择本治疗(而非替代方案中的治疗方案)。", "")
                .replace("我的医师已经告知我将要进行的治疗方式必要性、步骤、成功率、治疗及治疗后可能发生的风险和并发症、不实施该医疗措施的风险,操作中或操作后可能发生疼痛,及产生疼痛后的治疗措施,我经慎重考虑,已充分理解本知情同意书的各项内容,愿意承担由于疾病本身或现有医疗技术所限而致的医疗意外和并发症,并选择本手术治疗(而非替代方案中的手术)。","")
                .replace("_", "")
                .replace("如果患者无法签署知情同意书, 请其授权的代理人在此签名:", "")
                .replace("不确定 无", "");
        List<String> titles = CommonAnalysisUtil.sortTitles(
                Lists.newArrayList("1.目前诊断", "2.诊疗操作目的", "2 诊疗操作目的", "3 适应症及禁忌症", "4 主要意外、风险及并发症", "5 防范措施", "6 可替代的方案",
                        "3.操作、治疗过程中及以后可能出现的情况", "4.防范措施", "5.可替代方案"),
                text
        );
        CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
        if (sourceMap != null) {
            if (sourceMap.containsKey("6可替代的方案")) {
                dataStr = sourceMap.get("6可替代的方案");
                sourceMap.put("6可替代的方案", dataStr.substring(0, Math.max(0, dataStr.indexOf("操作人员"))));
                List<String> listTitle = Lists.newArrayList(
                        "操作人员", "谈话医师签名", "患方签名", "患者签名", "患方签名", "代理人签名", "与患者关系"
                );
                CommonAnalysisUtil.sortTitlesNoColon(listTitle, dataStr);
                CommonAnalysisUtil.cutByTitlesNoColon(dataStr, listTitle, 0, sourceMap);
            } else if (sourceMap.containsKey("5.可替代方案")) {
                dataStr = sourceMap.get("5.可替代方案");
                sourceMap.put("5.可替代方案", dataStr.substring(0, Math.max(0, dataStr.indexOf("操作人员"))));
                List<String> listTitle = Lists.newArrayList(
                        "操作人员", "患方签名", "患者签名", "患方签名", "代理人签名", "与患者关系"
                );
                CommonAnalysisUtil.sortTitlesNoColon(listTitle, dataStr);
                CommonAnalysisUtil.cutByTitlesNoColon(dataStr, listTitle, 0, sourceMap);
            }

            disDate(sourceMap, "谈话医师签名", "签名日期");
            disDate(sourceMap, "操作人员", "签名时间");
            disDate(sourceMap, "患者签名", "签名时间");
            disDate(sourceMap, "与患者关系", "签名日期");
            disDate(sourceMap, "与患者关系", "签名时间");
            CommonAnalysisUtil.removeKey(sourceMap, "1.目前诊断", "5防范措施", "3适应症及禁忌症", "4.防范措施");
        }
        return sourceMap;
    }

    private void cutProjectName(Map sourceMap, String text) {
        String projectName = "";
        if (text.contains("这是一份关于")) {
            projectName = text.substring(0, text.indexOf("这是一份关于"));
        }
        if (StringUtil.isNotBlank(projectName)) {
            projectName = projectName.replace("_", "")
                    .replace("(包含核查表)", "")
                    .replace("(新）", "")
                    .replace("知情同意书", "")
                    .replaceAll("[\\d]", "");
            sourceMap.put("特殊检查及特殊治疗项目名称", projectName);
        }
    }

    private void disDate(Map sourceMap, String... args) {
        Map<String, String> sourceMap_ = MapUtil.copyMap(sourceMap);
        if (sourceMap.containsKey(args[0]) && sourceMap_.get(args[0]).contains(args[1])) {
            int index = sourceMap_.get(args[0]).indexOf(args[1]);
            sourceMap.put(args[0], sourceMap_.get(args[0]).substring(0, index));
            sourceMap.put(args[0] + args[1], sourceMap_.get(args[0]).substring(index).replace(args[1], "").replaceAll("[:：]", ""));
        }
    }


    private List<String> keyContrasts = Lists.newArrayList(
            "2诊疗操作目的=特殊检查及特殊治疗目的",
            "2.诊疗操作目的=特殊检查及特殊治疗目的",
            "4主要意外、风险及并发症=特殊检查及特殊治疗可能引起的并发症及风险",
            "3.操作、治疗过程中及以后可能出现的情况=特殊检查及特殊治疗可能引起的并发症及风险",
            "6可替代的方案=替代方案",
            "5.可替代方案=替代方案",
            "患方签名=患者/法定代理人签名",
            "患者签名签名时间=患者/法定代理人签名日期时间",
            "与患者关系签名日期=患者/法定代理人签名日期时间",
            "与患者关系签名时间=患者/法定代理人签名日期时间",
            "谈话医师签名=医师签名",
            "操作人员签名时间=医师签名日期时间",
            "谈话医师签名签名日期=医师签名日期时间"
    );
}