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/08 15:29
 */
@Slf4j
public class OperationInformedConsentDocTran 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();
        if (text.contains("九、术中知情谈话记录")) {
            text = text.substring(0, text.indexOf("九、术中知情谈话记录"));
        }
        List<String> titles = CommonAnalysisUtil.sortTitles(
                Lists.newArrayList("二、您的主刀医师是", "三、术前诊断", "拟实施手术名称", "手术指征", "四、医师会用通俗易懂的语言向您解释", "（1）告知可能发生的意外、并发症或风险",
                        "（2）告知手术后可能出现 的意外和并发症", "（2）告知手术后可能出现的意外和并发症", "手术后可能出现的意外和并发症", "3.特殊风险或主要高危因素", "（3）特殊风险或主要高危因素", "针对上述情况医师将采取的防范措施", "五、替代治疗方案及优缺点", "患者及家属要求手术治疗，并签字为证",
                        "七、医师声明", "书写者签名", "主刀医师签名", "医生签名", "八、患方意见", "患者（代理人）签名", "患方签名", "患者签名", "患方签字", "如果患者无法签署知情同意书, 请其授权的代理人在此签名",
                        "代理人签名", "与患者关系"),
                text
        );
        CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
        if (sourceMap != null) {
            disDate(sourceMap, "书写者签名", "签名时间");
            disDate(sourceMap, "患者（代理人）签名", "签名时间");
            disDate(sourceMap, "患方签名", "签名时间");
            disDate(sourceMap, "患者签名", "签名时间");
            disDate(sourceMap, "患方签字", "签名时间");
            disDate(sourceMap, "患者及家属要求手术治疗，并签字为证", "七、医师声明");
            disDate(sourceMap, "主刀医师签名", "八、患方意见");
            disDate(sourceMap, "主刀医师签名", "签名时间");
            disDate(sourceMap, "医生签名", "签名时间");
            disDate(sourceMap, "与患者关系", "签名时间");
            if (sourceMap.containsKey("五、替代治疗方案及优缺点") && sourceMap.get("五、替代治疗方案及优缺点").contains("六、医学是一门科学")) {
                sourceMap.put("五、替代治疗方案及优缺点", sourceMap.get("五、替代治疗方案及优缺点").substring(0, sourceMap.get("五、替代治疗方案及优缺点").indexOf("六、医学是一门科学")));
            }
            if (sourceMap.containsKey("手术指征") && sourceMap.get("手术指征").contains("麦默通手术主要用于")) {
                sourceMap.put("手术指征", sourceMap.get("手术指征").substring(0, sourceMap.get("手术指征").indexOf("麦默通手术主要用于")));
            }
            CommonAnalysisUtil.removeKey(sourceMap, "二、您的主刀医师是", "四、医师会用通俗易懂的语言向您解释", "3.特殊风险或主要高危因素", "（3）特殊风险或主要高危因素", "针对上述情况医师将采取的防范措施");
        }
        return sourceMap;
    }

    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(
            "三、术前诊断=术前诊断",
            "拟实施手术名称=拟实施手术及操作日期时间",
            "（1）告知可能发生的意外、并发症或风险=手术中可能出现的意外及风险",
            "（2）告知手术后可能出现的意外和并发症=手术后可能出现的意外及并发症",
            "（2）告知手术后可能出现 的意外和并发症=手术后可能出现的意外及并发症",
            "五、替代治疗方案及优缺点=替代方案",
            "患者（代理人）签名=患者签名",
            "患方签名=患者签名",
            "患方签字=患者签名",
            "患者（代理人）签名=法定代理人签名",
            "主刀医师签名=手术者签名",
            "医生签名=手术者签名",
            "书写者签名=经治医师签名",
            "书写者签名签名时间=医师签名日期时间",
            "患者（代理人）签名签名时间=患者/法定代理人签名日期时间",
            "患方签名签名时间=患者/法定代理人签名日期时间",
            "患方签字签名时间=患者/法定代理人签名日期时间",
            "患者签名签名时间=患者/法定代理人签名日期时间",
            "七、医师声明=医疗机构意见",
            "患者及家属要求手术治疗，并签字为证七、医师声明=医疗机构意见",
            "主刀医师签名八、患方意见=患者/法定代理人意见",
            "八、患方意见=患者/法定代理人意见",
            "主刀医师签名签名时间=医师签名日期时间",
            "医生签名签名时间=医师签名日期时间",
            "手术后可能出现的意外和并发症=手术后可能出现的意外及并发症",
            "与患者关系签名时间=患者/法定代理人签名日期时间"
    );
}