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

import com.red.circle.tool.core.func.VoidCallable;
import com.red.circle.other.infra.database.cache.entity.user.InviteUserRedPacketCarouselAwardsCache;
import com.red.circle.other.infra.database.cache.entity.user.InviteUserRedPacketConfigCache;
import java.util.List;

/**
 * 红包邀新缓存.
 *
 * @author pengshigang on 2023/12/13
 */
public interface RedPacketInviteUserCacheService {

  /**
   * 转盘奖项配置信息.
   */
  List<InviteUserRedPacketCarouselAwardsCache> listCarouselAwardsCache(String sysOrigin,
      VoidCallable<List<InviteUserRedPacketCarouselAwardsCache>> orElsePut);

  /**
   * 转盘奖项移除.
   */
  void removeCarouselAwardsCache(String sysOrigin);

  /**
   * 邀新配置配置信息.
   */
  InviteUserRedPacketConfigCache getConfigCache(String sysOrigin,
      VoidCallable<InviteUserRedPacketConfigCache> orElsePut);

  /**
   * 邀新配置移除.
   */
  void removeConfigCache(String sysOrigin);

  /**
   * 获得红包剩余奖项.
   */
  List<InviteUserRedPacketCarouselAwardsCache> getRedPacketAwards(Long redPacketId);

  /**
   * 缓存红包剩余奖项.
   */
  void cacheRedPacketAwards(Long redPacketId,
      List<InviteUserRedPacketCarouselAwardsCache> awardsList);

  /**
   * 获得红包剩余抽奖次数.
   */
  Long getRedPacketLotteryCount(Long redPacketId);

  /**
   * 累加红包剩余抽奖次数.
   */
  void incrRedPacketLotteryCount(Long redPacketId);

  /**
   * 递减红包剩余抽奖次数.
   */
  Long decrRedPacketLotteryCount(Long redPacketId);

  /**
   * 获得今日助力用户.
   * @param userId 助力人.
   * @param day 第几天助力.
   */
  List<Long> getTodayHelpUsers(Long userId, Long day);

  /**
   * 缓存用户今日助力次数.
   * @param userId 助力人.
   * @param day 第几天助力.
   * @param toHelpUserId 被帮助用户
   */
  void cacheTodayHelpUsers(Long userId, Long day, Long toHelpUserId);

  /**
   * 获得回归用户助力.
   * @param userId 助力人.
   */
  List<Long> getReturnUserHelp(Long userId);

  /**
   * 缓存回归用户助力次数.
   * @param userId 助力人.
   * @param toHelpUserId 被帮助用户
   */
  void cacheReturnUserHelp(Long userId, Long toHelpUserId);

  /**
   * 累计大盘抽奖人次.
   */
  Long incrLotteryCount(String sysOrigin);

  /**
   * 重置累计大盘抽奖人次.
   */
  void resetLotteryCount(String sysOrigin);

  /**
   * 查询“立即提现奖励”是否存在.
   */
  Boolean existWithdrawPrizes(String sysOrigin);

  /**
   * 领取“立即提现奖励”.
   */
  void receiveWithdrawPrizes(String sysOrigin);

  /**
   * 重置“立即提现奖励”.
   */
  void resetWithdrawPrizes(String sysOrigin);

}
