package com.dora.mapper;

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

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 提现申请Mapper接口
 */
@Mapper
public interface WithdrawRequestMapper {

    /**
     * 插入提现申请
     */
    int insert(WithdrawRequest withdrawRequest);

    /**
     * 根据ID查询提现申请
     */
    WithdrawRequest selectById(@Param("id") Long id);

    /**
     * 根据用户ID查询提现申请列表
     */
    List<WithdrawRequest> selectByUserId(@Param("userId") Long userId, 
                                        @Param("offset") int offset, 
                                        @Param("limit") int limit);

    /**
     * 根据用户ID查询提现申请总数
     */
    Long countByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID查询待审核的提现金额
     */
    BigDecimal sumPendingAmountByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID查询已通过的提现金额
     */
    BigDecimal sumApprovedAmountByUserId(@Param("userId") Long userId);

    /**
     * 更新提现申请状态
     */
    int updateStatus(@Param("id") Long id, 
                    @Param("status") Integer status, 
                    @Param("reason") String reason);

    // ====== 管理员审核相关方法 ======

    /**
     * 管理员查询提现申请列表（带条件筛选）
     */
    List<WithdrawRequest> selectForAdmin(@Param("status") Integer status,
                                        @Param("userId") Long userId,
                                        @Param("accountType") String accountType,
                                        @Param("offset") int offset,
                                        @Param("limit") int limit);

    /**
     * 管理员查询提现申请总数（带条件筛选）
     */
    Long countForAdmin(@Param("status") Integer status,
                      @Param("userId") Long userId,
                      @Param("accountType") String accountType);

    /**
     * 更新提现申请状态和审核时间
     */
    int updateStatusWithReviewTime(@Param("id") Long id,
                                  @Param("status") Integer status,
                                  @Param("reason") String reason,
                                  @Param("reviewerId") Long reviewerId);

    /**
     * 管理员审核时更新提现申请（包含流水号等处理信息）
     */
    int updateWithProcessInfo(@Param("id") Long id,
                             @Param("status") Integer status,
                             @Param("reason") String reason,
                             @Param("reviewerId") Long reviewerId,
                             @Param("transactionNo") String transactionNo,
                             @Param("feeAmount") BigDecimal feeAmount,
                             @Param("actualAmount") BigDecimal actualAmount);

    /**
     * 统计各状态的提现申请数量
     */
    Long countByStatus(@Param("status") Integer status);

    /**
     * 统计各状态的提现金额
     */
    BigDecimal sumAmountByStatus(@Param("status") Integer status);

    /**
     * 查询用户信息关联的提现申请（用于管理员审核显示用户详情）
     */
    List<WithdrawRequest> selectWithUserInfo(@Param("status") Integer status,
                                            @Param("userId") Long userId,
                                            @Param("accountType") String accountType,
                                            @Param("offset") int offset,
                                            @Param("limit") int limit);

    /**
     * 批量更新提现申请状态（用于批量审核）
     */
    int updateStatusBatch(@Param("ids") List<Long> ids,
                         @Param("status") Integer status,
                         @Param("reason") String reason);

    // ====== 仪表盘统计相关 ======

    /**
     * 统计已通过的提现总金额
     */
    BigDecimal sumApprovedAmount();

    /**
     * 统计今日审核通过的数量
     */
    Long countTodayApproved(@Param("today") LocalDateTime today);

    /**
     * 统计今日审核通过的金额
     */
    BigDecimal sumTodayApprovedAmount(@Param("today") LocalDateTime today);

    /**
     * 统计今日提现申请数量
     */
    Long countTodayRequests(@Param("today") LocalDateTime today);
} 