package com.red.circle.other.app.inner.service.material.props;

import com.red.circle.other.inner.enums.material.PropsCommodityType;
import com.red.circle.other.inner.model.cmd.material.DeletePropsCmd;
import com.red.circle.other.inner.model.cmd.material.GivePropsBackpackCmd;
import com.red.circle.other.inner.model.cmd.material.PropsBackpackQry;
import com.red.circle.other.inner.model.cmd.material.ReduceDaysAndUnUseCmd;
import com.red.circle.other.inner.model.dto.material.PropsBackpackDTO;
import com.red.circle.other.inner.model.dto.material.UsePropsDTO;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户道具客户端 服务.
 *
 * @author pengliang on 2023/6/3
 */
public interface PropsBackpackClientService {

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

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

  /**
   * 移除用户道具.
   */
  void deleteProps(DeletePropsCmd cmd);

  /**
   * 保存到背包-批量.
   */
  void saveBatchBackpack(List<PropsBackpackDTO> props);

  /**
   * 保存到背包.
   */
  void saveBackpack(PropsBackpackDTO props);

  /**
   * 赠送道具.
   */
  void giveProps(GivePropsBackpackCmd cmd);

  /**
   * 获取正在使用道具id.
   *
   * @param userId 用户id
   * @return id
   */
  List<PropsBackpackDTO> listNotExpiredUseProps(Long userId);

  /**
   * 获取一组正在使用道具信息-使用道具.
   */
  List<PropsBackpackDTO> listNotExpiredUseProps(Set<Long> userIds);

  /**
   * 获取一组指定用户未过期道具-使用道具.
   */
  Map<Long, List<UsePropsDTO>> mapNotExpiredUseProps(PropsBackpackQry qry);

  /**
   * 获取一组指定用户未过期道具-使用道具.
   */
  List<UsePropsDTO> listNotExpiredUseProps(Long userId, List<PropsCommodityType> propsTypes);

  /**
   * 将一组用户道具到期时间减少指定天数，并且将其卸下.
   */
  void reduceDaysAndUnUse(ReduceDaysAndUnUseCmd cmd);

  List<PropsBackpackDTO> listNotExpiredByType(Long userId, PropsCommodityType type);
}
