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

import com.red.circle.other.domain.model.user.ability.RegionConfig;
import com.red.circle.other.inner.model.dto.user.reigon.HostApplyQuitTeamCheckDTO;
import com.red.circle.other.inner.model.dto.user.reigon.SysRegionAssistProbabilityDTO;
import com.red.circle.other.inner.model.dto.user.reigon.UserRegionDTO;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.tuple.ImmutablePair;

/**
 * 用户区域.
 *
 * @author pengliang on 2023/12/17
 */
public interface UserRegionGateway {

  /**
   * key=用户id, value=区域code 获取一组区域code.
   */
  Map<Long, String> mapRegionCode(Set<Long> userIds);

  /**
   * 验证用户是否是在同一个区域.
   *
   * @return true 是， false 否
   */
  boolean checkEqRegion(Long userId, Long compareUserId);

  /**
   * 获取用户区域编号.
   */
  String getRegionCode(Long userId);

  /**
   * 获取用户区域ID.
   */
  String getRegionId(Long userId);

  /**
   * 匹配用户分区.
   */
  UserRegionDTO getUserRegion(Long userId);

  /**
   * 检查两个用户在业务分区是否一致.
   * <p>在一些特效情况下， 运营对当前区域进行整合， 如： 阿拉伯+土耳其可以互相访问</p>
   *
   * @return true 相同业务区域，false 不同业务区域
   */
  boolean checkBusinessRegion(Long userId, Long compareUserId);

  /**
   * 是否普通用户
   * true: team_member没有用户信息
   */
  boolean isOrdinaryUser(Long userId);

  /**
   * 检查两个code在业务分区是否一致.
   * <p>在一些特效情况下， 运营对当前区域进行整合， 如： 阿拉伯+土耳其可以互相访问</p>
   *
   * @return true 相同业务区域，false 不同业务区域
   */
  boolean checkBusinessRegionCode(String regionOne, String regionTwo);

  /**
   * 区域是否开启了每日自动支付团队工资.
   *
   * @return true 是，false 否
   */
  boolean checkOpenDailyAutoSalary(String regionId, String sysOrigin);

  /**
   * 剩余目标兑换比例.
   */
  BigDecimal getResidueTargetExchangeRatio(String regionId);

  /**
   * 接收他人礼物获得金币比例.
   */
  BigDecimal getAssistGiftToOtherGoldRatio(String regionId);

  /**
   * 接收自己礼物获得金币比例.
   */
  BigDecimal getAssistGiftToOwnGoldRatio(String regionId);

  BigDecimal getAssistGiftToOtherGoldRatioAgency(String regionId);

  BigDecimal getAssistGiftToOwnGoldRatioAgency(String regionId);

  /**
   * 接收他人礼物获得金币比例-普通用户
   */
  BigDecimal getAssistGiftToOtherGoldRatioNormal(String regionId);

  /**
   * 接收自己礼物获得金币比例-普通用户
   */
  BigDecimal getAssistGiftToOwnGoldRatioNormal(String regionId);

  /**
   * 赠送CP礼物返还金币比例
   */
  BigDecimal getAssistCpGiftGoldRatio(String regionId);

  BigDecimal getGiftToOtherDiamondRatio(String regionId,Boolean isHost);

  /**
   * 接收礼物获得目标比例
   */
  BigDecimal getAssistGiftTargetRatio(String regionId);

  /**
   * 房间贡献活动奖励比例.
   */
  ImmutablePair<String, BigDecimal> getAssistRoomContributionActivityRatio(Long userId);

  /**
   * 房间贡献活动奖励比例.
   */
  SysRegionAssistProbabilityDTO getAssistRoomContributionActivityRatioDTO(Long userId);

  /**
   * 获取一批用户区域配置.
   *
   * @param sysOrigin 可选，不传递内部识别用户系统
   * @param userIds   被查询的用户
   */
  Map<Long, RegionConfig> mapUserRegionConfig(String sysOrigin, Set<Long> userIds);

  /**
   * 获取用户区域.
   */
  RegionConfig getRegionConfigByUserId(Long userId);

  /**
   * 获取系统区域.
   */
  List<RegionConfig> listRegionConfigBySysOrigin(String sysOrigin);

  HostApplyQuitTeamCheckDTO getHostApplyQuitTeamCheckByUserId(Long userId);

  HostApplyQuitTeamCheckDTO getHostApplyQuitTeamCheckByRegionId(String regionId);


  /**
   *批量获取用户所在区域
   * @param userIdSet
   * @return
   */
  List<UserRegionDTO> mapRegionIdByUserIds(Set<Long> userIdSet);
}
