package cn.novalon.gym.manage.member.service;

import cn.novalon.gym.manage.member.entity.MemberCardTransaction;
import cn.novalon.gym.manage.member.enums.TransactionType;
import org.springframework.data.domain.Pageable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDateTime;

/**
 * 会员卡交易流水服务接口
 * 
 * @author 付嘉
 * @date 2026-05-27
 */
public interface IMemberCardTransactionService {

    /**
     * 记录每一次变动
     * @param transaction 流水记录
     * @return 插入的流水记录
     */
    Mono<MemberCardTransaction> insertTransaction(MemberCardTransaction transaction);

    /**
     * 会员端"使用记录"
     * @param memberId 会员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 流水记录列表
     */
    Flux<MemberCardTransaction> findByMemberIdAndTimeRange(Long memberId, LocalDateTime startTime,
                                                           LocalDateTime endTime, Pageable pageable);

    /**
     * 后台"使用记录查询"
     * @param memberId 会员ID
     * @param memberCardId 会员卡ID
     * @param operationType 操作类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 流水记录列表
     */
    Flux<MemberCardTransaction> findWithConditions(Long memberId, Long memberCardId,
                                                   TransactionType operationType,
                                                   LocalDateTime startTime, LocalDateTime endTime,
                                                   Pageable pageable);

    /**
     * 统计符合条件的流水总数
     */
    Mono<Long> countWithConditions(Long memberId, Long memberCardId,
                                   TransactionType operationType,
                                   LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按会员卡ID查询所有流水记录
     */
    Flux<MemberCardTransaction> findByMemberCardId(Long memberCardId);

    /**
     * 数据统计 - 统计某卡种的总扣次数
     */
    Mono<Long> sumDeductCountByCardId(Long memberCardId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 数据统计 - 统计某时间段的续费总金额
     */
    Mono<Double> sumRenewAmountByTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 数据统计 - 统计某会员的购卡总金额
     */
    Mono<Double> sumPurchaseAmountByMemberId(Long memberId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 创建交易记录
     */
    Mono<Void> createTransaction(MemberCardTransaction transaction);

    /**
     * 查询会员的交易记录
     */
    Flux<MemberCardTransaction> findByMemberId(Long memberId);

    /**
     * 查询会员卡记录的交易历史
     */
    Flux<MemberCardTransaction> findByRecordId(Long recordId);
}
