package com.red.circle.other.app.inner.service.user.region;

import com.red.circle.other.inner.model.dto.user.SysExchangeGoldTipDTO;
import com.red.circle.other.inner.model.dto.user.reigon.HostApplyQuitTeamCheckDTO;
import com.red.circle.other.inner.model.dto.user.reigon.RegionConfigDTO;
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/6/11
 */
public interface UserRegionClientService {

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

  /**
   * 获取用户区域编号.
   */
  Map<Long, String> mapRegionCode(Set<Long> userIds);

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

  /**
   * 获取用户区域.
   */
  UserRegionDTO getRegion(Long userId);

  /**
   * 获得区域银行钱包兑换金币比例列表.
   */
  List<SysExchangeGoldTipDTO> listRegionExchangeGoldTip(Long userId, Boolean isCoinSeller);

  /**
   * 获得获得区域银行钱包工资钻石兑换金币比例列表.
   */
  List<SysExchangeGoldTipDTO> listRegionExchangeDiamondGoldTip(Long userId);

  /**
   * 获得获得区域银行钱包工资钻石提现和美金的兑换比例列表.
   */
  List<SysExchangeGoldTipDTO> listRegionWithdrawTip(Long userId);

  /**
   * 获取用户区域配置.
   */
  RegionConfigDTO getSysRegionConfigByUserId(Long userId);

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

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

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

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

  /**
   * 主播申请退出团队校验金额.
   */
  HostApplyQuitTeamCheckDTO getHostApplyQuitTeamCheckByUserId(Long userId);

  /**
   * 区域申请退出团队校验金额.
   */
  HostApplyQuitTeamCheckDTO getHostApplyQuitTeamCheckByRegionId(String regionId);

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

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

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

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

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

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

  /**
   * 获取系统分区缓存
   */
  List<RegionConfigDTO> listSysRegionConfig(String sysOrigin);

}
