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

import com.red.circle.other.inner.model.cmd.material.GiveBadgeCmd;
import com.red.circle.other.inner.model.dto.material.BadgeBackpackDTO;
import com.red.circle.other.inner.model.dto.material.BadgePictureConfigDTO;
import com.red.circle.other.inner.model.dto.material.UseBadgeDTO;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 用户徽章客户端 服务.
 *
 * @author pengliang on 2023/6/3
 */
public interface BadgeBackpackClientService {

  /**
   * 获取用户使用徽章.
   */
  List<UseBadgeDTO> listUseBadge(Long userId, String sysOrigin, Set<Long> wearBadgeId);

  /**
   * 获取用户使用徽章-背包.
   */
  List<BadgeBackpackDTO> listUseBadgeBackpackByUserId(Long userId);

  /**
   * 修改使用的徽章.
   *
   * @param userId   用户id
   * @param badgeIds 徽章id
   */
  void updateUseBadge(Long userId, Set<Long> badgeIds);

  /**
   * 卸下用户全部徽章.
   *
   * @param userId 用户id
   */
  void useOffByUserId(Long userId);

  /**
   * 根据主键标识卸下佩戴的徽章
   *
   * @param ids 主键ID
   */
  void useOffByIds(Set<Long> ids);

  /**
   * 将一组用户徽章到期时间减少指定天数，并且将其卸下.
   *
   * @param userId     用户.
   * @param badgeIds   徽章ids
   * @param reduceDays 将有效时间减少*天.
   */
  void reduceDaysAndUnUse(Long userId, Set<Long> badgeIds, Integer reduceDays);

  /**
   * 激活-永久徽章并佩戴.
   *
   * @param userId  用户id
   * @param badgeId 徽章id
   * @return true 激活成功 ,false 激活失败
   */
  boolean activationPermanentAndUse(Long userId, Long badgeId);

  /**
   * 激活-临时徽章.
   *
   * @param userId  用户id
   * @param badgeId 徽章id
   * @param days    天数
   * @return true 激活成功 ,false 激活失败
   */
  boolean activationTemporaryAndUse(Long userId, Long badgeId, Integer days);

  /**
   * 删除指定成员的指定徽章.
   */
  void deleteBadge(Collection<Long> userIds, Collection<Long> badgeIds);

  /**
   * 保存一批徽章-背包.
   */
  void saveBatchBackpack(List<BadgeBackpackDTO> badges);

  /**
   * 保存徽章-背包.
   */
  void saveBackpack(BadgeBackpackDTO badge);

  /**
   * 获取一组用户正在使用徽章.
   */
  List<BadgeBackpackDTO> listUseNotExpireTimeByUserIds(Set<Long> userIds);

  /**
   * 移除用户徽章.
   */
  void deleteUserBadge(Long userId, Long badgeId);

  void deleteBadge(Long userId, Long badgeId);

  /**
   * 根据主键标识卸下佩戴的徽章.
   */
  void removeWearByIds(Set<Long> ids);

  /**
   * 查询用户徽章数据.
   */
  List<BadgePictureConfigDTO> listBadge(Long userId, String sysOrigin);

  /**
   * 发送货运代理徽章
   */
  void giveBadgePermanent(Long badgeId, Long userId);

  /**
   * 赠送徽章.
   */
  void giveBadge(GiveBadgeCmd cmd);

}
