package com.dora.mapper;

import com.dora.entity.ContentRevenueStage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 作品收益阶段Mapper接口
 */
@Mapper
public interface ContentRevenueStageMapper {

    /**
     * 根据用户ID和内容类型获取收益阶段列表
     */
    List<ContentRevenueStage> selectByUserIdAndType(@Param("userId") Long userId, 
                                                   @Param("contentType") Integer contentType);

    /**
     * 根据内容ID获取收益阶段列表
     */
    List<ContentRevenueStage> selectByContentId(@Param("contentType") Integer contentType, 
                                               @Param("contentId") Long contentId);

    /**
     * 更新当前数量
     */
    int updateCurrentCount(@Param("id") Long id, @Param("currentCount") Integer currentCount);

    /**
     * 标记阶段为已达到
     */
    int markAsAchieved(@Param("id") Long id, @Param("achievedAt") java.time.LocalDateTime achievedAt);

    /**
     * 标记阶段为已提现
     */
    int markAsWithdrawn(@Param("id") Long id, @Param("withdrawnAt") java.time.LocalDateTime withdrawnAt);

    /**
     * 获取用户可提现的收益阶段列表
     */
    List<ContentRevenueStage> selectWithdrawableStages(@Param("userId") Long userId);

    /**
     * 统计用户已提现的总金额
     */
    java.math.BigDecimal sumWithdrawnAmount(@Param("userId") Long userId);

    /**
     * 统计用户未提现的总金额
     */
    java.math.BigDecimal sumUnwithdrawnAmount(@Param("userId") Long userId);

    /**
     * 根据用户ID和内容类型分页获取收益阶段列表
     */
    List<ContentRevenueStage> selectByUserIdAndTypeWithPagination(@Param("userId") Long userId, 
                                                                 @Param("contentType") Integer contentType,
                                                                 @Param("offset") Integer offset,
                                                                 @Param("size") Integer size);

    /**
     * 根据用户ID和内容类型统计收益阶段数量
     */
    Long countByUserIdAndType(@Param("userId") Long userId, @Param("contentType") Integer contentType);

    /**
     * 根据用户ID、内容类型和内容ID统计未提现金额
     */
    java.math.BigDecimal sumUnwithdrawnAmountByContentId(@Param("userId") Long userId, 
                                                        @Param("contentType") Integer contentType,
                                                        @Param("contentId") Long contentId);

    /**
     * 插入新的收益阶段记录
     */
    int insert(ContentRevenueStage contentRevenueStage);

    /**
     * 根据内容ID统计已达到的收益总金额
     * @param contentType 内容类型 (1工作流/2视频)
     * @param contentId 内容ID
     * @return 收益总金额
     */
    java.math.BigDecimal sumRevenueByContentId(@Param("contentType") Integer contentType, 
                                              @Param("contentId") Long contentId);
} 