package com.kexue.skills.mapper;

import com.kexue.skills.entity.CmsContent;
import com.kexue.skills.entity.dto.CmsContentDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * (CmsContent)表数据库访问层
 *
 * @author 王志维
 * @since 2025-02-21 23:01:48
 */
@Mapper
public interface CmsContentMapper {
    /**
     * 分页查询
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    List<CmsContent> getPageList(CmsContentDto queryDto);

    /**
     * 带分页的查询
     *
     * @param queryDto 筛选条件
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 查询结果
     */
    List<CmsContent> getPageListWithPagination(@Param("queryDto") CmsContentDto queryDto, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 查询总记录数
     *
     * @param queryDto 筛选条件
     * @return 总记录数
     */
    int getPageListCount(CmsContentDto queryDto);

    /**
     * 查询列表
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    List<CmsContent> getList(CmsContentDto queryDto);

    /**
     * 通过ID查询单条数据
     *
     * @param contentId 主键
     * @return 实例对象
     */
    CmsContent queryById(Long contentId);
    
    /**
     * 通过ID和语言类型查询单条数据
     *
     * @param queryDto 筛选条件
     * @return 实例对象
     */
    CmsContent queryByIdWithLanguage(CmsContentDto queryDto);

    /**
     * 新增数据
     *
     * @param cmsContent 实例对象
     * @return 影响行数
     */
    int insert(CmsContent cmsContent);
    
    /**
     * 批量新增数据
     *
     * @param cmsContentList 实例对象列表
     * @return 影响行数
     */
    int batchInsert(@Param("cmsContentList") List<CmsContent> cmsContentList);

    /**
     * 更新数据
     *
     * @param cmsContent 实例对象
     * @return 影响行数
     */
    int update(CmsContent cmsContent);

    /**
     * 更新审核状态
     *
     * @param contentId 内容ID
     * @param auditStatus 审核状态
     * @param reviewerId 审核人ID
     * @param reviewerName 审核人名称
     * @param auditComment 审核意见
     * @return 影响行数
     */
    int updateAuditStatus(@Param("contentId") Long contentId, 
                         @Param("auditStatus") Integer auditStatus,
                         @Param("reviewerId") Long reviewerId,
                         @Param("reviewerName") String reviewerName,
                         @Param("auditComment") String auditComment,
                         @Param("updateBy") String updateBy);

    /**
     * 更新发布状态
     *
     * @param contentId 内容ID
     * @param publishStatus 发布状态
     * @param publishTime 发布时间
     * @return 影响行数
     */
    int updatePublishStatus(@Param("contentId") Long contentId, 
                           @Param("publishStatus") Integer publishStatus,
                           @Param("publishTime") String publishTime,
                           @Param("updateBy") String updateBy);

    /**
     * 通过主键逻辑删除
     *
     * @param contentId 主键
     * @return 影响行数
     */
    int logicDeleteById(@Param("contentId") Long contentId, @Param("updateBy") String updateBy);

    /**
     * 通过主键物理删除
     *
     * @param contentId 主键
     * @return 影响行数
     */
    int deleteById(Long contentId);

    /**
     * 增加阅读量
     *
     * @param contentId 内容ID
     * @return 影响行数
     */
    int increaseViewCount(Long contentId);
    
    /**
     * 查询用户最近创建的内容ID列表
     *
     * @param userId 用户ID
     * @param limit 查询数量
     * @return 内容ID列表
     */
    List<Long> queryRecentCreatedByUserId(@Param("userId") Long userId, @Param("limit") int limit);

    /**
     * 获取用户历史查看的内容列表
     *
     * @param userId 用户ID
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 查询结果
     */
    List<CmsContent> getPageListByUserHistory(@Param("userId") Long userId, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 获取用户历史查看的内容总数
     *
     * @param userId 用户ID
     * @return 总记录数
     */
    int getPageListByUserHistoryCount(@Param("userId") Long userId);

    /**
     * 获取用户收藏的内容列表
     *
     * @param userId 用户ID
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 查询结果
     */
    List<CmsContent> getPageListByUserFavorites(@Param("userId") Long userId, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 获取用户收藏的内容总数
     *
     * @param userId 用户ID
     * @return 总记录数
     */
    int getPageListByUserFavoritesCount(@Param("userId") Long userId);

    /**
     * 获取用户购买的内容列表
     *
     * @param userId 用户ID
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 查询结果
     */
    List<CmsContent> getPageListByUserPurchases(@Param("userId") Long userId, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 获取用户购买的内容总数
     *
     * @param userId 用户ID
     * @return 总记录数
     */
    int getPageListByUserPurchasesCount(@Param("userId") Long userId);

    /**
     * 获取用户创建的内容列表
     *
     * @param userId 用户ID
     * @param publishStatus 发布状态
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 查询结果
     */
    List<CmsContent> getPageListByUserCreated(@Param("userId") Long userId, @Param("publishStatus") Integer publishStatus, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 获取用户创建的内容总数
     *
     * @param userId 用户ID
     * @param publishStatus 发布状态
     * @return 总记录数
     */
    int getPageListByUserCreatedCount(@Param("userId") Long userId, @Param("publishStatus") Integer publishStatus);
    
    /**
     * 清空表数据
     *
     * @return 影响行数
     */
    int truncateTable();
}