package com.spot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.spot.entity.MemberWallet;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;

/**
 * 会员资金钱包 Mapper 接口
 *
 * @author jean
 * @date 2026-05-08
 */
@Mapper
public interface MemberWalletMapper extends BaseMapper<MemberWallet> {

    /**
     * 初始化资金钱包（INSERT IGNORE：钱包已存在时静默跳过，并发安全）
     *
     * @param memberId 会员ID
     * @param coinId   币种标识
     * @return 插入行数；0 表示钱包已存在（正常情况）
     */
    int insertOrIgnore(@Param("memberId") Long memberId, @Param("coinId") String coinId);

    /**
     * 扣减可用余额（乐观锁 + 余额下限 + 锁定状态三重校验）
     * WHERE 条件：version = #{version} AND balance >= #{amount} AND is_lock = 0
     *
     * @param memberId 会员ID
     * @param coinId   币种标识
     * @param amount   扣减金额
     * @param version  当前乐观锁版本号
     * @return 更新行数；0 表示版本冲突、余额不足或钱包已锁定
     */
    int deductBalance(@Param("memberId") Long memberId,
                      @Param("coinId") String coinId,
                      @Param("amount") BigDecimal amount,
                      @Param("version") Integer version);

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