package com.red.circle.other.infra.database.mongo.service.live;

import com.red.circle.other.infra.database.mongo.entity.live.RoomCounter;
import com.red.circle.other.infra.database.mongo.entity.live.RoomProfile;
import com.red.circle.other.infra.database.mongo.entity.live.RoomProfileManager;
import com.red.circle.other.infra.database.mongo.entity.live.RoomSetting;
import com.red.circle.other.inner.model.cmd.room.RoomProfileOpsQryCmd;
import com.red.circle.other.inner.model.dto.material.UseBadgeDTO;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 房间资料信息.
 *
 * @author authName on 2022/2/11
 */
public interface RoomProfileManagerService {

  String getRoomAccount(Long roomId);

  /**
   * 用户是否存在房间.
   */
  boolean existsUserRoom(Long userId);

  /**
   * 创建房间.
   */
  void create(RoomProfileManager profile);

  /**
   * 获取房主id.
   */
  Long getHomeownerId(Long roomId);

  /**
   * 获取房间Id.
   */
  Long getRoomId(Long userId);

  /**
   * 获取房间归属系统.
   */
  String getRoomSysOrigin(Long roomId);

  /**
   * 房间资料信息.
   */
  RoomProfile getProfileById(Long roomId);

  /**
   * 房间资料信息.
   */
  RoomProfile getProfileByUserId(Long userId);

  /**
   * 获取房间信息.
   */
  RoomProfileManager getById(Long roomId);

  /**
   * 根据用户id获取房间信息.
   */
  RoomProfileManager getByUserId(Long userId);

  /**
   * 根据房间account获取房间信息.
   */
  RoomProfileManager getByRoomAccount(String account);

  /**
   * 根据id集合获取房间资料信息-map.
   */
  Map<Long, RoomProfileManager> mapByRoomIds(Set<Long> roomIds);

  /**
   * 根据id集合获取房间资料信息-map.
   */
  Map<Long, RoomProfile> mapProfileByRoomIds(Set<Long> roomIds);

  /**
   * 根据用户id集合获取房间资料信息-map.
   */
  Map<Long, RoomProfile> mapProfileByUserIds(Set<Long> userIds);

  /**
   * 根据id集合获取房间资料信息-list.
   */
  List<RoomProfileManager> listByRoomIds(Set<Long> roomIds);

  /**
   * 根据id集合获取房间资料信息-list.
   */
  List<RoomProfile> listProfileByRoomIds(Set<Long> roomIds);

  /**
   * 根据用户id集合获取房间资料信息-list.
   */
  List<RoomProfile> listProfileByUserIds(Set<Long> userIds);

  /**
   * 获取平台房间信息.
   */
  List<RoomProfileManager> listSelectiveLimit100(String sysOrigin, String countryCode,
      List<Long> excludeIds);

  /**
   * 获取平台房间信息.
   */
  List<RoomProfileManager> listSelectiveLimit100(String sysOrigin, List<String> countryCodes,
      List<Long> excludeIds);

  /**
   * 今天创建的房间.
   */
  List<RoomProfileManager> listNowCreateRoom(String sysOrigin, Integer limit);

  /**
   * 房间列表查询.
   */
  List<RoomProfileManager> listOps(RoomProfileOpsQryCmd query);

  /**
   * 获取房间设置.
   */
  RoomSetting getRoomSettingById(Long roomId);

  /**
   * 获取房间设置.
   */
  RoomSetting getRoomSettingByUserId(Long userId);

  /**
   * 获取房间计数器.
   */
  RoomCounter getRoomCounterById(Long roomId);

  /**
   * 获取房间计数器.
   */
  RoomCounter getRoomCounterByUserId(Long userId);

  /**
   * 是否存在密码.
   */
  boolean existsSettingPassword(Long roomId);

  /**
   * 累计计数管理员&成员.
   */
  void incrCounterAdminAndMember(Long roomId);

  /**
   * 累计计数管理员.
   */
  void incrCounterAdmin(Long roomId);

  /**
   * 累计计数成员.
   */
  void incrCounterMember(Long roomId);

  /**
   * 减少计数管理员&成员.
   */
  void decrCounterAdminAndMember(Long roomId);

  /**
   * 减少计数管理员.
   */
  void decrCounterAdmin(Long roomId);

  /**
   * 减少计数成员.
   */
  void decrCounterMember(Long roomId);

  /**
   * 修改资料.
   */
  Boolean updateSelectiveProfile(RoomProfile roomProfile);

  /**
   * 修改设置信息.
   */
  void updateSelectiveSetting(Long roomId, RoomSetting roomSetting);

  /**
   * 修改设置信息.
   */
  void updateSelectiveSettingByUserId(Long userId, RoomSetting roomSetting);

  /**
   * 修改房间密码.
   */
  void updatePassword(Long roomId, String password);

  /**
   * 修改用户房间封面图.
   */
  void updateRoomCoverByUserId(Long userId, String cover);

  /**
   * 修改用户房间封面图.
   */
  void updateRoomCoverByIds(List<Long> ids, String cover);

  /**
   * 修改房间公告.
   */
  void updateRoomDescByIds(List<Long> ids, String roomDesc);

  /**
   * 修改房间归属国家.
   */
  void updateUserCountry(Long userId, String countryCode, String countryName);

  /**
   * 使用语言.
   */
  void updateUserLangCode(Long userId, String langCode);

  /**
   * 添加装饰徽章.
   */
  void addBadge(Long roomId, UseBadgeDTO useBadge);

  /**
   * 修改用户佩戴的徽章.
   */
  void updateUseBadgesOverlay(Long roomId, List<UseBadgeDTO> wearBadges);

  /**
   * 修改自定义参数.
   */
  void upsertCustomizeSetting(Long roomId, Map<String, String> customizeSetting);

  /**
   * 注销房间.
   */
  void delUserRoom(Long userId);

  /**
   * 修改房间最后活跃时间
   */
  void updateRoomActiveTime(Long roomId);
}
