package com.red.circle.other.infra.database.cache.service.other;

import com.red.circle.other.infra.database.cache.entity.game.luckgift.GameLuckyGiftConfigCache;
import com.red.circle.other.infra.database.cache.entity.game.luckgift.GameLuckyGiftInventoryCache;
import com.red.circle.other.infra.database.cache.entity.game.luckgift.LuckyGiftInventoryTemplateCache;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 幸运礼物.
 *
 * @author pengshigang on 2023/6/15
 */
public interface GameLuckyGiftCacheService {

  /**
   * 缓存基础配置.
   *
   * @param cache 基础配置
   */
  void cacheBaseConfig(GameLuckyGiftConfigCache cache);

  /**
   * 获得基础配置.
   *
   * @return 基础配置
   */
  GameLuckyGiftConfigCache getBaseConfig();

  /**
   * 清除基础配置.
   */
  void removeBaseConfig();

  /**
   * 缓存倍数库存基础配置模版.
   *
   * @param standardId 规格ID
   * @param quantity   数量
   * @param cache      数据
   */
  void cacheInventoryTemplate(Long standardId, Integer quantity,
      LuckyGiftInventoryTemplateCache cache);

  /**
   * 获得倍数库存基础配置模版.
   *
   * @param standardId 规格ID
   * @param quantity   数量
   * @return 基础配置
   */
  LuckyGiftInventoryTemplateCache getInventoryTemplate(Long standardId, Integer quantity);

  /**
   * 移除倍数库存基础配置模版.
   *
   * @param standardId 规格ID
   */
  void removeInventoryTemplate(Long standardId);

  /**
   * 获得剩余库存倍数签集合
   *
   * @param giftId    礼物ID
   * @param quantity  数量
   * @param multiples 倍数集合
   * @return 剩余库存倍数签集合
   */
  Map<Integer, Integer> mapRemainInventory(Long giftId, Integer quantity, Set<Integer> multiples);

  /**
   * 初始化礼物库存倍数签
   *
   * @param giftId   礼物ID
   * @param quantity 数量
   * @param caches   完整的库存数据
   */
  List<GameLuckyGiftInventoryCache> initRemainInventory(Long giftId, Integer quantity,
      List<GameLuckyGiftInventoryCache> caches);

  /**
   * 移除礼物签库存.
   *
   * @param giftId     礼物ID
   * @param standardId 规格ID
   */
  void removeRemainingInventory(Long giftId, Long standardId);

  /**
   * 移除礼物签库存.
   *
   * @param giftIds    礼物ID
   * @param quantity   数量
   * @param standardId 规格ID
   */
  void removeRemainingInventory(Set<Long> giftIds, Integer quantity, Long standardId);

  /**
   * 递减礼物库存倍数签.
   *
   * @param giftId   礼物ID
   * @param quantity 数量
   * @param multiple 倍数
   */
  Long decrInventoryQuantity(Long giftId, Integer quantity, Integer multiple);

  /**
   * 累计送礼物次数.
   *
   * @param userId   用户ID.
   * @param giftId   礼物ID.
   * @param quantity 数量.
   */
  Integer incrGiftsCount(Long userId, Long giftId, Integer quantity);

  /**
   * 获得累计送礼物次数.
   *
   * @param userId   用户ID.
   * @param giftId   礼物ID.
   * @param quantity 数量.
   * @return 累计送礼次数
   */
  Integer getGiftsCount(Long userId, Long giftId, Integer quantity);

  /**
   * 移除用户累计送礼次数.
   *
   * @param userId   用户ID.
   * @param giftId   礼物ID.
   * @param quantity 数量.
   */
  void removeGiftsCount(Long userId, Long giftId, Integer quantity);

  /**
   * 重置用户累计送礼次数.
   *
   * @param userId   用户ID.
   * @param giftId   礼物ID.
   * @param quantity 数量.
   */
  Integer resetGiftsCount(Long userId, Long giftId, Integer quantity);

  /**
   * 累加用户连击不赚钱次数.
   *
   * @param userId 用户ID
   */
  Integer incrComboLossCount(Long userId);

  /**
   * 重置用户连击不赚钱次数.
   *
   * @param userId 用户ID
   */
  void removeComboLossCount(Long userId);

  /**
   * 用户连击次数.
   */
  Integer incrComboCount(Long userId, Long giftId, Integer quantity);

  /**
   * 重置用户连击次数.
   */
  Integer resetComboCount(Long userId, Long giftId, Integer quantity);

}
