package com.bizzan.bitrade.dao;

import com.bizzan.bitrade.dao.base.BaseDao;
import com.bizzan.bitrade.entity.AirdropRecord;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import org.springframework.data.repository.query.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 空投分配记录 DAO
 *
 * @author auto
 * @date 2026-05-17
 */
public interface AirdropRecordDao extends BaseDao<AirdropRecord> {

    /**
     * 按用户查询空投记录，按创建时间倒序
     *
     * @param memberId 用户ID
     * @param pageable 分页参数
     * @return 记录分页
     */
    Page<AirdropRecord> findByMemberIdOrderByCreateTimeDesc(Long memberId, Pageable pageable);

    /**
     * 查询用户指定状态的空投记录列表
     *
     * @param memberId 用户ID
     * @param status   状态：0待领取 1已领取
     * @return 记录列表
     */
    List<AirdropRecord> findByMemberIdAndStatus(Long memberId, Integer status);

    /**
     * 判断用户是否存在指定状态的空投记录
     *
     * @param memberId 用户ID
     * @param status   状态：0待领取 1已领取
     * @return 是否存在
     */
    boolean existsByMemberIdAndStatus(Long memberId, Integer status);

    /**
     * 判断指定质押订单在某时间段内是否已发放过空投（防止当日重复发放）
     *
     * @param stakingOrderId 质押订单ID
     * @param startTime      当日开始时间（00:00:00）
     * @param endTime        当日结束时间（23:59:59）
     * @return 是否已发放
     */
    boolean existsByStakingOrderIdAndCreateTimeBetween(Long stakingOrderId, Date startTime, Date endTime);

    /**
     * 汇总用户待领取空投金额（status=0）
     */
    @org.springframework.data.jpa.repository.Query(
            "select coalesce(sum(r.amount), 0) from AirdropRecord r "
                    + "where r.memberId = :memberId and r.status = 0")
    BigDecimal sumPendingAmountByMemberId(@Param("memberId") Long memberId);

    /**
     * 按状态分页查询空投记录（管理员审核列表使用）
     *
     * @param status   状态：2=审核中，可传其他状态
     * @param pageable 分页参数
     * @return 记录分页
     */
    Page<AirdropRecord> findByStatusOrderByClaimTimeDesc(Integer status, Pageable pageable);
}
