package com.red.circle.other.domain.gateway.user;

import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.domain.enums.VipAbilityType;
import com.red.circle.other.domain.enums.VipBenefitType;
import java.math.BigDecimal;
import com.red.circle.other.domain.model.user.NobleAbilityCO;
import com.red.circle.other.inner.enums.material.PropsVipActualEquityEnum;
import com.red.circle.tool.core.tuple.ImmutableKeyValuePair;
import com.red.circle.other.domain.model.user.UserConsumptionLevel;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.inner.model.cmd.user.UserProfileListQryCmd;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户资料仓库.
 *
 * @author pengliang on 2021/5/26
 */
public interface UserProfileGateway {

  /**
   * 根据账号获取用户资料.
   */
  UserProfile getByAccount(String sysOrigin, String account);

  /**
   * 根据账号获取用户资料.
   */
  UserProfile getByAccountNew(String sysOrigin, String account);

  /**
   * 分页查询用户信息
   */
  PageResult<UserProfile> pageListQuery(UserProfileListQryCmd query);

  /**
   * 获取账号信息.
   */
  List<UserProfile> getByAccount(String account);

  /**
   * 根据用户id获取用户信息.
   */
  UserProfile getByUserId(Long userId);

  /**
   * 用户使用语言.
   */
  String getLanguage(Long userId);

  /**
   * 用户使用语言.
   */
  Map<Long, String> mapLanguage(Set<Long> userIds);

  /**
   * 归属系统.
   */
  String getSysOrigin(Long userId);

  /**
   * 获取一组指定用户信息.
   */
  List<UserProfile> listByUserIds(Set<Long> userIds);

  /**
   * 查询同系统指定account一组用户.
   */
  List<UserProfile> listByAccount(String sysOrigin, Set<String> accounts);

  /**
   * 获取一组指定用户信息映射.
   */
  Map<Long, UserProfile> mapByUserIds(Set<Long> userIds);

  /**
   * 修改用户资料.
   */
  void updateSelectiveById(UserProfile userProfile);

  /**
   * 修改昵称.
   */
  void updateUserNickname(Long id, String nickname);

  /**
   * Ka修改昵称, 批量(key=userId,value=nickname).
   */
  void updateUserNicknameBatch(Collection<ImmutableKeyValuePair<Long, String>> keyValuePairs);

  /**
   * 修改头像.
   */
  void updateUserAvatar(Long id, String avatar);

  /**
   * 修改头像-批量.
   */
  void updateUserAvatarBatch(Collection<Long> ids, String avatar);

  /**
   * 切换用户使用的道具.
   */
  void switchUseProps(Long userId, Long propsId);

  /**
   * 移除使用道具.
   */
  void removeUseProps(Long userId, String propsType);

  /**
   * 修改用户佩戴的徽章.
   */
  void updateUserWearBadge(Long id, String sysOrigin, Collection<Long> wearBadgeIds);

  /**
   * 移除指定用户全部佩戴的徽章.
   */
  void removeUserAllWearBadge(Long id, String sysOrigin);

  /**
   * 移除缓存.
   */
  void removeCacheAll(Long id);

  /**
   * 移除用户缓存.
   */
  void removeCacheAll(Collection<Long> ids);

  /**
   * 移除缓存.
   */
  void removeCache(Long id);

  /**
   * 是否是团队成员.
   */
  boolean checkTeamMember(Long userId);

  /**
   * 获取用户消费等级.
   */
  UserConsumptionLevel getUserConsumptionLevel(SysOriginPlatformEnum sysOrigin, Long userId);

  Map<Long, UserConsumptionLevel> getUserConsumptionLevel(SysOriginPlatformEnum sysOrigin, Set<Long> userIds);

  /**
   * 检测是否是好友关系.
   *
   * @param userId       用户id
   * @param friendUserId 朋友id
   * @return true 是，false 不是
   */
  boolean checkFriend(Long userId, Long friendUserId);

  /**
   * 检测是否是关注关系.
   *
   * @param userId       用户id
   * @param followUserId 关注用户id
   * @return true 是，false 不是
   */
  boolean checkFollow(Long userId, Long followUserId);

  /**
   * 是否购买过糖果.
   */
  boolean isPurchasing(Long userId);

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

  /**
   * 获取用户贵族能力.
   *
   * @param userId 用户ID
   * @return 贵族能力信息
   */
  List<NobleAbilityCO> getUserNobleAbility(Long userId);

  /**
   * 修改用户签名为空.
   */
  void updateBatchUserAutographEmpty(Collection<Long> ids);

  /**
   * 获取用户VIP指定权益值.
   * 非VIP返回对应类型的默认值.
   */
  BigDecimal getUserVipBenefit(Long userId, VipBenefitType benefitType);

  /**
   * 判断用户是否拥有指定VIP权限.
   * 非VIP或等级不足返回 false.
   */
  boolean getUserVipAbility(Long userId, VipAbilityType abilityType);

  /**
   * 批量返回具有指定VIP权限的用户ID集合.
   */
  Set<Long> filterUsersByVipAbility(Set<Long> userIds, VipAbilityType abilityType);

  /**
   * 根据 userId 查询用户当前 VIP 等级
   *
   * @param userId 用户ID
   * @return VIP 等级标识（VISCOUNT ~ EMPEROR），无 VIP 返回 null
   */
  String getUserVipName(Long userId);
}
