package com.bizzan.bitrade.dao;

import com.bizzan.bitrade.dao.base.BaseDao;
import com.bizzan.bitrade.entity.StakingWallet;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * 质押钱包 DAO
 *
 * @author auto
 * @date 2026-05-20
 */
public interface StakingWalletDao extends BaseDao<StakingWallet> {

    /**
     * 按用户ID和币种查询质押钱包
     *
     * @param memberId 用户ID
     * @param coinUnit 币种
     * @return 质押钱包，不存在返回 null
     */
    StakingWallet findByMemberIdAndCoinUnit(Long memberId, String coinUnit);

    /**
     * 按用户与币种查询（忽略大小写，兼容 IBIT / iBit 等入库差异）
     */
    @Query("from StakingWallet w where w.memberId = :memberId and upper(w.coinUnit) = upper(:coinUnit)")
    StakingWallet findByMemberIdAndCoinUnitIgnoreCase(@Param("memberId") Long memberId, @Param("coinUnit") String coinUnit);

    /**
     * 查询用户所有币种的质押钱包
     *
     * @param memberId 用户ID
     * @return 质押钱包列表
     */
    List<StakingWallet> findAllByMemberId(Long memberId);

    /**
     * 增加锁定余额（用户质押：资金账户 → 质押锁定）
     *
     * @param id     质押钱包ID
     * @param amount 增加金额
     * @return 影响行数
     */
    @Transactional
    @Modifying
    @Query("update StakingWallet w set w.lockedBalance = w.lockedBalance + :amount where w.id = :id")
    int increaseLockedBalance(@Param("id") Long id, @Param("amount") BigDecimal amount);

    /**
     * 减少锁定余额（质押到期解锁：直接归还资金账户）
     *
     * @param id     质押钱包ID
     * @param amount 解锁金额
     * @return 影响行数，0 表示锁定余额不足
     */
    @Transactional
    @Modifying
    @Query("update StakingWallet w set w.lockedBalance = w.lockedBalance - :amount where w.id = :id and w.lockedBalance >= :amount")
    int decreaseLockedBalance(@Param("id") Long id, @Param("amount") BigDecimal amount);
}
