package com.lantone.qc.trans.beilun;

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.pub.util.StringUtil;
import com.lantone.qc.trans.DocTrans;
import com.lantone.qc.trans.comsis.OrdinaryAssistant;
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.stream.Collectors;

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

    @Override
    protected InputInfo extract(QueryVo queryVo) {
        InputInfo inputInfo = new InputInfo();
        for (MedrecVo i : queryVo.getMedrec()) {
            if (i.getTitle() != null) {
                if (i.getTitle().equals("会诊")) {
                    BeiLunConsultationDocTrans consultationDocTrans = new BeiLunConsultationDocTrans();
                    inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
                }
                if (i.getTitle().equals("手术")) {
                    BeiLunOperationDocTrans operationDocTrans = new BeiLunOperationDocTrans();
                    inputInfo.setOperationDocs(operationDocTrans.extract(i));
                }
                if (i.getTitle().equals("转科")) {
                    BeiLunTransferRecordDocTrans transferRecordDocTrans = new BeiLunTransferRecordDocTrans();
                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
                }
                if (i.getTitle().equals("入院记录")) {
                    BeiLunBeHospitalizedDocTrans beHospitalizedDocTrans = new BeiLunBeHospitalizedDocTrans();
                    inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
                }
                if (i.getTitle().equals("输血/血制品病程记录")) {
                    BeiLunClinicalBloodDocTrans clinicalBloodDocTrans = new BeiLunClinicalBloodDocTrans();
                    inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
                }
                if (i.getTitle().equals("输血后效果评价")) {
                    BeiLunClinicBloodEffectDocTrans clinicBloodEffectDocTrans = new BeiLunClinicBloodEffectDocTrans();
                    inputInfo.setClinicBloodEffectDocs(clinicBloodEffectDocTrans.extract(i));
                }
                if (i.getTitle().equals("危急值记录")) {
                    BeiLunCrisisValueReportDocTrans crisisValueReportDocTrans = new BeiLunCrisisValueReportDocTrans();
                    inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
                }
                if (i.getTitle().equals("危急值")) {
                    BeiLunCrisisInfoDocTrans crisisInfoDocTrans = new BeiLunCrisisInfoDocTrans();
                    inputInfo.setCrisisInfoDocs(crisisInfoDocTrans.extract(i));
                }
                if (i.getTitle().equals("病危通知书")) {
                    BeiLunCriticallyIllNoticeDocTrans criticallyIllNoticeDocTrans = new BeiLunCriticallyIllNoticeDocTrans();
                    inputInfo.setCriticallyIllNoticeDocs(criticallyIllNoticeDocTrans.extract(i));
                }
                if (i.getTitle().equals("死亡病例讨论记录")) {
                    BeiLunDeathCaseDiscussDocTrans deathCaseDiscussDocTrans = new BeiLunDeathCaseDiscussDocTrans();
                    inputInfo.setDeathCaseDiscussDoc(deathCaseDiscussDocTrans.extract(i));
                }
                if (i.getTitle().equals("死亡记录")) {
                    BeiLunDeathRecordDocTrans deathRecordDocTrans = new BeiLunDeathRecordDocTrans();
                    inputInfo.setDeathRecordDoc(deathRecordDocTrans.extract(i));
                }
                if (i.getTitle().equals("疑难病例讨论记录")) {
                    BeiLunDifficultCaseDiscussDocTrans difficultCaseDiscussDocTrans = new BeiLunDifficultCaseDiscussDocTrans();
                    inputInfo.setDifficultCaseDiscussDocs(difficultCaseDiscussDocTrans.extract(i));
                }
                if (i.getTitle().equals("医嘱信息")) {
                    BeiLunDoctorAdviceDocTrans doctorAdviceDocTrans = new BeiLunDoctorAdviceDocTrans();
                    inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
                }
                if (i.getTitle().equals("值班交接制度")) {
                    BeiLunDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new BeiLunDutyShiftSystemDocTrans();
                    inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));
                }
                if (i.getTitle().equals("首次病程录")) {
                    BeiLunFirstCourseRecordDocTrans firstCourseRecordDocTrans = new BeiLunFirstCourseRecordDocTrans();
                    inputInfo.setFirstCourseRecordDoc(firstCourseRecordDocTrans.extract(i));
                }
                if (i.getTitle().equals("病案首页")) {
                    BeiLunFirstPageRecordDocTrans firstPageRecordDocTrans = new BeiLunFirstPageRecordDocTrans();
                    inputInfo.setFirstPageRecordDoc(firstPageRecordDocTrans.extract(i));
                }
                if (i.getTitle().equals("出院小结")) {
                    BeiLunLeaveHospitalDocTrans leaveHospitalDocTrans = new BeiLunLeaveHospitalDocTrans();
                    inputInfo.setLeaveHospitalDoc(leaveHospitalDocTrans.extract(i));
                }
                if (i.getTitle().equals("抢救记录")) {
                    BeiLunRescueDocTrans rescueDocTrans = new BeiLunRescueDocTrans();
                    inputInfo.setRescueDocs(rescueDocTrans.extract(i));
                }
                if (i.getTitle().equals("阶段小结")) {
                    BeiLunStagesSummaryDocTrans stagesSummaryDocTrans = new BeiLunStagesSummaryDocTrans();
                    inputInfo.setStagesSummaryDocs(stagesSummaryDocTrans.extract(i));
                }
                if (i.getTitle().equals("查房记录")) {
                    BeiLunThreeLevelWardDocTrans threeLevelWardDocTrans = new BeiLunThreeLevelWardDocTrans();
                    threeLevelWardDocTrans.setOperationDocs(inputInfo.getOperationDocs());
                    inputInfo.setThreeLevelWardDocs(threeLevelWardDocTrans.extract(i));
                }
                if (i.getTitle().equals("住院病历信息")) {
                    BeiLunMedicalRecordInfoDocTrans medicalRecordInfoDocTrans = new BeiLunMedicalRecordInfoDocTrans();
                    inputInfo.setMedicalRecordInfoDoc(medicalRecordInfoDocTrans.extract(i));
                }
                if (i.getTitle().equals("化验")) {
                    BeiLunLisDocTrans lisDocTrans = new BeiLunLisDocTrans();
                    inputInfo.setLisDocs(lisDocTrans.extract(i));
                }
                if (i.getTitle().equals("辅检")) {
                    BeiLunPacsDocTrans pacsDocTrans = new BeiLunPacsDocTrans();
                    inputInfo.setPacsDocs(pacsDocTrans.extract(i));
                }
                if (i.getTitle().equals("门诊")) {
                    BeiLunOutDepDocTrans outDepDocTrans = new BeiLunOutDepDocTrans();
                    inputInfo.setBeHospitalizedDoc(outDepDocTrans.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.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 -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).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.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.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.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())
                    .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())
                    .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())
                    .collect(Collectors.toList());
            if (ListUtil.isNotEmpty(pdPageDataList)) {
                inputInfo.getPageData().put("术前讨论、术前小结", pdPageDataList);
            }
        }
        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())
                );
            }
        }
    }
}