package thyyxxk.webserver.service.reports;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.constants.Capacity;
import thyyxxk.webserver.constants.GetDateFormat;
import thyyxxk.webserver.dao.his.reports.QueryDrugsAndProjectsDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.entity.querydata.QueryDrugsAndProjects;
import thyyxxk.webserver.entity.reports.illegalchargesanalysis.IllegalChargeData;
import thyyxxk.webserver.entity.reports.illegalchargesanalysis.IllegalChargeTemplate;
import thyyxxk.webserver.utils.ResultVoUtil;
import thyyxxk.webserver.utils.StringUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 描述
 * </p>
 *
 * @author xc
 * @date 2021-04-16 16:02
 */
@Service
@Slf4j
public class QueryDrugsAndProjectsService {

    private final QueryDrugsAndProjectsDao dao;
    private final String TYPE_OF_MEDICINE = "K";

    @Autowired
    public QueryDrugsAndProjectsService(QueryDrugsAndProjectsDao dao) {
        this.dao = dao;
    }

    /**
     * 获取查询 收费项目页面下拉框的值
     *
     * @return 返回一个map集合
     */
    public ResultVo<Map<String, List<GetDropdownBox>>> getSelect() {
        Map<String, List<GetDropdownBox>> map = new HashMap<>(Capacity.TWO);
        map.put("ward", dao.getWard());
        map.put("classCode", dao.getChergeClass());
        return ResultVoUtil.success(map);
    }

    /**
     * 查询收费项目 根据条件动态查询 但是必须带时间
     *
     * @param param 查询条件 时间 收费编码 费用类型 科室
     */
    public ResultVo<List<QueryDrugsAndProjects>> queryProjects(QueryDrugsAndProjects param) {
        List<QueryDrugsAndProjects> list = new ArrayList<>();
        if (StringUtil.isBlank(param.getClassCode())) {
            list = dao.queryProjects(param);
            list.addAll(dao.inquireAboutMedicines(param));
        }
        if (TYPE_OF_MEDICINE.equals(param.getClassCode())) {
            list.addAll(dao.inquireAboutMedicines(param));
        }
        if (list.isEmpty()) {
            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
        }
        return ResultVoUtil.success(list);

    }

    /**
     * 查看项目 或者 药品详情
     *
     * @param param 查询数据条件
     * @return 返回分页 对象
     */
    public ResultVo<List<QueryDrugsAndProjects>> chaKanXiangQing(QueryDrugsAndProjects param) {
        log.info("查看项目或药品详情：{}", JSON.toJSONStringWithDateFormat(param, GetDateFormat.DATE_TIME));
        List<QueryDrugsAndProjects> xiangMuList = dao.chaXunXiangMuHuoYaoPinJuTiXinXi(param.getStartTime(), param.getEndTime(), param.getChargeCode(), param.getDept());

        // 获取患者 id 的 list
        List<String> patientList = new ArrayList<>();
        // 获取诊断的详细情况
        List<QueryDrugsAndProjects> zhenDuanList = new ArrayList<>();

        for (QueryDrugsAndProjects projects : xiangMuList) {
            // 移除重复的住院号或者门诊号
            if (!patientList.contains(projects.getPatient())) {
                patientList.add(projects.getPatient());
            }
        }
        // 判断 这个不能 大于 2100 不然会报错 分成 100 来查
        if (patientList.size() > 0) {
            List<List<String>> fenDuanChaXun = ListUtils.partition(patientList, 20);
            for (List<String> strings : fenDuanChaXun) {
                zhenDuanList.addAll(dao.queryZhenDuan(strings));
            }
        }
        // 把诊断做成 map 给到项目拼接
        Map<String, String> pjZhenDuanMap = new HashMap<>();
        for (QueryDrugsAndProjects zhenDuan : zhenDuanList) {
            // 主诊断
            String zhuZhenDuan = zhenDuan.getPatient() + "_" + zhenDuan.getTimes() + "_1";
            // 副诊断
            String fuZhenDuan = zhenDuan.getPatient() + "_" + zhenDuan.getTimes() + "_2";
            if (zhenDuan.getDisDiagNo() == 1) {
                pjZhenDuanMap.put(zhuZhenDuan, zhenDuan.getDisDiagComment());
            } else {
                // 每一个 诊断之间使用 ---- 隔开
                String pj = pjZhenDuanMap.get(fuZhenDuan);
                // 这个 单纯的拼接把前面的诊断使用 ---- 拼接 三元表达式
                pj = (null == pj) ? "" : pj + "----";
                // 下面这个 拼接 副诊断
                pjZhenDuanMap.put(fuZhenDuan, pj + zhenDuan.getDisDiagComment());
            }
        }
        // 把项目中的 诊断一个个 拼接起来
        for (QueryDrugsAndProjects xiangMu : xiangMuList) {
            String zhuZhenDuan = xiangMu.getPatient() + "_" + xiangMu.getTimes() + "_1";
            String fuZhenDuan = xiangMu.getPatient() + "_" + xiangMu.getTimes() + "_2";
            xiangMu.setMainDiagnosis(pjZhenDuanMap.get(zhuZhenDuan));
            xiangMu.setDisDiagComment(pjZhenDuanMap.get(fuZhenDuan));
        }
        return ResultVoUtil.success(xiangMuList);
    }

    /**
     * 查询药品
     *
     * @param param 查询条件 日期区间 是否为抗生素 药品大类 药品编码
     * @return 返回符合的数据
     */
    public ResultVo<List<QueryDrugsAndProjects>> queryDrugs(QueryDrugsAndProjects param) {
        List<QueryDrugsAndProjects> list = dao.queryDrugs(param);
        if (list.isEmpty()) {
            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
        }
        return ResultVoUtil.success(list);
    }

    /**
     * 在字典中查询 药品或者项目的 code 以及 name
     *
     * @param pyCode 拼音编码 或者 项目编码
     * @param flag   1：项目 2：药品
     * @return 返回list
     */
    public ResultVo<List<GetDropdownBox>> yaoPinHuoXiangMuCode(String pyCode, Integer flag) {
        if (flag == 1) {
            return ResultVoUtil.success(dao.chaXunXiangMuhuoYaoPinCode("zd_charge_item", StringUtil.isContainChinese(pyCode)));
        } else if (flag == 2) {
            return ResultVoUtil.success(dao.chaXunXiangMuhuoYaoPinCode("yp_zd_dict", StringUtil.isContainChinese(pyCode)));
        } else {
            return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER);
        }
    }

    /**
     * @param param 查询条件
     * @return 返回检验检查的数据
     */
    public ResultVo<List<IllegalChargeData>> chaXunJianYanJianCha(IllegalChargeTemplate param) {
        List<IllegalChargeData> list = dao.chaXunJianYanJianCha(param.getStart(), param.getEnd(), param.getMedtypes());
        if (list.isEmpty()) {
            return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
        }
        return ResultVoUtil.success(list);
    }
}
