package org.xyzh.api.news.tag;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.resource.TbTag;
import org.xyzh.common.dto.resource.TbResourceTag;

import java.util.List;

/**
 * @description 标签服务接口
 * @filename TagService.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
public interface TagService {

    /**
     * @description 获取所有标签
     * @return ResultDomain<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> getAllTags();

    /**
     * @description 根据ID获取标签详情
     * @param tagID 标签ID
     * @return ResultDomain<TbTag> 标签详情
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> getTagById(String tagID);

    /**
     * @description 创建标签
     * @param tag 标签信息
     * @return ResultDomain<TbTag> 创建结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> createTag(TbTag tag);

    /**
     * @description 更新标签
     * @param tag 标签信息
     * @return ResultDomain<TbTag> 更新结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> updateTag(TbTag tag);

    /**
     * @description 删除标签
     * @param tagID 标签ID
     * @return ResultDomain<Boolean> 删除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> deleteTag(String tagID);

    /**
     * @description 根据名称搜索标签
     * @param name 标签名称
     * @return ResultDomain<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> searchTagsByName(String name);

    // ----------------资源标签关联相关--------------------------------

    /**
     * @description 获取资源的标签
     * @param resourceID 资源ID
     * @return ResultDomain<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbTag> getResourceTags(String resourceID);

    /**
     * @description 为资源添加标签
     * @param resourceID 资源ID
     * @param tagID 标签ID
     * @return ResultDomain<TbResourceTag> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbResourceTag> addResourceTag(String resourceID, String tagID);

    /**
     * @description 批量为资源添加标签
     * @param resourceID 资源ID
     * @param tagIDs 标签ID列表
     * @return ResultDomain<TbResourceTag> 添加结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<TbResourceTag> batchAddResourceTags(String resourceID, List<String> tagIDs);

    /**
     * @description 移除资源标签
     * @param resourceID 资源ID
     * @param tagID 标签ID
     * @return ResultDomain<Boolean> 移除结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> removeResourceTag(String resourceID, String tagID);

    /**
     * @description 清空资源的所有标签
     * @param resourceID 资源ID
     * @return ResultDomain<Boolean> 清空结果
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<Boolean> clearResourceTags(String resourceID);

    /**
     * @description 根据标签获取资源列表
     * @param tagID 标签ID
     * @return ResultDomain<String> 资源ID列表
     * @author yslg
     * @since 2025-10-15
     */
    ResultDomain<String> getResourcesByTag(String tagID);
}
