package cn.iocoder.yudao.module.pms.service;

import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotProductClassifyListReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotProductClassifySaveReqVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;

import java.util.*;

/**
 * 产品分类 Service 接口
 *
 * @author 芋道源码
 */
public interface IotProductClassifyService {

    /**
     * 创建产品分类
     *
     * @param createReqVO 产品分类信息
     * @return 产品分类编号
     */
    Long createIotProductClassify(IotProductClassifySaveReqVO createReqVO);

    /**
     * 更新产品分类
     *
     * @param updateReqVO 产品分类信息
     */
    void updateIotProductClassify(IotProductClassifySaveReqVO updateReqVO);

    /**
     * 删除产品分类
     *
     * @param id 产品分类编号
     */
    void deleteIotProductClassify(Long id);

    /**
     * 获得产品分类信息
     *
     * @param id 产品分类编号
     * @return 产品分类信息
     */
    IotProductClassifyDO getIotProductClassify(Long id);

    /**
     * 获得产品分类信息数组
     *
     * @param ids 产品分类编号数组
     * @return 产品分类信息数组
     */
    List<IotProductClassifyDO> getIotProductClassifyList(Collection<Long> ids);

    /**
     * 筛选产品分类列表
     *
     * @param reqVO 筛选条件请求 VO
     * @return 产品分类列表
     */
    List<IotProductClassifyDO> getIotProductClassifyList(IotProductClassifyListReqVO reqVO);

    /**
     * 获得指定编号的产品分类 Map
     *
     * @param ids 产品分类编号数组
     * @return 产品分类 Map
     */
    default Map<Long, IotProductClassifyDO> getIotProductClassifyMap(Collection<Long> ids) {
        List<IotProductClassifyDO> list = getIotProductClassifyList(ids);
        return CollectionUtils.convertMap(list, IotProductClassifyDO::getId);
    }

    /**
     * 获得指定产品分类的所有子产品分类
     *
     * @param id 产品分类编号
     * @return 子产品分类列表
     */
    default Set<Long> getChildIotProductClassifyList(Long id) {
        List<IotProductClassifyDO> deviceCategories = getChildIotProductClassifyList(Collections.singleton(id));
        return CollectionUtils.convertSet(deviceCategories, IotProductClassifyDO::getId);
    }

    /**
     * 获得指定产品分类的所有子产品分类
     *
     * @param ids 产品分类编号数组
     * @return 子产品分类列表
     */
    List<IotProductClassifyDO> getChildIotProductClassifyList(Collection<Long> ids);

//    /**
//     * 获得指定领导者的产品分类列表
//     *
//     * @param id 领导者编号
//     * @return 产品分类列表
//     */
//    List<IotProductClassifyDO> getIotProductClassifyListByLeaderUserId(Long id);
//
//    /**
//     * 获得所有子产品分类，从缓存中
//     *
//     * @param id 父产品分类编号
//     * @return 子产品分类列表
//     */
//    Set<Long> getChildIotProductClassifyIdListFromCache(Long id);
//
//    /**
//     * 校验产品分类们是否有效。如下情况，视为无效：
//     * 1. 产品分类编号不存在
//     * 2. 产品分类被禁用
//     *
//     * @param ids 角色编号数组
//     */
//    void validateIotProductClassifyList(Collection<Long> ids);

}
