package com.spot.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.spot.entity.MemberWallet;

import java.math.BigDecimal;

/**
 * 会员资金钱包服务接口
 *
 * @author jean
 * @date 2026-05-08
 */
public interface MemberWalletService extends IService<MemberWallet> {

    /**
     * 根据会员ID和币种查询钱包
     *
     * @param memberId 会员ID
     * @param coinId   币种标识（如 "USDT"、"BTC"）
     * @return 钱包对象，不存在返回 null
     */
    MemberWallet getByMemberIdAndCoinId(Long memberId, String coinId);

    /**
     * 获取或初始化资金钱包
     * INSERT IGNORE 保证并发安全，钱包不存在时自动创建（余额为0），已存在时直接返回
     *
     * @param memberId 会员ID
     * @param coinId   币种标识
     * @return 钱包对象
     */
    MemberWallet getOrCreateWallet(Long memberId, String coinId);

    /**
     * 扣减可用余额（乐观锁保护，失败后自动重试一次）
     * 内部携带最新版本号执行 SQL：balance >= amount AND version = #{version} AND is_lock = 0
     *
     * @param memberId 会员ID
     * @param coinId   币种标识
     * @param amount   扣减金额
     * @return 更新行数；0 表示余额不足、钱包已锁定或持续并发冲突
     */
    int deductBalance(Long memberId, String coinId, BigDecimal amount);

    /**
     * 增加可用余额
     *
     * @param memberId 会员ID
     * @param coinId   币种标识
     * @param amount   增加金额
     * @return 更新行数；0 表示钱包不存在或已锁定
     */
    int addBalance(Long memberId, String coinId, BigDecimal amount);
}
