package com.red.circle.other.inner.endpoint.user.region.api;

import com.red.circle.framework.dto.ResultResponse;
import com.red.circle.other.inner.model.cmd.user.UserRegionConfigMapCmd;
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.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 用户区域服务.
 *
 * @author pengliang on 2023/6/11
 */
public interface UserRegionClientApi {

  String API_PREFIX = "/user-region/client";

  /**
   * 获取用户区域编号.
   */
  @GetMapping("/getRegionCode")
  ResultResponse<String> getRegionCode(@RequestParam("userId") Long userId);

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

  /**
   * 获取用户区域id.
   */
  @GetMapping("/getRegionId")
  ResultResponse<String> getRegionId(@RequestParam("userId") Long userId);

  /**
   * 获取用户区域.
   */
  @GetMapping("/getRegion")
  ResultResponse<UserRegionDTO> getRegion(@RequestParam("userId") Long userId);

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

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

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

  /**
   * 获取用户区域配置.
   */
  @GetMapping("/getSysRegionConfigByUserId")
  ResultResponse<RegionConfigDTO> getSysRegionConfigByUserId(
      @RequestParam("userId") Long userId);

  /**
   * 验证用户是否是在同一个区域.
   */
  @GetMapping("/checkEqRegion")
  ResultResponse<Boolean> checkEqRegion(
      @RequestParam("userId") Long userId,
      @RequestParam("compareUserId") Long compareUserId
  );

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

  /**
   * 检查两个code业务区域是否一致.
   * <p>扩展：checkBusinessRegion </p>
   *
   * @return true 相同业务区域，false 不同业务区域
   */
  @GetMapping("/checkBusinessRegionCode")
  ResultResponse<Boolean> checkBusinessRegionCode(
      @RequestParam("code") String code,
      @RequestParam("compareCode") String compareCode
  );

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

  /**
   * 主播申请退出团队校验金额.
   */
  @GetMapping("/getHostApplyQuitTeamCheckByUserId")
  ResultResponse<HostApplyQuitTeamCheckDTO> getHostApplyQuitTeamCheckByUserId(
      @RequestParam("userId") Long userId);

  /**
   * 区域申请退出团队校验金额.
   */
  @GetMapping("/getHostApplyQuitTeamCheckByRegionId")
  ResultResponse<HostApplyQuitTeamCheckDTO> getHostApplyQuitTeamCheckByRegionId(
      @RequestParam("regionId") String regionId);

  /**
   * 获取房间贡献活动奖励比例.
   */
  @GetMapping("/getAssistRoomContributionRatio")
  ResultResponse<SysRegionAssistProbabilityDTO> getAssistRoomContributionRatio(
      @RequestParam("userId") Long userId);

  /**
   * 剩余目标兑换比例.
   */
  @GetMapping("/getResidueTargetExchangeRatio")
  ResultResponse<BigDecimal> getResidueTargetExchangeRatio(
      @RequestParam("regionId") String regionId);


  /**
   * 接收他人礼物获得金币比例.
   */
  @GetMapping("/getAssistGiftToOtherGoldRatio")
  ResultResponse<BigDecimal> getAssistGiftToOtherGoldRatio(
      @RequestParam("regionId") String regionId);

  /**
   * 接收自己礼物获得金币比例.
   */
  @GetMapping("/getAssistGiftToOwnGoldRatio")
  ResultResponse<BigDecimal> getAssistGiftToOwnGoldRatio(@RequestParam("regionId") String regionId);

  /**
   * 获取一批用户区域.
   */
  @PostMapping("/mapUserRegionConfig")
  ResultResponse<Map<Long, RegionConfigDTO>> mapUserRegionConfig(
      @RequestBody UserRegionConfigMapCmd cmd);

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

}
