package org.xyzh.news.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.resource.TbTag;
import org.xyzh.common.vo.UserDeptRoleVO;

import java.util.List;

/**
 * @description TagMapper.java文件描述 标签数据访问层
 * @filename TagMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-15
 */
@Mapper
public interface TagMapper extends BaseMapper<TbTag> {

    /**
     * @description 查询标签列表
     * @param filter 过滤条件
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTag> selectTags(@Param("filter") TbTag filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据标签ID查询标签信息
     * @param tagId 标签ID
     * @return TbTag 标签信息
     * @author yslg
     * @since 2025-10-15
     */
    TbTag selectByTagId(@Param("tagId") String tagId);

    /**
     * @description 根据标签名称查询标签（包含权限过滤）
     * @param name 标签名称
     * @param userDeptRoles 用户部门角色列表
     * @return TbTag 标签信息
     * @author yslg
     * @since 2025-10-15
     */
    TbTag selectByName(@Param("name") String name, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据状态查询标签列表（包含权限过滤）
     * @param status 状态
     * @param userDeptRoles 用户部门角色列表
     * @return List<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTag> selectByStatus(@Param("status") Integer status, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 根据标签类型查询标签列表
     * @param tagType 标签类型（1-文章分类标签 2-课程分类标签 3-学习任务分类标签）
     * @return List<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-27
     */
    List<TbTag> selectByTagType(@Param("tagType") Integer tagType);

    /**
     * @description 查询热门标签列表
     * @param limit 限制数量
     * @return List<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTag> selectHotTags(@Param("limit") Integer limit);

    /**
     * @description 检查标签名称是否存在（同类型下，包含权限过滤）
     * @param name 标签名称
     * @param tagType 标签类型
     * @param excludeId 排除的标签ID（用于更新时排除自身）
     * @param userDeptRoles 用户部门角色列表
     * @return int 存在的数量
     * @author yslg
     * @since 2025-10-27
     */
    int countByNameAndType(@Param("name") String name, @Param("tagType") Integer tagType, @Param("excludeId") String excludeId, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);

    /**
     * @description 插入标签
     * @param tag 标签
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int insertTag(TbTag tag);

    /**
     * @description 更新标签
     * @param tag 标签
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int updateTag(TbTag tag);

    /**
     * @description 删除标签
     * @param tag 标签
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int deleteTag(TbTag tag);

    /**
     * @description 批量插入标签
     * @param tagList 标签列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchInsertTags(@Param("tagList") List<TbTag> tagList);

    /**
     * @description 批量删除标签
     * @param ids 标签ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-15
     */
    int batchDeleteTags(@Param("ids") List<String> ids);

    /**
     * @description 分页查询标签
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbTag> 标签列表
     * @author yslg
     * @since 2025-10-15
     */
    List<TbTag> selectTagsPage(@Param("filter") TbTag filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 统计标签总数
     * @param filter 过滤条件
     * @return long 总数
     * @author yslg
     * @since 2025-10-15
     */
    long countTags(@Param("filter") TbTag filter);
}
