package cn.hnthyy.thmz.service.impl.his.zd;

import cn.hnthyy.thmz.entity.MzException;
import cn.hnthyy.thmz.entity.his.zd.ZdMzClass;
import cn.hnthyy.thmz.entity.his.zd.ZdUnitCode;
import cn.hnthyy.thmz.enums.ClassCodeEnum;
import cn.hnthyy.thmz.enums.YesNoEnum;
import cn.hnthyy.thmz.mapper.his.zd.ZdMzClassMapper;
import cn.hnthyy.thmz.mapper.his.zd.ZdUnitCodeMapper;
import cn.hnthyy.thmz.pageDto.ZdUnitCodePageDto;
import cn.hnthyy.thmz.service.his.zd.ZdUnitCodeService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

@Service
public class ZdUnitCodeServiceImpl implements ZdUnitCodeService {
    @SuppressWarnings("all")
    @Autowired
    private ZdUnitCodeMapper zdUnitCodeMapper;
    @SuppressWarnings("all")
    @Autowired
    private ZdMzClassMapper zdMzClassMapper;
    //部门缓存数据集
    private Map<String, ZdUnitCode> map = new HashMap<>();

    @Override
    public List<ZdUnitCode> queryZdUnitCodeWithPage(ZdUnitCodePageDto zdUnitCodePageDto) {
        if(StringUtils.isBlank(zdUnitCodePageDto.getOrderByCase())){
            zdUnitCodePageDto.setOrderByCase("code");
        }
        List<ZdUnitCode>  zdUnitCodes= zdUnitCodeMapper.selectZdUnitCodeWithPage(zdUnitCodePageDto);
        formatUnitCode(zdUnitCodes);
        return zdUnitCodes;
    }

    private void formatUnitCode(List<ZdUnitCode> zdUnitCodes) {
        if(zdUnitCodes!=null&&zdUnitCodes.size()>0){
            List<ZdMzClass> zdMzClassList= zdMzClassMapper.listAllZdMzClass();
            Map<String,String> zdMzClassMap = new HashMap<>();
            if(zdMzClassList!=null && zdMzClassList.size()>0){
                zdMzClassList.forEach(zdMzClass -> {
                    zdMzClassMap.put(zdMzClass.getCode(),zdMzClass.getName());
                });
            }
            zdUnitCodes.forEach(zdUnitCode1 -> {
                if(StringUtils.isNotBlank(zdUnitCode1.getParentCode())){
                    zdUnitCode1.setParentName(queryDeptNameByIdInCache(zdUnitCode1.getParentCode()));
                }
                ClassCodeEnum classCode=ClassCodeEnum.getClassCodeByCode(zdUnitCode1.getClassCode());
                zdUnitCode1.setClassValue(classCode==null?"":classCode.name);
                if(StringUtils.isNotBlank(zdUnitCode1.getMzClass())){
                    zdUnitCode1.setMzClassValue(zdMzClassMap.get(zdUnitCode1.getMzClass()));
                }
            });
        }
    }

    @Override
    public int countZdUnitCode(ZdUnitCode zdUnitCode) {
        return zdUnitCodeMapper.countZdUnitCode(zdUnitCode);
    }

    @Override
    public List<ZdUnitCode> checkZdUnitCode(ZdUnitCode zdUnitCode) {
        return zdUnitCodeMapper.checkZdUnitCode(zdUnitCode);
    }

    @Override
    public int saveZdUnitCode(ZdUnitCode zdUnitCode) throws MzException {
        if(zdUnitCode.getClassCode()==null){
            throw new MzException("分类码不能为空！");
        }
        ClassCodeEnum classCodeEnum=ClassCodeEnum.getClassCodeByCode(zdUnitCode.getClassCode());
        if(classCodeEnum==null){
            throw new MzException("分类码不正确！");
        }
        ZdUnitCode dbZdUnitCode= zdUnitCodeMapper.selectLastZdUnitCodeByCode(classCodeEnum.unitCodePrefix+"%");
        String code=null;
        if(dbZdUnitCode==null){
            //如果没有的分类，直接设置901开头的科室编码
            dbZdUnitCode= zdUnitCodeMapper.selectLastZdUnitCodeByCode("901%");
        }
        if(dbZdUnitCode==null){
            code = "9010000";
        }else {
            Integer tempCode = Integer.valueOf(dbZdUnitCode.getCode());
            tempCode++;
            code = tempCode.toString();
        }
        zdUnitCode.setCode(code);
       int num=zdUnitCodeMapper.insertZdUnitCode(zdUnitCode);
        initMap(zdUnitCode.getCode(),YesNoEnum.YES);
        return num;
    }

    @Override
    public int modifyZdUnitCode(ZdUnitCode zdUnitCode) {
        int num= zdUnitCodeMapper.updateZdUnitCode(zdUnitCode);
        initMap(zdUnitCode.getCode()==null?zdUnitCode.getOriginalCode():zdUnitCode.getCode(),YesNoEnum.YES);
        return num;
    }

    @Override
    public ZdUnitCode queryByCode(String code) {
        return zdUnitCodeMapper.selectByCode(code);
    }

    @Override
    public String queryDeptNameByIdInCache(String code) {
        if ("0000000".equals(code) || StringUtils.isBlank(code)) {
            return null;
        }
        initMap(code,YesNoEnum.NO);
        ZdUnitCode zdUnitCode=map.get(code);
        return zdUnitCode==null?null:zdUnitCode.getName();
    }

    /**
     * 初始化 缓存
     * @param code 编码
     * @param yesNoEnum 强制刷新缓存标记
     */
    private void initMap(String code,YesNoEnum yesNoEnum) {
        if (YesNoEnum.NO.equals(yesNoEnum) || map.size() == 0 || (code!=null && map.get(code) == null)) {
            List<ZdUnitCode> zdUnitCodes =zdUnitCodeMapper.selectAll();
            if (zdUnitCodes != null && zdUnitCodes.size() > 0) {
                zdUnitCodes.stream().forEach(zdUnitCode -> {
                    if (zdUnitCode != null) {
                        map.put(zdUnitCode.getCode(), zdUnitCode);
                    }
                });
            }
        }
    }

    @Override
    public List<ZdUnitCode> queryZdUnitCode(ZdUnitCodePageDto zdUnitCodePageDto) {
        if(StringUtils.isBlank(zdUnitCodePageDto.getOrderByCase())){
            zdUnitCodePageDto.setOrderByCase("code");
        }
        List<ZdUnitCode>  zdUnitCodes= zdUnitCodeMapper.selectZdUnitCode(zdUnitCodePageDto);
        formatUnitCode(zdUnitCodes);
        return zdUnitCodes;
    }

    @Override
    public List<ZdUnitCode> queryAllDeptInCache() {
        List<ZdUnitCode> list=new ArrayList<>();
        initMap(null,YesNoEnum.NO);
        map.forEach((s, zdUnitCode) -> {
            if(YesNoEnum.NO.code.equals(zdUnitCode.getDelFlag())){
                list.add(zdUnitCode);
            }
        });
        return list;
    }

    @Override
    public List<ZdUnitCode> queryAllMzDeptInCache() {
        List<ZdUnitCode> list=new ArrayList<>();
        initMap(null,YesNoEnum.NO);
        map.forEach((s, zdUnitCode) -> {
            if(YesNoEnum.NO.code.equals(zdUnitCode.getDelFlag())){
                if(!YesNoEnum.NO.code.equals(zdUnitCode.getMzFlag())){
                    list.add(zdUnitCode);
                }
            }
        });
        return list;
    }

    @Override
    public List<ZdUnitCode> queryAllMzGhDeptInCache() {
        List<ZdUnitCode> list=new ArrayList<>();
        initMap(null,YesNoEnum.NO);
        map.forEach((s, zdUnitCode) -> {
            if(YesNoEnum.NO.code.equals(zdUnitCode.getDelFlag())){
                if(!YesNoEnum.NO.code.equals(zdUnitCode.getMzFlag()) && YesNoEnum.YES.code.equals(zdUnitCode.getGhjzFlag())){
                    list.add(zdUnitCode);
                }
            }
        });
        return list;
    }

    @Override
    public List<ZdUnitCode> queryAllMzDeptFromDb() {
        return zdUnitCodeMapper.selectAllMzZdUnitCode();
    }

    @Override
    public Map<String,String> queryZkWardByInpatientNo(String inpatientNo) {
        return zdUnitCodeMapper.selectZkWardByInpatientNo(inpatientNo);
    }

    @Override
    public List<ZdUnitCode> queryZdUnitCodeByCodes(List<String> codes) {
        return zdUnitCodeMapper.selectZdUnitCodeByCodes(codes);
    }

    @Override
    public List<ZdUnitCode> queryAllInpatientWard() {
        return zdUnitCodeMapper.selectAllInpatientWard();
    }

    @Override
    public List<ZdUnitCode> querySmallDeptByDept(String code) {
        List<String> codes=zdUnitCodeMapper.selectSmallDeptByDept(code);
        if(codes==null || codes.size()==0){
            return null;
        }
        return zdUnitCodeMapper.selectZdUnitCodeByCodes(codes);
    }

    @Override
    public List<String> queryBedNumByDept(String code) {
        return zdUnitCodeMapper.selectBedNumByDept(code);
    }

}
