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.IotInfoClassifyListReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotInfoClassifyRespVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotInfoClassifySaveReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotInfoRespVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.IotInfoClassifyDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;

import java.util.*;

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

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

    /**
     * 更新产品分类
     *
     * @param updateReqVO 产品分类信息
     */
    void updateIotInfoClassify(IotInfoClassifySaveReqVO updateReqVO, String type);

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

    List<IotInfoClassifyRespVO> getChildContentFile(Long classId);
    /**
     * 获得产品分类信息
     *
     * @param id 产品分类编号
     * @return 产品分类信息
     */
    IotInfoClassifyDO getIotInfoClassify(Long id);

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

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

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

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

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

    /**
     * 获得指定部门的所有子部门
     *
     * @param ids 部门编号数组
     * @return 子部门列表
     */
    List<IotInfoClassifyDO> getChildInfoList(Collection<Long> ids);
}
