package com.red.circle.other.inner.endpoint.material.props.api;

import com.red.circle.framework.dto.ResultResponse;
import com.red.circle.other.inner.model.dto.material.props.NobleVipAbility;
import com.red.circle.other.inner.model.dto.material.props.PropsNobleVipAbilityDTO;
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;

/**
 * 贵族vip.
 *
 * @author pengliang on 2023/11/7
 */
public interface PropsNobleVipClientApi {

  String API_PREFIX = "/props/noble-vip/client";

  /**
   * 获取贵族vip能力.
   *
   * @param sourceId 资源id
   */
  @GetMapping("/getAbilityDTO")
  ResultResponse<PropsNobleVipAbilityDTO> getAbilityDTO(@RequestParam("sourceId") Long sourceId);

  /**
   * 获取用户最大VIP 配置信息.
   *
   * @param userId 用户id
   * @return ignore
   */
  @GetMapping("/getUserMaxAbilityDTO")
  ResultResponse<PropsNobleVipAbilityDTO> getUserMaxAbilityDTO(@RequestParam("userId") Long userId);

  /**
   * 获取贵族vip能力.
   */
  @PostMapping("/listAbilityDTO")
  ResultResponse<List<PropsNobleVipAbilityDTO>> listAbilityDTO(@RequestBody Set<Long> sourceIds);

  /**
   * 获取一组指定贵族能力.
   */
  @PostMapping("/mapAbilityDTOByIds")
  ResultResponse<Map<Long, PropsNobleVipAbilityDTO>> mapAbilityDTOByIds(
      @RequestBody Set<Long> sourceIds);

  /**
   * 获取一组指定贵族能力.
   */
  @PostMapping("/mapAbilityByIds")
  ResultResponse<Map<Long, NobleVipAbility>> mapAbilityByIds(
      @RequestBody Set<Long> sourceIds);

  /**
   * 用户是否存在没有过期的贵族道具ID集合.
   *
   * @param userId 用户id
   * @return list
   */
  @GetMapping("/getActualEquityNotExpiredVip")
  ResultResponse<Set<Long>> getActualEquityNotExpired(@RequestParam("userId") Long userId);

  /**
   * 添加贵族实际权益.
   *
   * @param userId     用户id.
   * @param vipPropsId 贵族道具id.
   * @param days       天数.
   */
  @GetMapping("/addActualEquity")
  ResultResponse<Void> addActualEquity(
      @RequestParam("userId") Long userId,
      @RequestParam("vipPropsId") Long vipPropsId,
      @RequestParam("days") Long days
  );

  /**
   * 添加或修改贵族能力.
   */
  @PostMapping("/addOrUpdateAbility")
  ResultResponse<Void> addOrUpdateAbility(@RequestBody PropsNobleVipAbilityDTO dto);

}
