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.dto.study.TbLearningStatisticsDetail;
import org.xyzh.common.vo.LearningStatisticsDetailVO;

import java.util.Date;
import java.util.List;

/**
 * @description 学习统计明细数据访问层
 * @filename LearningStatisticsDetailMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-27
 */
@Mapper
public interface LearningStatisticsDetailMapper extends BaseMapper<TbLearningStatisticsDetail> {

    /**
     * @description 插入统计明细
     * @param detail 统计明细
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-27
     */
    int insertStatisticsDetail(TbLearningStatisticsDetail detail);

    /**
     * @description 更新统计明细
     * @param detail 统计明细
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-27
     */
    int updateStatisticsDetail(TbLearningStatisticsDetail detail);

    /**
     * @description 插入或更新统计明细（ON DUPLICATE KEY UPDATE）
     * @param detail 统计明细
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-27
     */
    int insertOrUpdateStatisticsDetail(TbLearningStatisticsDetail detail);

    /**
     * @description 根据条件查询统计明细
     * @param filter 过滤条件
     * @return List<TbLearningStatisticsDetail> 统计明细列表
     * @author yslg
     * @since 2025-10-27
     */
    List<TbLearningStatisticsDetail> selectStatisticsDetails(TbLearningStatisticsDetail filter);

    /**
     * @description 根据用户ID和日期查询统计明细
     * @param userId 用户ID
     * @param statDate 统计日期
     * @return List<TbLearningStatisticsDetail> 统计明细列表
     * @author yslg
     * @since 2025-10-27
     */
    List<TbLearningStatisticsDetail> selectByUserIdAndDate(
            @Param("userId") String userId,
            @Param("statDate") Date statDate);

    /**
     * @description 根据用户ID和日期范围查询统计明细
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return List<TbLearningStatisticsDetail> 统计明细列表
     * @author yslg
     * @since 2025-10-27
     */
    List<TbLearningStatisticsDetail> selectByUserIdAndDateRange(
            @Param("userId") String userId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate);

    /**
     * @description 根据用户ID和日期范围查询统计明细VO（带关联信息）
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return List<LearningStatisticsDetailVO> 统计明细VO列表
     * @author yslg
     * @since 2025-10-27
     */
    List<LearningStatisticsDetailVO> selectStatisticsDetailsWithInfo(
            @Param("userId") String userId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate);

    /**
     * @description 根据用户ID、资源类型和日期查询统计明细
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param statDate 统计日期
     * @return TbLearningStatisticsDetail 统计明细
     * @author yslg
     * @since 2025-10-27
     */
    TbLearningStatisticsDetail selectByUserIdAndResourceTypeAndDate(
            @Param("userId") String userId,
            @Param("resourceType") Integer resourceType,
            @Param("resourceId") String resourceId,
            @Param("statDate") Date statDate);

    /**
     * @description 删除统计明细（软删除）
     * @param id 明细ID
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-27
     */
    int deleteStatisticsDetail(@Param("id") String id);

    /**
     * @description 批量删除统计明细（软删除）
     * @param ids 明细ID列表
     * @return int 影响行数
     * @author yslg
     * @since 2025-10-27
     */
    int batchDeleteStatisticsDetails(@Param("ids") List<String> ids);

    /**
     * @description 按日期汇总用户学习统计
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return List<TbLearningStatisticsDetail> 汇总结果
     * @author yslg
     * @since 2025-10-27
     */
    List<TbLearningStatisticsDetail> selectDailySummary(
            @Param("userId") String userId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate);
}

