package com.ruoyi.payment.mapper;

import java.math.BigDecimal;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.payment.domain.AccountBalance;

/**
 * 账户余额Mapper接口
 * 
 * @author ruoyi
 * @date 2025-12-17
 */
public interface AccountBalanceMapper 
{
    /**
     * 查询账户余额
     * 
     * @param balanceId 账户余额主键
     * @return 账户余额
     */
    public AccountBalance selectAccountBalanceByBalanceId(Long balanceId);

    /**
     * 根据账户ID查询账户余额
     * 
     * @param accountId 账户ID
     * @return 账户余额
     */
    public AccountBalance selectAccountBalanceByAccountId(Long accountId);

    /**
     * 查询账户余额列表
     * 
     * @param accountBalance 账户余额
     * @return 账户余额集合
     */
    public List<AccountBalance> selectAccountBalanceList(AccountBalance accountBalance);

    /**
     * 查询所有有余额的账户
     * 
     * @return 账户余额集合
     */
    public List<AccountBalance> selectAccountsWithBalance();

    /**
     * 查询余额大于指定金额的账户
     * 
     * @param minBalance 最小余额
     * @return 账户余额集合
     */
    public List<AccountBalance> selectAccountsWithMinBalance(@Param("minBalance") BigDecimal minBalance);

    /**
     * 统计总余额
     * 
     * @return 总余额
     */
    public BigDecimal selectTotalBalance();

    /**
     * 统计总可用余额
     * 
     * @return 总可用余额
     */
    public BigDecimal selectTotalAvailableBalance();

    /**
     * 统计总冻结金额
     * 
     * @return 总冻结金额
     */
    public BigDecimal selectTotalFrozenAmount();

    /**
     * 新增账户余额
     * 
     * @param accountBalance 账户余额
     * @return 结果
     */
    public int insertAccountBalance(AccountBalance accountBalance);

    /**
     * 修改账户余额
     * 
     * @param accountBalance 账户余额
     * @return 结果
     */
    public int updateAccountBalance(AccountBalance accountBalance);

    /**
     * 更新余额(乐观锁)
     * 
     * @param accountId 账户ID
     * @param balance 余额
     * @param frozenAmount 冻结金额
     * @param availableBalance 可用余额
     * @param version 版本号
     * @return 结果
     */
    public int updateBalanceWithVersion(@Param("accountId") Long accountId, 
                                        @Param("balance") BigDecimal balance,
                                        @Param("frozenAmount") BigDecimal frozenAmount,
                                        @Param("availableBalance") BigDecimal availableBalance,
                                        @Param("version") Long version);

    /**
     * 增加余额
     * 
     * @param accountId 账户ID
     * @param amount 增加金额
     * @return 结果
     */
    public int increaseBalance(@Param("accountId") Long accountId, @Param("amount") BigDecimal amount);

    /**
     * 减少余额
     * 
     * @param accountId 账户ID
     * @param amount 减少金额
     * @return 结果
     */
    public int decreaseBalance(@Param("accountId") Long accountId, @Param("amount") BigDecimal amount);

    /**
     * 冻结资金
     * 
     * @param accountId 账户ID
     * @param amount 冻结金额
     * @return 结果
     */
    public int freezeAmount(@Param("accountId") Long accountId, @Param("amount") BigDecimal amount);

    /**
     * 解冻资金
     * 
     * @param accountId 账户ID
     * @param amount 解冻金额
     * @return 结果
     */
    public int unfreezeAmount(@Param("accountId") Long accountId, @Param("amount") BigDecimal amount);

    /**
     * 删除账户余额
     * 
     * @param balanceId 账户余额主键
     * @return 结果
     */
    public int deleteAccountBalanceByBalanceId(Long balanceId);

    /**
     * 根据账户ID删除账户余额
     * 
     * @param accountId 账户ID
     * @return 结果
     */
    public int deleteAccountBalanceByAccountId(Long accountId);

    /**
     * 批量删除账户余额
     * 
     * @param balanceIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAccountBalanceByBalanceIds(Long[] balanceIds);
}