package cn.iocoder.yudao.module.system.service.dict;

import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.CategoryDO;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 分类字典 Service 接口
 *
 * @author vinjor-m
 */
public interface CategoryService {

    /**
     * 创建分类字典
     *
     * @param categoryDO 分类字典信息
     * @return 分类字典主键id
     */
    String createCategory(CategoryDO categoryDO);

    /**
     * 更新分类字典
     *
     * @param categoryDO 分类字典信息
     */
    void updateCategory(CategoryDO categoryDO);

    /**
     * 删除分类字典
     *
     * @param id 分类字典id
     */
    void deleteCategory(String id);

    /**
     * 批量删除分类字典
     * @author vinjor-M
     * @date 17:16 2024/8/3
     * @param ids  分类字典ids
    **/
    void deleteCategory(Set<String> ids);

    /**
     * 获得分类字典信息
     *
     * @param id 分类字典编号
     * @return 分类字典信息
     */
    CategoryDO getCategory(String id);

    /**
     * 获得分类字典信息数组
     *
     * @param ids 分类字典id数组
     * @return 分类字典信息数组
     */
    List<CategoryDO> getCategoryList(Collection<String> ids);

    /**
     * 筛选分类字典列表
     *
     * @param reqVO 筛选条件请求 VO
     * @return 分类字典列表
     */
    List<CategoryDO> getCategoryList(CategoryDO reqVO);

    /**
     * 获得指定编号的分类字典 Map
     *
     * @param ids 分类字典id数组
     * @return 分类字典 Map
     */
    default Map<String, CategoryDO> getCategoryMap(Collection<String> ids) {
        List<CategoryDO> list = getCategoryList(ids);
        return CollectionUtils.convertMap(list, CategoryDO::getId);
    }

    /**
     * 获得指定分类字典的所有子分类字典
     *
     * @param id 分类字典id
     * @return 子分类字典列表
     */
    List<CategoryDO> getChildCategoryList(String id);

    /**
     * 获得所有子分类字典，从缓存中
     *
     * @param id 父分类字典id
     * @return 子分类字典列表
     */
    Set<String> getChildCategoryIdListFromCache(String id);

    /**
     * 校验分类字典们是否有效。如下情况，视为无效：
     * 1. 分类字典id不存在
     *
     * @param ids 分类字典id数组
     */
    void validateCategoryList(Collection<String> ids);

}
