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

import cn.hnthyy.thmz.entity.his.ZdMzClass;
import cn.hnthyy.thmz.entity.his.ZdUnitCode;
import cn.hnthyy.thmz.enums.ClassCodeEnum;
import cn.hnthyy.thmz.enums.YesNoEnum;
import cn.hnthyy.thmz.mapper.his.ZdMzClassMapper;
import cn.hnthyy.thmz.mapper.his.ZdUnitCodeMapper;
import cn.hnthyy.thmz.pageDto.ZdUnitCodePageDto;
import cn.hnthyy.thmz.service.his.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) {
       int num=zdUnitCodeMapper.insertZdUnitCode(zdUnitCode);
        initMap(zdUnitCode.getCode());
        return num;
    }

    @Override
    public int modifyZdUnitCode(ZdUnitCode zdUnitCode) {
        int num= zdUnitCodeMapper.updateZdUnitCode(zdUnitCode);
        initMap(zdUnitCode.getCode()==null?zdUnitCode.getOriginalCode():zdUnitCode.getCode());
        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);
        ZdUnitCode zdUnitCode=map.get(code);
        return zdUnitCode==null?null:zdUnitCode.getName();
    }

    private void initMap(String code) {
        if (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);
        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);
        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> 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);
    }
}
