package thyyxxk.webserver.service.casefrontsheet;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.dao.his.casefrontsheet.HuiZhenShenQingDao;
import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.casefrontsheet.YshHzRecord;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.entity.login.UserInfo;
import thyyxxk.webserver.service.PublicServer;
import thyyxxk.webserver.utils.ListUtil;
import thyyxxk.webserver.utils.ResultVoUtil;
import thyyxxk.webserver.utils.StringUtil;
import thyyxxk.webserver.utils.TokenUtil;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 描述： 会诊申请
 * </p>
 *
 * @author xc
 * @date 2021-05-07 11:01
 */
@Service
@Slf4j
public class HuiZhenShenQingService {
    private final HuiZhenShenQingDao dao;
    private final PublicServer publicServer;
    private final YiZhuLuRuDao yiZhuLuRuDao;

    public HuiZhenShenQingService(HuiZhenShenQingDao dao, PublicServer publicServer, YiZhuLuRuDao yiZhuLuRuDao) {
        this.dao = dao;
        this.publicServer = publicServer;
        this.yiZhuLuRuDao = yiZhuLuRuDao;
    }

    /**
     * @return 返回会诊级别
     */
    public ResultVo<List<GetDropdownBox>> huiZhenLeiBie() {
        return ResultVoUtil.success(dao.getYshZdHzLevel());
    }

    /**
     * 远程搜索科室
     *
     * @param code 模糊查询
     * @return 返回科室
     */
    public ResultVo<List<GetDropdownBox>> queryDept(String code) {
        return ResultVoUtil.success(dao.getZdUnitCode(StringUtil.isContainChinese(code)));
    }

    /**
     * 会诊申请
     *
     * @param param 申请需要插入的数据
     * @return 返回状态
     */
    public ResultVo<String> submitHuiZhenShenQing(YshHzRecord param) {
        log.info("会诊申请====>申请人：{}，数据：{}", TokenUtil.getTokenUserId(), JSON.toJSONString(param));
        publicServer.huanZheJieSuan(param.getInpatientNo(), param.getAdmissTimes());
        //下面是给申请次数 加一
        param.setReqTimes(dao.getMaxReqTimes(param.getInpatientNo(), param.getAdmissTimes()) + 1);
        param.setInputDate(new Date());
        param.setActOrderNo(BigDecimal.valueOf(publicServer.getActOrderNo()));
        param.setInputId(TokenUtil.getTokenUserId());
        param.setReqDate(param.getInputDate());
        param.setOrderCode(getOrderCode("00" + param.getHzType()));
        param.setOrderName(String.format("请%s进行院内会诊", param.getReqDeptName()));
        //插入会诊申请
        dao.chaRuHuiZhenShenQing(param);
        //申请成功了就还需要插入一条医嘱
        dao.chaRuYiZhu(param);
        log.info("插入数据：{}", JSON.toJSONString(param));
        List<String> content = new ArrayList<>();
        content.add(String.format("会诊名：【%s】<br>" +
                "会诊级别：【%s】", param.getOrderName(), param.getHzTypeName()));
        publicServer.faSongXiaoXi(yiZhuLuRuDao.huoQuHuanZheXinXi(param.getInpatientNo(), param.getAdmissTimes()), content, "新增会诊申请", TokenUtil.getTokenUserId());
        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "会诊申请成功，正在通知会诊医生。 <p>（〜^㉨^)〜</p>");
    }


    /**
     * 查询会诊的信息
     *
     * @param inpatientNo 住院号
     * @param admissTimes 住院次数
     * @return 返回
     */
    public ResultVo<List<YshHzRecord>> chaKanHuiZhenShenQing(String inpatientNo, int admissTimes) {
        return ResultVoUtil.success(dao.chaKanHuiZhenShenQing(inpatientNo, admissTimes, null));
    }

    /**
     * 删除会诊申请 要同时删除 会诊申请 和 一条医嘱
     *
     * @param inpatientNo 住院号
     * @param admissTimes 住院次数
     * @param actOrderNo  医嘱号
     * @param reqTimes    申请次数
     * @return 返回
     */
    public ResultVo<Boolean> shanChuHuiZhenShenQing(String inpatientNo, int admissTimes, BigDecimal actOrderNo, int reqTimes) {
        List<YshHzRecord> huiZhenXinXi = dao.chaKanHuiZhenShenQing(inpatientNo, admissTimes, actOrderNo);
        if (ListUtil.isBlank(huiZhenXinXi)) {
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没shou有查询到对应信息可能已经被删除了。");
        }
        if (StringUtil.notBlank(huiZhenXinXi.get(0).getStatusFlag()) && huiZhenXinXi.get(0).getStatusFlag().trim().equals("2")) {
            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该会诊已经完成了无法删除。");
        }
        //会诊申请是根据 住院号，住院次数，申请次数 来获取到 一条
        dao.shanChuShenQing(inpatientNo, admissTimes, reqTimes);
        //医嘱 只要根据医嘱号来删除
        dao.shanChuYiZhu(actOrderNo);
        log.info("删除会诊申请==》操作人：{}，数据：{}", TokenUtil.getTokenUserId(), JSON.toJSONString(huiZhenXinXi.get(0)));
        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "删除成功");
    }

    /**
     * 查询会诊的医生
     *
     * @param deptCode 科室的code
     * @param hzType   会诊的级别
     * @return 返回 医生的code 和 name
     */
    public ResultVo<List<GetDropdownBox>> huiZhenYiSheng(String deptCode, String hzType) {
        return ResultVoUtil.success(dao.huiZhenYiSheng(deptCode, "00" + hzType));
    }

    /**
     * 获取会诊医生的信息
     *
     * @param searchCondition 查询条件 医生姓名 拼音 五笔
     * @return
     */
    public ResultVo<List<UserInfo>> getConsultingDoctorInfo(String searchCondition) {
        return ResultVoUtil.success(dao.getConsultingDoctorInfo(StringUtil.isContainChinese(searchCondition)));
    }

    /**
     * 获取患者的主诊断
     *
     * @param patNo 住院号
     * @param times 住院次数
     * @param flag  1-本院诊断 2-医保诊断
     * @return 对应数据
     */
    public ResultVo<List<GetDropdownBox>> huoQuHuanZheZhuYaoZhenDuan(String patNo, Integer times, Integer flag) {
        return ResultVoUtil.success(dao.huoQuHuanZheZhuYaoZhenDuan(patNo, times, flag == 1 ? "ba_first_page1" : "zy_dis_diag_yb"));
    }


    /**
     * 用来获取 order_code 这个是写死的
     *
     * @param hzType 会诊的级别
     * @return 返回 order_code
     */
    public String getOrderCode(String hzType) {
        switch (hzType) {
            case "001":
                return "01425";
            case "002":
                return "01426";
            case "003":
                return "01427";
            default:
                return "500";
        }
    }
}
