package cn.axzo.msg.center.message.service;

import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeSaveOrUpdateParam;
import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO;
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
import cn.axzo.msg.center.service.enums.MessageGroupCategoryEnum;

import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 消息分类结点管理
 *
 * @author cold_blade
 * @date 2023/10/14
 * @version 1.0
 */
public interface MessageGroupNodeService {

    /**
     * 获取分类结点（叶结点）名称的路径
     *
     * @param groupNodeCodePaths 分类结点（叶结点）的编码列表
     * @return 分类结点（叶结点）名称的路径
     */
    Map<String, String> groupNodeNamePaths(Collection<String> groupNodeCodePaths);

    /**
     * 获取分类结点（叶结点）编码的路径
     *
     * @param leafGroupNodeCodes 分类结点（叶结点）的编码列表
     * @return 分类结点（叶结点）编码的路径
     */
    Map<String, String> leafGroupNodeCodePaths(Collection<String> leafGroupNodeCodes);

    /**
     * 获取分类结点（叶结点）编码的路径
     *
     * @param leafNodeCode 分类结点（根结点）的编码
     * @return 分类结点（叶结点）编码的路径
     */
    Optional<GroupTreeNodePathDTO> queryLeafGroupNodeCodePath(String leafNodeCode);

    /**
     * 获取分类结点（叶结点）编码的路径
     *
     * @param rootNodeCodes 分类结点（根结点）的编码列表
     * @return 分类结点（叶结点）编码的路径
     */
    List<GroupTreeNodePathDTO> leafGroupNodeCodePathsByRootNodeCodes(Collection<String> rootNodeCodes);

    /**
     * 新增结点
     *
     * @param param 结点内容
     */
    void addGroupNode(MessageGroupNodeSaveOrUpdateParam param);

    /**
     * 编辑结点
     *
     * @param param 结点内容
     */
    void updateGroupNode(MessageGroupNodeSaveOrUpdateParam param);

    /**
     * 删除结点
     *
     * @param operatorId  操作人id
     * @param nodeCode    待删除结点的编码
     */
    void deleteGroupNode(Long operatorId, String nodeCode);

    /**
     * 查询消息/待办 或者两者的分类树
     * @param category 消息/待办
     * @return 分类树列表
     */
    List<GroupTreeNodeDTO> listGroupTree(@Nullable MessageGroupCategoryEnum category);

    /**
     * 获取各个应用端对应的业务中心分类结点编码配置
     *
     * @param category         分类树的种类
     * @param appTerminalType  应用终端类型
     * @return 对应的分类树的根节点编码列表
     */
    List<String> listGroupTreeRootNodeCodes(MessageGroupCategoryEnum category, AppTerminalTypeEnum appTerminalType);

    /**
     * 获取对应的应用终端配置的分类结点信息
     *
     * @param appTerminalType  应用终端类型
     * @param category         模板分类结点的类型
     * @return 分类结点列表
     */
    List<GroupTreeNodeDTO> listLeafNodes(AppTerminalTypeEnum appTerminalType, MessageGroupCategoryEnum category);
}
