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

import com.red.circle.other.domain.model.user.NobleAbilityCO;
import com.red.circle.other.inner.enums.material.PropsVipActualEquityEnum;
import com.red.circle.other.infra.database.cache.entity.user.ConsumptionLevelCache;
import com.red.circle.other.infra.database.cache.key.user.UserHashKey;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

/**
 * 用户管理缓存服务.
 *
 * @author pengliang on 2020/9/30
 */
public interface UserCacheService {

  /**
   * 移除用户相关缓存.
   *
   * @param userId 用户id
   */
  void remove(Long userId);

  /**
   * 移除所有用户资料下信息.
   *
   * @param userIds 用户id集合
   */
  void remove(Collection<Long> userIds);

  /**
   * 移除指定key.
   *
   * @param userId 用户id
   * @param keys   keys
   */
  void remove(Long userId, UserHashKey... keys);

  /**
   * 是否购买过糖果.
   *
   * @param userId    用户id
   * @param orElseGet 否则获取
   * @return true购买过 、false未购买
   */
  boolean isPurchasing(Long userId, Function<Long, Boolean> orElseGet);

  /**
   * 缓存是团队成员，并返回结果.
   *
   * @param userId          用户id
   * @param orElseGetAndPut 不存在时触发
   * @return true 是，false 不是
   */
  Boolean cacheTeamMember(Long userId, Function<Long, Boolean> orElseGetAndPut);

  /**
   * 获取用户语言.
   *
   * @param userId          用户id
   * @param orElseGetAndPut put一个新的资料对象并返回
   * @return ignore
   */
  String getLanguage(Long userId, Function<Long, String> orElseGetAndPut);

  /**
   * 获取归属系统.
   */
  String getSysOrigin(Long userId, Function<Long, String> orElseGetAndPut);

  /**
   * 用户消费等级.
   */
  ConsumptionLevelCache getUserConsumptionLevel(Long userId, Function<Long, ConsumptionLevelCache> orElseGet);

  /**
   * 获取用户vip实际权益.
   */
  List<PropsVipActualEquityEnum> getUserActualEquityEnum(Long userId, Function<Long, List<PropsVipActualEquityEnum>> orElseGet);

  /**
   * 获取用户贵族能力.
   */
  List<NobleAbilityCO> getUserNobleAbility(Long userId, Function<Long, List<NobleAbilityCO>> orElseGet);

  /**
   * 移除权益缓存.
   */
  void removeUserActualEquityEnum(Long userId);

  /**
   * 用户svip身份.
   */
  String getSVipIdentity(Long userId, Function<Long, String> orElseGet);

}
