package com.lantone.qc.kernel.catalogue.operationdiscussion;

import com.lantone.qc.kernel.catalogue.QCCatalogue;
import com.lantone.qc.pub.model.InputInfo;
import com.lantone.qc.pub.model.OutputInfo;
import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
import com.lantone.qc.pub.model.doc.operation.OperationDoc;
import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
import com.lantone.qc.pub.util.DateUtil;
import com.lantone.qc.pub.util.ListUtil;
import com.lantone.qc.pub.util.StringUtil;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author wangfeng
 * @Description: 术后没有连续记录3天
 * @date 2020-07-01 10:31
 */
@Component
public class OPE0587 extends QCCatalogue {
    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
        status.set("0");
        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
        List<ThreeLevelWardDoc> threeLevelWardDocs1 = inputInfo.getThreeLevelWardDocs();
        if (ListUtil.isEmpty(threeLevelWardDocs1)) {
            return;
        }
        List<ThreeLevelWardDoc> threeLevelWardDocs = threeLevelWardDocs1.get(0).getAllDoctorWradDocs();
        if (ListUtil.isEmpty(operationDocs) || ListUtil.isEmpty(threeLevelWardDocs)) {
            return;
        }
        if (inputInfo.getMedicalRecordInfoDoc() == null || inputInfo.getMedicalRecordInfoDoc().getStructureMap().size() == 0) {
            return;
        }
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        //取出所有查房时间
        List<String> roundsDate = new ArrayList<>();
        for (ThreeLevelWardDoc t : threeLevelWardDocs) {
            Date threeLevelDate = StringUtil.parseDateTime(t.getStructureMap().get("查房日期"));
            roundsDate.add(formatter.format(threeLevelDate));
        }

        //取出出院时间,先从病案首页取，若没有，再去出院小结取
        String leaveHospitalDate = null;
        if (inputInfo.getFirstPageRecordDoc() != null) {
            Map<String, String> structureMaps = inputInfo.getFirstPageRecordDoc().getStructureMap();
            leaveHospitalDate = structureMaps.get("出院时间");
        }
        if (leaveHospitalDate == null && inputInfo.getLeaveHospitalDoc() != null) {
            leaveHospitalDate = inputInfo.getLeaveHospitalDoc().getStructureMap().get("出院时间");
        }
        //没有出院时间， 直接退出
        if (StringUtil.isBlank(leaveHospitalDate)) {
            return;
        }
        Date leaveDate = StringUtil.parseDateTime(leaveHospitalDate);
        if (leaveDate == null) {
            return;
        }

        //取出病程信息里的手术信息的所有 手术日期
        List<String> operDateList = new ArrayList<>();
        for (OperationDoc opera : operationDocs) {
            OperationRecordDoc operationRecordDoc = opera.getOperationRecordDoc();
            if (operationRecordDoc != null) {
                String operDate = operationRecordDoc.getStructureMap().get("手术日期") == null ? null : operationRecordDoc.getStructureMap().get("手术日期");
                if (StringUtil.isNotBlank(operDate)) {
                    operDateList.add(operDate);
                }

            }
        }
        if (operDateList.size() > 0) {
            for (String operDates : operDateList) {
                Date oper = StringUtil.parseDateTime(operDates);
                //手术时间 减去 出院时间
                long day = (leaveDate.getTime() - oper.getTime()) / (24 * 60 * 60 * 1000);
                //时间大于三天才能判断有没有连续三天查房
                if (day > 3) {
                    List<String> operDatesNew = new ArrayList<>();
                    //用手术时间加三天
                    for (int i = 1; i < 4; i++) {
                        Date firstTimeOfDay = DateUtil.getFirstTimeOfDay(DateUtil.addDay(oper, i));
                        operDatesNew.add(formatter.format(firstTimeOfDay));
                    }
                    if (roundsDate.size() > 2) {//查房日期取出没有3天时间， 直接报错
                        //去重
                        List<String> listTemp = new ArrayList<String>();
                        for (int i = 0; i < roundsDate.size(); i++) {
                            if (!listTemp.contains(roundsDate.get(i))) {
                                listTemp.add(roundsDate.get(i));
                            }
                        }
                        int i = 0;
                        //循环两个时间List,
                        for (String str : operDatesNew) {
                            for (String s : listTemp) {
                                if (str.equals(s)) {
                                    i++;
                                }
                            }
                        }
                        if (i < 3) {
                            status.set("-1");
                        }
                    } else {
                        status.set("-1");
                        return;
                    }
                }
            }
        }
    }
}
