package com.dora.mapper;

import com.dora.dto.AdminPaymentUserDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 管理端支付用户统计Mapper接口
 */
@Mapper
public interface AdminPaymentUserMapper {

    /**
     * 获取支付概览统计
     */
    AdminPaymentUserDto.PaymentOverview selectPaymentOverview(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 获取支付用户列表
     */
    List<AdminPaymentUserDto.PaymentUserInfo> selectPaymentUserList(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate,
            @Param("role") Integer role,
            @Param("onlyRepeatUsers") Boolean onlyRepeatUsers,
            @Param("minAmount") BigDecimal minAmount,
            @Param("maxAmount") BigDecimal maxAmount,
            @Param("sortField") String sortField,
            @Param("sortOrder") String sortOrder,
            @Param("offset") int offset,
            @Param("size") int size);

    /**
     * 统计支付用户列表总数
     */
    Long countPaymentUserList(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate,
            @Param("role") Integer role,
            @Param("onlyRepeatUsers") Boolean onlyRepeatUsers,
            @Param("minAmount") BigDecimal minAmount,
            @Param("maxAmount") BigDecimal maxAmount);

    /**
     * 获取支付金额分布统计
     */
    List<Map<String, Object>> selectAmountDistribution(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 获取每日支付统计
     */
    List<AdminPaymentUserDto.DailyPaymentStats> selectDailyPaymentStats(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的总支付用户数
     */
    Long countTotalPaymentUsers(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的总支付订单数
     */
    Long countTotalPaymentOrders(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的总支付金额
     */
    BigDecimal sumTotalPaymentAmount(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的新增VIP用户数
     */
    Long countNewVipUsers(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的新增SVIP用户数
     */
    Long countNewSvipUsers(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的复购用户数
     */
    Long countRepeatPurchaseUsers(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);

    /**
     * 统计指定时间范围内的首次购买用户数
     */
    Long countFirstTimeUsers(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate);
}





