package com.lantone.qc.kernel.catalogue.yiwu.threelevelward;

import com.lantone.qc.dbanaly.util.KernelConstants;
import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
import com.lantone.qc.kernel.catalogue.QCCatalogue;
import com.lantone.qc.kernel.util.CatalogueUtil;
import com.lantone.qc.pub.Content;
import com.lantone.qc.pub.model.InputInfo;
import com.lantone.qc.pub.model.OutputInfo;
import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
import com.lantone.qc.pub.model.doc.operation.OperationDoc;
import com.lantone.qc.pub.util.SpringContextUtil;
import com.lantone.qc.pub.util.StringUtil;
import org.springframework.stereotype.Component;

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

/**
 * @ClassName : THR0601
 * @Description : 整份病历无主治医师查房记录
 * @Author : 胡敬
 * @Date: 2020-03-25 10:21
 */
@Component
public class THR0601 extends QCCatalogue {
    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
        status.set("0");
        if (inputInfo.getLeaveHospitalDoc() == null || inputInfo.getThreeLevelWardDocs().size() == 0) {
            return;
        }
        Map<String, String> leaveHospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
        String lengthOfStay = leaveHospitalStructureMap.get("住院天数");
        if (StringUtil.isNotBlank(lengthOfStay) && CatalogueUtil.numbersOnly(lengthOfStay)) {
            //如果住院天数小于2天则不判断该条规则
            if (Integer.parseInt(lengthOfStay) <= 2) {
                return;
            }
        }

        String deptDirector = "";
        String directorDoctor = "";
        String attendingDoctor = "";
        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
        if (firstPageRecordDoc != null) {
            Map<String, String> firstPageStructureMap = firstPageRecordDoc.getStructureMap();
            if (firstPageStructureMap != null) {
                deptDirector = firstPageStructureMap.get("科主任");
                directorDoctor = firstPageStructureMap.get("主任医师");
                attendingDoctor = firstPageStructureMap.get("主治医师");
            }
        }

        if (inputInfo.getFirstCourseRecordDoc() != null) {
            Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
            String recordDoctor = structureMap.get("记录医生");
            if (StringUtil.isNotBlank(recordDoctor)) {
                String operationProfessor = getCourseProfessor(recordDoctor);
                if (operationProfessor.contains("主治") || operationProfessor.contains("主任") ||
                        (StringUtil.isNotBlank(deptDirector) && recordDoctor.contains(deptDirector)) ||
                        (StringUtil.isNotBlank(directorDoctor) && recordDoctor.contains(directorDoctor)) ||
                        (StringUtil.isNotBlank(attendingDoctor) && recordDoctor.contains(attendingDoctor))) {
                    return;
                }
            }
        }

        /* 如果存在手术记录，判断主刀医生是否为主治医生 */
        String operatorName = "";
        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
        if (operationDocs != null) {
            for (OperationDoc operationDoc : operationDocs) {
                if (operationDoc.getOperationRecordDoc() != null) {
                    Map<String, String> operationDocStructureMap = operationDoc.getOperationRecordDoc().getStructureMap();
                    if (StringUtil.isBlank(operatorName)) {
                        operatorName = operationDocStructureMap.get("主刀医师");
                        if (StringUtil.isBlank(operatorName) && StringUtil.isNotBlank(operationDocStructureMap.get("手术者及助手名称"))) {
                            operatorName = operationDocStructureMap.get("手术者及助手名称").split("、")[0];
                            if (operatorName.contains("主刀：") && operatorName.split("：").length > 1) {
                                operatorName = operatorName.split("：")[1];
                            }
                        }
                    }
                }
            }
        }

        //取病案首页主治医生名称
//        String visitingStaff = "";
//        if (inputInfo.getFirstPageRecordDoc() != null) {
//            Map<String, String> firstPageStructureExtMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
//            visitingStaff = firstPageStructureExtMap.get("主治医师");
//        }

        List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();//查房记录
        String title, record;
        boolean findIndications = false;
        for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
            Map<String, String> rescueStructureMap = threeLevelWardDoc.getStructureMap();
            title = CatalogueUtil.subTitle(rescueStructureMap.get("查房标题"));
            record = CatalogueUtil.subTitle(rescueStructureMap.get("病情记录"));
            if (StringUtil.isNotBlank(title) && title.contains(Content.attend)) {
                findIndications = true;
                break;
            }
            if (StringUtil.isNotBlank(record) && record.contains(Content.attend)) {
                findIndications = true;
                break;
            }

            if (StringUtil.isNotBlank(operatorName) && (title.contains("主刀") || record.contains("主刀"))) {
                String operationProfessor = getCourseProfessor(operatorName);
                if (operationProfessor.contains("主治")) {
                    findIndications = true;
                    break;
                }
            }

        }
        if (!findIndications) {
            status.set("-1");
        }
    }

    private String getCourseProfessor(String operatorName) {
        String professor = "";
        if (StringUtil.isBlank(operatorName)) {
            return professor;
        }
        SpecialStorageUtil specialStorageUtil = SpringContextUtil.getBean("specialStorageUtil");
        Map<String, Object> surgeon = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
        if (surgeon != null) {
            Map<String, String> doctor = (Map) surgeon.get(operatorName);
            if (doctor != null) {
                professor = doctor.get("professor");
            }

        }
        return professor;
    }
}