package org.xyzh.study.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.study.TbTaskItem;
import org.xyzh.common.vo.TaskItemVO;

import java.util.List;

/**
 * @description TaskItemMapper.java文件描述 任务项关联数据访问层
 * @filename TaskItemMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-24
 */
@Mapper
public interface TaskItemMapper extends BaseMapper<TbTaskItem> {

    /**
     * @description 查询任务项关联列表
     * @param filter 过滤条件
     * @return List<TbTaskItem> 任务项关联列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TbTaskItem> selectTaskItems(TbTaskItem filter);

    /**
     * @description 根据关联ID查询关联信息
     * @param relationId 关联ID
     * @return TbTaskItem 关联信息
     * @author yslg
     * @since 2025-10-24
     */
    TbTaskItem selectByRelationId(@Param("relationId") String relationId);

    /**
     * @description 根据任务ID查询项关联列表
     * @param taskId 任务ID
     * @return List<TbTaskItem> 项关联列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TbTaskItem> selectByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据任务ID和类型查询项关联列表
     * @param taskId 任务ID
     * @param itemType 项类型（1资源 2课程）
     * @return List<TbTaskItem> 项关联列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TbTaskItem> selectByTaskIdAndType(@Param("taskId") String taskId, @Param("itemType") Integer itemType);

    /**
     * @description 根据任务ID查询任务项VO列表
     * @param taskId 任务ID
     * @return List<TaskItemVO> 任务项VO列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TaskItemVO> selectTaskItemVOByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据任务ID和用户ID查询任务项视图对象列表（包含该用户的学习状态）
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return List<TaskItemVO> 任务项视图对象列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TaskItemVO> selectTaskItemVOByTaskIdAndUserId(@Param("taskId") String taskId, @Param("userId") String userId);

    /**
     * @description 根据项ID查询任务关联列表
     * @param itemId 项ID
     * @param itemType 项类型（1资源 2课程）
     * @return List<TbTaskItem> 任务关联列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TbTaskItem> selectByItemId(@Param("itemId") String itemId, @Param("itemType") Integer itemType);

    /**
     * @description 根据任务ID和项ID查询关联信息
     * @param taskId 任务ID
     * @param itemId 项ID
     * @param itemType 项类型
     * @return TbTaskItem 关联信息
     * @author yslg
     * @since 2025-10-24
     */
    TbTaskItem selectByTaskIdAndItemId(@Param("taskId") String taskId, @Param("itemId") String itemId, @Param("itemType") Integer itemType);

    /**
     * @description 检查任务项关联是否存在
     * @param taskId 任务ID
     * @param itemId 项ID
     * @param itemType 项类型
     * @param excludeId 排除的关联ID（用于更新时排除自身）
     * @return int 存在的数量
     * @author yslg
     * @since 2025-10-24
     */
    int countByTaskIdAndItemId(@Param("taskId") String taskId, @Param("itemId") String itemId, @Param("itemType") Integer itemType, @Param("excludeId") String excludeId);

    /**
     * @description 插入任务项关联
     * @param taskItem 任务项关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int insertTaskItem(TbTaskItem taskItem);

    /**
     * @description 更新任务项关联
     * @param taskItem 任务项关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int updateTaskItem(TbTaskItem taskItem);

    /**
     * @description 删除任务项关联
     * @param taskItem 任务项关联
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int deleteTaskItem(TbTaskItem taskItem);

    /**
     * @description 批量插入任务项关联
     * @param taskItemList 任务项关联列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int batchInsertTaskItems(@Param("taskItemList") List<TbTaskItem> taskItemList);

    /**
     * @description 批量删除任务项关联
     * @param ids 关联ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int batchDeleteTaskItems(@Param("ids") List<String> ids);

    /**
     * @description 根据任务ID批量删除项关联
     * @param taskId 任务ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int deleteByTaskId(@Param("taskId") String taskId);

    /**
     * @description 根据项ID批量删除任务关联
     * @param itemId 项ID
     * @param itemType 项类型
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-24
     */
    int deleteByItemId(@Param("itemId") String itemId, @Param("itemType") Integer itemType);

    /**
     * @description 分页查询任务项关联
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return List<TbTaskItem> 任务项关联列表
     * @author yslg
     * @since 2025-10-24
     */
    List<TbTaskItem> selectTaskItemsPage(@Param("filter") TbTaskItem filter, @Param("pageParam") PageParam pageParam);

    /**
     * @description 统计任务项关联总数
     * @param filter 过滤条件
     * @return long 总数
     * @author yslg
     * @since 2025-10-24
     */
    long countTaskItems(@Param("filter") TbTaskItem filter);
}

