package com.lantone.qc.trans.changx;

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 : ChangxDocTrans
 * @Description :
 * @Author : 楼辉荣
 * @Date: 2020-03-03 19:47
 */
public class ChangxDocTrans extends DocTrans {

    @Override
    protected InputInfo extract(QueryVo queryVo) {
        InputInfo inputInfo = new InputInfo();
        for (MedrecVo i : queryVo.getMedrec()) {
            if (i.getTitle().equals("会诊")) {
                ChangxConsultationDocTrans consultationDocTrans = new ChangxConsultationDocTrans();
                inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
            }
            if (i.getTitle().equals("手术")) {
                ChangxOperationDocTrans operationDocTrans = new ChangxOperationDocTrans();
                inputInfo.setOperationDocs(operationDocTrans.extract(i));
            }
            if (i.getTitle().equals("转科")) {
                ChangxTransferRecordDocTrans transferRecordDocTrans = new ChangxTransferRecordDocTrans();
                inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
            }
            if (i.getTitle().equals("入院记录")) {
                ChangxBeHospitalizedDocTrans beHospitalizedDocTrans = new ChangxBeHospitalizedDocTrans();
                inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
            }
            if (i.getTitle().equals("输血/血制品病程记录")) {
                ChangxClinicalBloodDocTrans clinicalBloodDocTrans = new ChangxClinicalBloodDocTrans();
                inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
            }
            if (i.getTitle().equals("输血后效果评价")) {
                ChangxClinicBloodEffectDocTrans changxClinicBloodEffectDocTrans = new ChangxClinicBloodEffectDocTrans();
                inputInfo.setClinicBloodEffectDocs(changxClinicBloodEffectDocTrans.extract(i));
            }
            if (i.getTitle().equals("危急值记录")) {
                ChangxCrisisValueReportDocTrans crisisValueReportDocTrans = new ChangxCrisisValueReportDocTrans();
                inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
            }
            if (i.getTitle().equals("危急值")) {
                ChangxCrisisInfoDocTrans changxCrisisInfoDocTrans = new ChangxCrisisInfoDocTrans();
                inputInfo.setCrisisInfoDocs(changxCrisisInfoDocTrans.extract(i));
            }
            if (i.getTitle().equals("病危通知书")) {
                ChangxCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new ChangxCriticallyIllNoticeDocTrans();
                inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
            }
            if (i.getTitle().equals("死亡病例讨论记录")) {
                ChangxDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new ChangxDeathCaseDiscussDocTrans();
                inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
            }
            if (i.getTitle().equals("死亡记录")) {
                ChangxDeathRecordDocTrans deathRecordDocTrans = new ChangxDeathRecordDocTrans();
                inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
            }
            if (i.getTitle().equals("疑难病例讨论记录")) {
                ChangxDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new ChangxDifficultCaseDiscussDocTrans();
                inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
            }
            if (i.getTitle().equals("医嘱信息")) {
                ChangxDoctorAdviceDocTrans doctorAdviceDocTrans = new ChangxDoctorAdviceDocTrans();
                inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
            }
            if (i.getTitle().equals("手术麻醉信息")) {
                ChangxAnesthesiaRelatedDocTrans changxAnesthesiaRelatedDocTrans = new ChangxAnesthesiaRelatedDocTrans();
                inputInfo.setAnesthesiaRelatedDocs(changxAnesthesiaRelatedDocTrans.extract(i));
            }
            //            if (i.getTitle().equals("值班交接制度")) {
            //                ChangxDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new ChangxDutyShiftSystemDocTrans();
            //                inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
            //            }
            if (i.getTitle().equals("首次病程录")) {
                ChangxFirstCourseRecordDocTrans firstCourseRecordDocTrans = new ChangxFirstCourseRecordDocTrans();
                inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
            }
            if (i.getTitle().equals("病案首页")) {
                ChangxFirstPageRecordDocTrans firstPageRecordDocTrans = new ChangxFirstPageRecordDocTrans();
                inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
            }
            if (i.getTitle().equals("出院小结")) {
                ChangxLeaveHospitalDocTrans leaveHospitalDocTrans = new ChangxLeaveHospitalDocTrans();
                inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
            }
            //            if (i.getTitle().equals("分级护理制度")) {
            //                ChangxNursingSystemDocTrans nursingSystemDocTrans = new ChangxNursingSystemDocTrans();
            //                inputInfo.setNursingSystemDoc(nursingSystemDocTrans.extract(i));
            //            }
            if (i.getTitle().equals("抢救记录")) {
                ChangxRescueDocTrans rescueDocTrans = new ChangxRescueDocTrans();
                inputInfo.setRescueDocs(rescueDocTrans.extract(i));
            }
            //            if (i.getTitle().equals("病重通知书")) {
            //                ChangxSeriouslyIllNoticeDocTrans seriouslyIllNoticeDocTrans = new ChangxSeriouslyIllNoticeDocTrans();
            //                inputInfo.setSeriouslyIllNoticeDocs(seriouslyIllNoticeDocTrans.extract(i));
            //            }
            if (i.getTitle().equals("阶段小结")) {
                ChangxStagesSummaryDocTrans stagesSummaryDocTrans = new ChangxStagesSummaryDocTrans();
                inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
            }
            if (i.getTitle().equals("查房记录")) {
                ChangxThreeLevelWardDocTrans threeLevelWardDocTrans = new ChangxThreeLevelWardDocTrans();
                threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
                inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
            }
            if (i.getTitle().equals("病理检验送检单")) {
                ChangxPathologyShipDocTrans pathologyShipDocTrans = new ChangxPathologyShipDocTrans();
                inputInfo.setPathologyShipDocs(pathologyShipDocTrans.extract(i));
            }
            //            if (i.getTitle().equals("知情同意书")) {
            //                ChangxInformedConsentDocTrans informedConsentDocTrans = new ChangxInformedConsentDocTrans();
            //                inputInfo.setInformedConsentDoc(informedConsentDocTrans.extract(i));
            //            }
            //            if (i.getTitle().equals("谈话告知书")) {
            //                ChangxNoticeOfConversationDocTrans noticeOfConversationDocTrans = new ChangxNoticeOfConversationDocTrans();
            //                inputInfo.setNoticeOfConversationDoc(noticeOfConversationDocTrans.extract(i));
            //            }
            if (i.getTitle().equals("日常病程录")) {
                ChangxDailyCourseRecordDocTrans dailyCourseRecordDocTrans = new ChangxDailyCourseRecordDocTrans();
                inputInfo.setDailyCourseRecordDocs(dailyCourseRecordDocTrans.extract(i));
            }
            if (i.getTitle().equals("住院病历信息")) {
                ChangxMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new ChangxMedicalRecordInfoDocTrans();
                inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
            }
        }
        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.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()));
            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> i.getText().indexOf("输白蛋白") == -1).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
            inputInfo.getPageData().put(
                    "输血后效果评价",
                    inputInfo.getClinicBloodEffectDocs()
                            .stream()
                            .map(i -> i.getPageData())
                            .sorted((map1, map2) -> OrdinaryAssistant.pageDataTimeSort(map1, map2, "记录时间", "yyyy-MM-dd HH:mm"))
                            .collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getCrisisValueReportDocs())) {
            inputInfo.getPageData().put("危急值记录", inputInfo.getCrisisValueReportDocs().stream().map(i -> i.getPageData()).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()).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())) {
            inputInfo.getPageData().put("查房记录", inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getPathologyShipDocs())) {
            inputInfo.getPageData().put("病理检验送检单", inputInfo.getPathologyShipDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }
        if (ListUtil.isNotEmpty(inputInfo.getDailyCourseRecordDocs())) {
            inputInfo.getPageData().put("日常病程录", inputInfo.getDailyCourseRecordDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
        }

        if (ListUtil.isNotEmpty(inputInfo.getConsultationDocs())) {
            List<Map<String, Object>> crPd = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationRecordDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationRecordDoc().getPageData())
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(crPd)) {
                inputInfo.getPageData().put("会诊记录", crPd);
            }

            List<Map<String, Object>> caPd = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationApplicationDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationApplicationDoc().getPageData())
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(caPd)) {
                inputInfo.getPageData().put("会诊申请单", caPd);
            }

            List<Map<String, Object>> ctPd = inputInfo.getConsultationDocs()
                    .stream()
                    .filter(consultationDoc -> consultationDoc != null && consultationDoc.getConsultationResultsDoc() != null)
                    .map(consultationDoc -> consultationDoc.getConsultationResultsDoc().getPageData())
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(ctPd)) {
                inputInfo.getPageData().put("会诊结果单", ctPd);
            }
        }
        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) -> 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) -> 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) -> 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) -> 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())
                );
            }
        }
    }

}