package com.boman.system.service.impl;

import com.boman.domain.SysDictData;
import com.boman.domain.SysMenu;
import com.boman.domain.dto.AjaxResult;
import com.boman.system.mapper.SysDictDataMapper;
import com.boman.system.service.ISysDictDataService;
import com.boman.system.service.ISysDictTypeService;
import com.boman.system.utils.DictUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static com.boman.common.core.utils.obj.ObjectUtils.map;

/**
 * 字典 业务层处理
 *
 * @author ruoyi
 */
@Service
public class SysDictDataServiceImpl implements ISysDictDataService {
    @Autowired
    private SysDictDataMapper dictDataMapper;
    @Resource
    private ISysDictTypeService dictTypeService;

    /**
     * 根据条件分页查询字典数据
     *
     * @param dictData 字典数据信息
     * @return 字典数据集合信息
     */
    @Override
    public List<SysDictData> selectDictDataList(SysDictData dictData) {
        return dictDataMapper.selectDictDataList(dictData);
    }

    /**
     * 根据字典类型和字典键值查询字典数据信息
     *
     * @param dictType  字典类型
     * @param dictValue 字典键值
     * @return 字典标签
     */
    @Override
    public String selectDictLabel(String dictType, String dictValue) {
        List<SysDictData> datas = dictTypeService.selectDictDataByType(dictType);
        for (SysDictData data : datas) {
            if (data.getDictValue().equalsIgnoreCase(dictValue)) {
                return data.getDictLabel();
            }
        }

        return null;
    }

    /**
     * 根据字典数据ID查询信息
     *
     * @param id 字典数据ID
     * @return 字典数据
     */
    @Override
    public SysDictData selectDictDataById(Long id) {
        return dictDataMapper.selectDictDataById(id);
    }

    /**
     * 批量删除字典数据信息
     *
     * @param ids 需要删除的字典数据ID
     * @return 结果
     */
    @Override
    public int deleteDictDataByIds(Long[] ids) {
        int row = dictDataMapper.deleteDictDataByIds(ids);
        if (row > 0) {
            DictUtils.clearDictCache();
        }
        return row;
    }

    /**
     * 新增保存字典数据信息
     *
     * @param dictData 字典数据信息
     * @return 结果
     */
    @Override
    public int insertDictData(SysDictData dictData) {
        int row = dictDataMapper.insertDictData(dictData);
        if (row > 0) {
            DictUtils.clearDictCache();
        }
        return row;
    }

    /**
     * 修改保存字典数据信息
     *
     * @param dictData 字典数据信息
     * @return 结果
     */
    @Override
    public int updateDictData(SysDictData dictData) {
        int row = dictDataMapper.updateDictData(dictData);
        if (row > 0) {
            DictUtils.clearDictCache();
        }
        return row;
    }

    /**
     * 根据字典类型查询字典数据信息下拉树列表
     *
     * @param dictType
     * @return
     */
    @Override
    public List<SysDictData> selectTreeSelect(String dictType) {
        List<SysDictData> sysDictData = dictDataMapper.selectDictDataByType(dictType);
        recursionFn(sysDictData);
        return sysDictData;
    }

    /**
     * 递归列表
     *
     * @param sysDictData 子节点列表
     */
    private void recursionFn(List<SysDictData> sysDictData) {
        if (sysDictData.size() > 0) {
            //获取所有节点的id
            List<Long> allDictDataId = map(sysDictData, SysDictData::getId);
            //获得所有节点的子节点
            List<SysDictData> sysDictDataList = dictDataMapper.selectDictDataByParentId(allDictDataId);
            //如果子节点有数据
            if (sysDictDataList.size() > 0) {
                for (SysDictData dictData : sysDictData) {
                    //找到对应的子节点
                    List<SysDictData> childList = getChildList(sysDictDataList, dictData);
                    dictData.setChildren(childList);
                }
                recursionFn(sysDictDataList);
            }
        }
    }

    /**
     * 功能描述: 获取menu下所有的子节点
     *
     * @param allDictData 所有的
     * @param dictData    父节点
     * @return java.util.List<com.boman.domain.SysMenu>
     */

    private List<SysDictData> getChildList(List<SysDictData> allDictData, SysDictData dictData) {
        //定义子节点
        List<SysDictData> childrenList = new ArrayList<SysDictData>();
        Iterator<SysDictData> it = allDictData.iterator();
        while (it.hasNext()) {
            SysDictData n = (SysDictData) it.next();
            if (n.getParentId().longValue() == dictData.getId().longValue()) {
                childrenList.add(n);
            }
        }
        return childrenList;
    }

}
