package com.bizzan.bitrade.dao;

import com.bizzan.bitrade.constant.CoinRechargeOrderStatus;
import com.bizzan.bitrade.entity.CoinRechargeOrder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * 链上充值订单 DAO
 *
 * @author auto
 * @date 2026-05-13
 */
@Repository
public interface CoinRechargeOrderDao extends JpaRepository<CoinRechargeOrder, Long>,
        JpaSpecificationExecutor<CoinRechargeOrder> {

    /**
     * 按订单号查询
     *
     * @param orderNo 订单号
     * @return 订单，不存在返回 null
     */
    CoinRechargeOrder findByOrderNo(String orderNo);

    /**
     * 按会员ID分页查询订单列表，按创建时间倒序
     *
     * @param memberId 会员ID
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<CoinRechargeOrder> findAllByMemberIdOrderByCreateTimeDesc(Long memberId, Pageable pageable);

    /**
     * 按会员ID和状态分页查询
     *
     * @param memberId 会员ID
     * @param status   订单状态
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<CoinRechargeOrder> findAllByMemberIdAndStatusOrderByCreateTimeDesc(
            Long memberId, CoinRechargeOrderStatus status, Pageable pageable);

    /**
     * 判断订单号是否已存在（用于生成唯一订单号时校验）
     *
     * @param orderNo 订单号
     * @return 是否存在
     */
    boolean existsByOrderNo(String orderNo);

    /**
     * 查询指定状态的所有订单（定时任务扫描使用）
     *
     * @param status 订单状态
     * @return 订单列表
     */
    List<CoinRechargeOrder> findAllByStatus(CoinRechargeOrderStatus status);

    /**
     * 查询指定状态且创建时间早于指定时间的订单（用于超时取消）
     *
     * @param status    订单状态
     * @param beforeTime 创建时间上限（早于此时间的订单视为超时）
     * @return 超时订单列表
     */
    List<CoinRechargeOrder> findAllByStatusAndCreateTimeBefore(
            CoinRechargeOrderStatus status, Date beforeTime);
}
