package com.starry.admin.modules.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.starry.admin.modules.system.mapper.SysDictDataMapper;
import com.starry.admin.modules.system.mapper.SysDictMapper;
import com.starry.admin.modules.system.module.entity.SysDictDataEntity;
import com.starry.admin.modules.system.module.entity.SysDictEntity;
import com.starry.admin.modules.system.service.ISysDictService;
import com.starry.admin.modules.system.vo.SysDictDataVo;
import com.starry.admin.modules.system.vo.SysDictVo;
import com.starry.admin.utils.DictUtils;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;

/**
 * 字典表Service业务层处理
 *
 * @author admin
 */
@Service
public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDictEntity> implements ISysDictService {
    @Resource
    private SysDictMapper sysDictMapper;
    @Resource
    private SysDictDataMapper sysDictDataMapper;

    /**
     * 查询字典表
     *
     * @param dictId
     *            字典表主键
     * @return 字典表
     */
    @Override
    public SysDictEntity selectXlDictByDictId(Long dictId) {
        return sysDictMapper.selectXlDictByDictId(dictId);
    }

    /**
     * 查询字典表列表
     *
     * @param sysDictVo
     *            字典表
     * @return 字典表
     */
    @Override
    public Page<SysDictEntity> selectXlDictList(SysDictVo sysDictVo) {
        return sysDictMapper.selectXlDictList(new Page<>(sysDictVo.getPageNum(), sysDictVo.getPageSize()), sysDictVo);
    }

    /**
     * 新增字典表
     *
     * @param sysDictEntity
     *            字典表
     * @return 结果
     */
    @Override
    public boolean create(SysDictEntity sysDictEntity) {
        return save(sysDictEntity);
    }

    /**
     * 修改字典表
     *
     * @param sysDictEntity
     *            字典表
     * @return 结果
     */
    @Override
    public boolean update(SysDictEntity sysDictEntity) {
        return updateById(sysDictEntity);
    }

    /**
     * 批量删除字典表
     *
     * @param dictIds
     *            需要删除的字典表主键
     * @return 结果
     */
    @Override
    public int deleteXlDictByDictIds(Long[] dictIds) {
        return sysDictMapper.deleteBatchIds(Arrays.asList(dictIds));
    }

    /**
     * 删除字典表信息
     *
     * @param dictId
     *            字典表主键
     * @return 结果
     */
    @Override
    public int deleteXlDictByDictId(Long dictId) {
        return sysDictMapper.deleteById(dictId);
    }

    @Override
    public List<SysDictEntity> selectDictTypeAll() {
        return sysDictMapper.selectList(new LambdaQueryWrapper<>());
    }

    /**
     * 加载字典缓存数据
     */
    @Override
    public void loadingDictCache() {
        SysDictDataVo dictData = new SysDictDataVo();
        dictData.setStatus(0);
        // 按字典编码分组，不分页，size < 0
        IPage<SysDictDataEntity> iPage = sysDictDataMapper.selectXlDictDataList(new Page<>(1, -1), dictData);
        Map<String, List<SysDictDataEntity>> dictDataMap = iPage.getRecords().stream()
                .collect(Collectors.groupingBy(SysDictDataEntity::getDictType));
        for (Map.Entry<String, List<SysDictDataEntity>> entry : dictDataMap.entrySet()) {
            DictUtils.setDictCache(entry.getKey(), entry.getValue().stream()
                    .sorted(Comparator.comparing(SysDictDataEntity::getSort)).collect(Collectors.toList()));
        }
    }

    /**
     * 清空字典缓存数据
     */
    @Override
    public void clearDictCache() {
        DictUtils.clearDictCache();
    }

    /**
     * 重置字典缓存数据
     */
    @Override
    public void resetDictCache() {
        clearDictCache();
        loadingDictCache();
    }
}
