package com.lantone.qc.trans.taizhou;

import com.google.common.collect.Lists;
import com.lantone.qc.pub.model.InputInfo;
import com.lantone.qc.pub.model.vo.MedrecVo;
import com.lantone.qc.pub.model.vo.QueryVo;
import com.lantone.qc.pub.util.ListUtil;
import com.lantone.qc.trans.DocTrans;
import com.lantone.qc.trans.comsis.OrdinaryAssistant;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @ClassName : TaiZhouDocTrans
 * @Description :
 * @Author : 楼辉荣
 * @Date: 2020-03-03 19:47
 */
public class TaizhouDocTrans extends DocTrans {

    @Override
    protected InputInfo extract(QueryVo queryVo) {
        InputInfo inputInfo = new InputInfo();
        for (MedrecVo i : queryVo.getMedrec()) {
            switch (i.getTitle()) {
                case "会诊":
                    TaiZhouConsultationDocTrans consultationDocTrans = new TaiZhouConsultationDocTrans();
                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
                    break;
                case "手术":
                    TaiZhouOperationDocTrans operationDocTrans = new TaiZhouOperationDocTrans();
                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
                    break;
                case "转科":
                    TaiZhouTransferRecordDocTrans transferRecordDocTrans = new TaiZhouTransferRecordDocTrans();
                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
                    break;
                case "入院记录":
                    TaiZhouBeHospitalizedDocTrans beHospitalizedDocTrans = new TaiZhouBeHospitalizedDocTrans();
                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
                    break;
                case "输血/血制品病程记录":
                    TaiZhouClinicalBloodDocTrans clinicalBloodDocTrans = new TaiZhouClinicalBloodDocTrans();
                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
                    break;
                case "危急值记录":
                    TaiZhouCrisisValueReportDocTrans crisisValueReportDocTrans = new TaiZhouCrisisValueReportDocTrans();
                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
                    break;
                case "病危通知书":
                    TaiZhouCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new TaiZhouCriticallyIllNoticeDocTrans();
                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
                    break;
                case "死亡病例讨论记录":
                    TaiZhouDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new TaiZhouDeathCaseDiscussDocTrans();
                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
                    break;
                case "死亡记录":
                    TaiZhouDeathRecordDocTrans deathRecordDocTrans = new TaiZhouDeathRecordDocTrans();
                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
                    break;
                case "疑难病例讨论记录":
                    TaiZhouDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new TaiZhouDifficultCaseDiscussDocTrans();
                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
                    break;
                case "医嘱信息":
                    TaiZhouDoctorAdviceDocTrans doctorAdviceDocTrans = new TaiZhouDoctorAdviceDocTrans();
                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
                    break;
                case "值班交接制度":
                    TaiZhouDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new TaiZhouDutyShiftSystemDocTrans();
                    /*inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));*/
                    break;
                case "首次病程录":
                    TaiZhouFirstCourseRecordDocTrans firstCourseRecordDocTrans = new TaiZhouFirstCourseRecordDocTrans();
                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
                    break;
                case "病案首页":
                    TaiZhouFirstPageRecordDocTrans firstPageRecordDocTrans = new TaiZhouFirstPageRecordDocTrans();
                    if (inputInfo.getFirstPageRecordDoc() == null) {
                        inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
                    }
                    break;
                case "出院小结":
                    TaiZhouLeaveHospitalDocTrans leaveHospitalDocTrans = new TaiZhouLeaveHospitalDocTrans();
                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
                    break;
                case "分级护理制度":
                    TaiZhouNursingSystemDocTrans nursingSystemDocTrans = new TaiZhouNursingSystemDocTrans();
                    /*inputInfo.setNursingSystemDoc(nursingSystemDocTrans.extract(i));*/
                    break;
                case "抢救记录":
                    TaiZhouRescueDocTrans rescueDocTrans = new TaiZhouRescueDocTrans();
                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
                    break;
                case "病重通知书":
                    TaiZhouSeriouslyIllNoticeDocTrans seriouslyIllNoticeDocTrans = new TaiZhouSeriouslyIllNoticeDocTrans();
                    inputInfo.setSeriouslyIllNoticeDocs(seriouslyIllNoticeDocTrans.extract(i));
                    break;
                case "阶段小结":
                    TaiZhouStagesSummaryDocTrans stagesSummaryDocTrans = new TaiZhouStagesSummaryDocTrans();
                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
                    break;
                case "查房记录":
                    TaiZhouThreeLevelWardDocTrans threeLevelWardDocTrans = new TaiZhouThreeLevelWardDocTrans();
                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
                    break;
                case "输血后效果评价":
                    TaiZhouClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new TaiZhouClinicBloodEffectDocTrans();
                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
                    break;
                case "病理检验送检单":
                    TaiZhouPathologyShipDocTrans pathologyShipDocTrans = new TaiZhouPathologyShipDocTrans();
                    inputInfo.setPathologyShipDocs(pathologyShipDocTrans.extract(i));
                    break;
                case "知情同意书":
                    TaizhouInformedConsentDocTrans taizhouInformedConsentDocTrans = new TaizhouInformedConsentDocTrans();
                    inputInfo.setInformedConsentDoc(taizhouInformedConsentDocTrans.extract(i));
                    break;
                case "谈话告知书":
                    TaizhouNoticeOfConversationDocTrans taizhouNoticeOfConversationDocTrans = new TaizhouNoticeOfConversationDocTrans();
                    inputInfo.setNoticeOfConversationDoc(taizhouNoticeOfConversationDocTrans.extract(i));
                    break;
                case "住院病历信息":
                    TaiZhouMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new TaiZhouMedicalRecordInfoDocTrans();
                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
                default:
                    break;
            }
        }
        pageDataHandle(inputInfo);
        return inputInfo;
    }

    private void pageDataHandle(InputInfo inputInfo) {
        if (inputInfo.getBeHospitalizedDoc() != null) {
            inputInfo.getPageData().put("入院记录", Lists.newArrayList(inputInfo.getBeHospitalizedDoc().getPageData()));
        }
        if (inputInfo.getDeathCaseDiscussDoc() != null) {
            inputInfo.getPageData().put("死亡病例讨论记录", Lists.newArrayList(inputInfo.getDeathCaseDiscussDoc().getPageData()));
        }
        if (inputInfo.getDeathRecordDoc() != null) {
            inputInfo.getPageData().put("死亡记录", Lists.newArrayList(inputInfo.getDeathRecordDoc().getPageData()));
        }
        if (inputInfo.getFirstCourseRecordDoc() != null) {
            inputInfo.getPageData().put("首次病程录", Lists.newArrayList(inputInfo.getFirstCourseRecordDoc().getPageData()));
        }
        if (inputInfo.getDeathRecordDoc() == null && inputInfo.getLeaveHospitalDoc() != null) {
            inputInfo.getPageData().put("出院小结", Lists.newArrayList(inputInfo.getLeaveHospitalDoc().getPageData()));
        }
        //        if (inputInfo.getNursingSystemDoc() != null) {
        //            inputInfo.getPageData().put("分级护理制度", Lists.newArrayList(inputInfo.getNursingSystemDoc().getPageData()));
        //        }
        if (inputInfo.getFirstPageRecordDoc() != null) {
            inputInfo.getPageData().put("病案首页", Lists.newArrayList(inputInfo.getFirstPageRecordDoc().getPageData()));
        }

        if (ListUtil.isNotEmpty(inputInfo.getClinicalBloodDocs())) {
            inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
            inputInfo.getPageData().put("输血后效果评价", inputInfo.getClinicBloodEffectDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
            inputInfo.getPageData().put(
                    "危急值记录",
                    inputInfo.getCrisisValueReportDocs()
                            .stream()
                            .map(i -> i.getPageData())
                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "病历日期", "yyyy-MM-dd HH:mm"))
                            .collect(Collectors.toList())
            );
        }
        if (ListUtil.isNotEmpty(inputInfo.getCriticallyIllNoticeDocs())) {
            inputInfo.getPageData().put("病危通知书", inputInfo.getCriticallyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getDifficultCaseDiscussDocs())) {
            inputInfo.getPageData().put("疑难病例讨论记录", inputInfo.getDifficultCaseDiscussDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        //        if (ListUtil.isNotEmpty(inputInfo.getDoctorAdviceDocs())) {
        //            inputInfo.getPageData().put("医嘱信息", inputInfo.getDoctorAdviceDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        //        }
        //        if (ListUtil.isNotEmpty(inputInfo.getDutyShiftSystemDocs())) {
        //            inputInfo.getPageData().put("值班交接制度", inputInfo.getDutyShiftSystemDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        //        }
        if (ListUtil.isNotEmpty(inputInfo.getRescueDocs())) {
            inputInfo.getPageData().put(
                    "抢救记录",
                    inputInfo.getRescueDocs()
                            .stream()
                            .map(i -> i.getPageData())
                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "事件日期", "yyyy/MM/dd HH:mm"))
                            .collect(Collectors.toList())
            );
        }
        //        if (ListUtil.isNotEmpty(inputInfo.getSeriouslyIllNoticeDocs())) {
        //            inputInfo.getPageData().put("病重通知书", inputInfo.getSeriouslyIllNoticeDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        //        }
        if (ListUtil.isNotEmpty(inputInfo.getStagesSummaryDocs())) {
            inputInfo.getPageData().put("阶段小结", inputInfo.getStagesSummaryDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getThreeLevelWardDocs())) {
            List<Map<String, Object>> pageDatas = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList());
            inputInfo.getPageData().put("查房记录", pageDatas);
        }
        if (ListUtil.isNotEmpty(inputInfo.getPathologyShipDocs())) {
            inputInfo.getPageData().put("病理检验送检单", inputInfo.getPathologyShipDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }

        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
            List<Map<String, Object>> crePageDataList = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy/MM/dd HH:mm"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(crePageDataList)) {
                inputInfo.getPageData().put("会诊记录", crePageDataList);
            }

            List<Map<String, Object>> caPageDataList = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "申请日期", "yyyy/MM/dd HH:mm"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(caPageDataList)) {
                inputInfo.getPageData().put("会诊申请单", caPageDataList);
            }

            List<Map<String, Object>> crsPageDataList = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
                    .sorted((map1, map2) -> -OrdinaryAssistant.pageDataTimeSort(map1, map2, "申请日期", "yyyy/MM/dd HH:mm"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(crsPageDataList)) {
                inputInfo.getPageData().put("会诊结果单", crsPageDataList);
            }
        }
        if (ListUtil.isNotEmpty(inputInfo.getOperationDocs())) {
            List<Map<String, Object>> odPageDataList = inputInfo.getOperationDocs()
                    .stream()
                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationDiscussionDoc() != null)
                    .map(operationDoc -> operationDoc.getOperationDiscussionDoc().getPageData())
                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "手术日期", "yyyy/MM/dd"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(odPageDataList)) {
                inputInfo.getPageData().put("术后首次病程及谈话记录", odPageDataList);
            }

            List<Map<String, Object>> orPageDataList = inputInfo.getOperationDocs()
                    .stream()
                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationRecordDoc() != null)
                    .map(operationDoc -> operationDoc.getOperationRecordDoc().getPageData())
                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "开始时间", "yyyy/MM/dd HH:mm"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(orPageDataList)) {
                inputInfo.getPageData().put("手术记录", orPageDataList);
            }

            List<Map<String, Object>> pdPageDataList = inputInfo.getOperationDocs()
                    .stream()
                    .filter(operationDoc -> operationDoc != null && operationDoc.getPreoperativeDiscussionDoc() != null)
                    .map(operationDoc -> operationDoc.getPreoperativeDiscussionDoc().getPageData())
                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "讨论时间", "yyyy年MM月dd日 HH时mm分"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(pdPageDataList)) {
                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
            }

            /*List<Map<String, Object>> oicPageDataList = inputInfo.getOperationDocs()
                    .stream()
                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationInformedConsentDoc() != null)
                    .map(operationDoc -> operationDoc.getOperationInformedConsentDoc().getPageData())
                    .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "谈话日期", "yyyy/MM/dd HH:mm"))
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(oicPageDataList)) {
                inputInfo.getPageData().put("手术知情同意书", oicPageDataList);
            }*/

            List<Map<String, Object>> oscPageDataList = inputInfo.getOperationDocs()
                    .stream()
                    .filter(operationDoc -> operationDoc != null && operationDoc.getOperationSafetyChecklistDoc() != null)
                    .map(operationDoc -> operationDoc.getOperationSafetyChecklistDoc().getPageData())
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(oscPageDataList)) {
                inputInfo.getPageData().put("手术安全核查表", oscPageDataList);
            }
        }
        if (inputInfo.getTransferRecordDocs() != null) {
            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferIntoDocs())) {
                inputInfo.getPageData().put(
                        "转入记录",
                        inputInfo.getTransferRecordDocs().getTransferIntoDocs()
                                .stream()
                                .filter(i -> i != null)
                                .map(i -> i.getPageData())
                                .collect(Collectors.toList())
                );
            }
            if (ListUtil.isNotEmpty(inputInfo.getTransferRecordDocs().getTransferOutDocs())) {
                inputInfo.getPageData().put(
                        "转出记录",
                        inputInfo.getTransferRecordDocs().getTransferOutDocs()
                                .stream()
                                .filter(i -> i != null)
                                .map(i -> i.getPageData())
                                .collect(Collectors.toList())
                );
            }
        }
    }

}