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


import com.red.circle.other.infra.database.cache.entity.game.burstcrystal.GameBurstCrystalProgressCache;
import java.util.List;
import java.util.function.Function;

/**
 * 爆水晶游戏当天 缓存服务.
 *
 * @author pengliang on 2021/7/1
 */
public interface GameBurstCrystalThatDayCacheService {

  /**
   * 获取当前进行中游戏等级.
   *
   * @param roomId 房间id
   * @param orElse 否则
   * @return 进度
   */
  GameBurstCrystalProgressCache getCurrentProcessing(Long roomId,
      Function<Long, GameBurstCrystalProgressCache> orElse);

  /**
   * 移除当前进度.
   *
   * @param roomId 房间id
   */
  void removeCurrentProcessing(Long roomId);

  /**
   * 累计进度
   *
   * @param progressId 进度id
   * @param quantity   数量
   * @return 已累计
   */
  Long incrProgressRate(Long progressId, Long quantity);

  /**
   * 是否可以预热.
   *
   * @param progressId 进度id
   * @return true 是，false 否
   */
  boolean isPreheat(Long progressId);

  /**
   * 是否已开奖.
   *
   * @param progressId 进度id
   * @return true 是，false 否
   */
  boolean isDraw(Long progressId);

  /**
   * 移除开奖标记.
   *
   * @param progressId 进度id
   */
  void removeDraw(Long progressId);

  /**
   * 是否初始化游戏.
   *
   * @param roomId 房间id
   * @return true 是，false 否
   */
  boolean isInit(Long roomId);

  /**
   * 累计贡献.
   *
   * @param progressId 游戏进度id
   * @param userId     用户id
   * @param quantity   数量
   */
  void incrementContribute(Long progressId, Long userId, double quantity);

  /**
   * 弹出贡献top5.
   *
   * @param progressId 游戏进度id
   */
  List<Long> popContributeTop5(Long progressId);

  /**
   * 弹出贡献top3.
   *
   * @param progressId 游戏进度id
   */
  List<Long> popContributeTop3(Long progressId);

  /**
   * 移除累计贡献.
   *
   * @param progressId 游戏进度id
   */
  void removeContribute(Long progressId);
}
