package com.lantone.qc.kernel.catalogue.xiamen.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.model.InputInfo;
import com.lantone.qc.pub.model.OutputInfo;
import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
import com.lantone.qc.pub.model.doc.MedicalRecordInfoDoc;
import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
import com.lantone.qc.pub.util.DateUtil;
import com.lantone.qc.pub.util.SpringContextUtil;
import com.lantone.qc.pub.util.StringUtil;
import org.springframework.stereotype.Component;

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

/**
 * @ClassName : THR0126
 * @Description : 主治医师首次查房未在48小时内完成
 * @Author : 胡敬
 * @Date: 2020-03-19 15:50
 */
@Component
public class THR0126 extends QCCatalogue {
    public void start(InputInfo inputInfo, OutputInfo outputInfo) {

        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
        if (medicalRecordInfoDoc != null && medicalRecordInfoDoc.getStructureMap() != null) {
            //入院日期
            String admisTime = medicalRecordInfoDoc.getStructureMap().get("behospitalDate");
            //出院日期
            String dischargeTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
            if (CatalogueUtil.isEmpty(admisTime) || CatalogueUtil.isEmpty(dischargeTime)) {
                status.set("0");
                return;
            }
            if (!CatalogueUtil.compareTime(
                    StringUtil.parseDateTime(admisTime),
                    StringUtil.parseDateTime(DateUtil.nowString()),
                    Long.valueOf(48 * 60))) {//如果入院未超过48小时，规则不判断
                status.set("0");
                return;
            }
            //如果住院天数小于2天则不判断该条规则
            if (DateUtil.parseDate(dischargeTime) != null && StringUtil.isNotEmpty(dischargeTime) &&
                    !CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (48 * 60))) {
                status.set("0");
                return;
            } else {
                if (inputInfo.getThreeLevelWardDocs().size() == 0) {
                    return;
                }
            }
        }

        if (inputInfo.getBeHospitalizedDoc() != null) {
            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
            String admisTime = beHospitalStructureMap.get("入院日期");
            if (CatalogueUtil.isEmpty(admisTime)) {
                status.set("0");
                return;
            }
            if (!CatalogueUtil.compareTime(
                    StringUtil.parseDateTime(admisTime),
                    StringUtil.parseDateTime(DateUtil.nowString()),
                    Long.valueOf(48 * 60))) {//如果入院未超过48小时，规则不判断
                status.set("0");
                return;
            }
            //开始时间(入院时间)
            Date beginDate = StringUtil.parseDateTime(admisTime);
            if (beginDate == null) {
                status.set("0");
                return;
            }
            /* 首次病程录如果是主治或者主任写的，也算主治查房 */
            FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
            if (firstCourseRecordDoc != null) {
                String doctorSign = firstCourseRecordDoc.getStructureMap().get("记录医生");
                String firstCourseProfessor = getFirstCourseProfessor(doctorSign);
                if (StringUtil.isNotBlank(firstCourseProfessor) && firstCourseProfessor.contains("主治")) {
                    String recordDateStr = firstCourseRecordDoc.getStructureMap().get("病历日期");
                    if (StringUtil.isNotBlank(recordDateStr)) {
                        if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(recordDateStr), 48 * 60L)) {
                            status.set("0");
                            return;
                        }
                    }
                }
            }
            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
            List<AttendingDoctorWardDoc> attendingDoctorWardDocs = threeLevelWardDoc.getAttendingDoctorWardDocs();
            if (attendingDoctorWardDocs.size() > 0) {
                AttendingDoctorWardDoc firstAttending = attendingDoctorWardDocs.get(0);
                String wardDateStr = firstAttending.getStructureMap().get("查房日期");
                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(wardDateStr), 48 * 60L)) {
                    status.set("0");
                    return;
                }
            } else if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), new Date(), 48 * 60L)) {
                status.set("0");//没有主治医师查房，若入院时间和系统当前时间对比，相差48小时则报错
                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];
//                                }
//                            }
//                        }
//                    }
//                }
//            }

//            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
//            for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
//                Map<String, String> structureMap = threeLevelWard.getStructureMap();
//                String wardDateStr = structureMap.get("查房日期");
//                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(wardDateStr), 48 * 60L)) {
//                    String makeTitle = structureMap.get("查房标题");
//                    String pathography = structureMap.get("病情记录");
//                    //判断标题
//                    visitingPhysicianHouse(operatorName, makeTitle);
//                    //判断病情记录
//                    visitingPhysicianHouse(operatorName, pathography);
//                }
//            }
        }
    }

//    /**
//     * 判断查房记录是否含有主治医师查房
//     *
//     * @param operatorName     主刀医师
//     * @param titlePathography 查房标题或病情记录
//     */
//    private void visitingPhysicianHouse(String operatorName, String titlePathography) {
//        if (StringUtil.isNotBlank(titlePathography)) {
//            if (titlePathography.contains("主治")) {
//                status.set("0");
//                return;
//            } else if (StringUtil.isNotBlank(operatorName) && (titlePathography.contains(operatorName) || titlePathography.contains("主刀"))) {
//                String operationProfessor = getFirstCourseProfessor(operatorName);
//                if (operationProfessor.contains("主治")) {
//                    status.set("0");
//                    return;
//                }
//            }
//        }
//    }
//
    private String getFirstCourseProfessor(String doctorSign) {
        String professor = "";
//        String doctorSign = firstCourseRecordDoc.getStructureMap().get("医生签名");
        if (StringUtil.isBlank(doctorSign)) {
            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(doctorSign);
            if (doctor != null) {
                professor = doctor.get("professor");
            }

        }
        return professor;
    }
}