package com.red.circle.wallet.infra.database.rds.service.diamond;

import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.mybatis.service.BaseService;
import com.red.circle.wallet.infra.database.rds.entity.diamond.DiamondBalance;
import com.red.circle.wallet.inner.model.cmd.UserDiamondBalanceQryCmd;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户钻石余额表(20230718) 服务类.
 * </p>
 *
 * @author pengshigang on 2023-07-18 16:14
 */
public interface DiamondBalanceService extends BaseService<DiamondBalance> {

  /**
   * 获取我的可用余额.
   *
   * @param userId 用户id
   * @return 余额
   */
  BigDecimal getAvailableBalance(Long userId);

  /**
   * 验证余额是否充足.
   *
   * @param userId          用户id
   * @param consumeQuantity 消费积分
   * @return true 充足，false 不充足
   */
  boolean verifyBalance(Long userId, BigDecimal consumeQuantity);

  /**
   * 累计积分赚取点数.
   *
   * @param sysOrigin 归属系统
   * @param userId    用户id
   * @param quantity  积分数量
   * @return true 成功，false失败
   */
  boolean inrDiamond(SysOriginPlatformEnum sysOrigin, Long userId, BigDecimal quantity);

  /**
   * 递减积分赚取点数.
   *
   * @param sysOrigin 归属系统
   * @param userId    用户id
   * @param quantity  积分数量
   * @return true 成功，false失败
   */
  boolean decrDiamond(SysOriginPlatformEnum sysOrigin, Long userId, BigDecimal quantity);

  /**
   * 分页查询钻石余额
   */
  PageResult<DiamondBalance> pageUserDiamondBalance(UserDiamondBalanceQryCmd query);

  /**
   * 钻石余额.
   * @param userIds 用户id
   */
  Map<Long, BigDecimal> mapBalance(List<Long> userIds);
}
