package com.agent.management.service;

import com.agent.management.model.dto.TagExportDTO;
import com.agent.management.model.dto.TagImportDTO;
import com.agent.management.model.dto.TagImportResultDTO;
import com.agent.management.model.entity.Tag;
import com.agent.management.model.entity.TagGroup;
import com.agent.management.model.vo.TagBriefVO;

import java.util.List;

public interface TagService {

    // ========== 标签组 ==========

    List<TagGroup> listGroups();

    TagGroup createGroup(String name, String description);

    TagGroup updateGroup(Long id, String name, String description);

    void deleteGroup(Long id);

    // ========== 标签节点 ==========

    /** 获取某标签组的全部标签（扁平列表，前端构建树） */
    List<Tag> listTags(Long groupId);

    /** 在指定父节点下添加子标签 */
    Tag createTag(Long groupId, Long parentId, String name);

    /** 修改标签名称 */
    Tag updateTag(Long id, String name);

    /** 删除标签（递归删除子节点） */
    void deleteTag(Long id);

    /** 移动标签到新的父节点 */
    Tag moveTag(Long id, Long newParentId, Integer sortOrder);

    // ========== 导入导出 ==========

    /** 导出所有标签组 */
    TagExportDTO exportAll();

    /** 导入标签数据 */
    TagImportResultDTO importTags(TagImportDTO request);

    // ========== 打标 ==========

    /**
     * 批量设置实体的标签（全量替换）
     * @param entityType 实体类型，如 "skill"
     * @param entityId 实体标识，如 folderName
     * @param tagIds 标签 ID 列表
     */
    void setTags(String entityType, String entityId, List<Long> tagIds);

    /**
     * 获取实体关联的标签列表
     * @param entityType 实体类型
     * @param entityId 实体标识
     * @return 标签简要信息列表
     */
    List<TagBriefVO> getEntityTags(String entityType, String entityId);

    /**
     * 批量重命名实体引用（用于 skill folderName 变更时同步标签关联）。
     * @param entityType 实体类型，如 "skill"
     * @param oldEntityId 旧标识
     * @param newEntityId 新标识
     * @return 受影响的关联数量
     */
    int renameEntityId(String entityType, String oldEntityId, String newEntityId);
}
