package com.red.circle.other.infra.database.mongo.service.user.status;

import com.red.circle.other.infra.database.mongo.entity.user.status.OnlineUser;
import com.red.circle.other.infra.database.mongo.dto.query.user.status.OnlineUserListQuery;
import com.red.circle.other.infra.database.mongo.dto.query.user.status.OnlineUserQuery;
import com.red.circle.other.inner.model.cmd.user.OnlineCountQryCmd;
import com.red.circle.other.inner.model.cmd.user.OnlineUserBackQryCmd;
import com.red.circle.other.inner.enums.user.UserOnlineStatusEnum;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 在线用户服务.
 *
 * @author pengliang on 2020/8/14
 */
public interface OnlineUserService {

  /**
   * 验证指定会话中是否存在用户.
   */
  boolean exists(Long sessionId, Long userId);

  /**
   * 获取用户会话ID.
   *
   * @param userId 用户id
   * @return ignore
   */
  String getSessionId(Long userId);

  /**
   * 修改状态和设置会话id.
   *
   * @param userId       用户id
   * @param onlineStatus 在线状态
   * @param sessionId    会话id
   */
  void updateStatusAndSessionId(Long userId, UserOnlineStatusEnum onlineStatus, Long sessionId);

  /**
   * 添加在线用户.
   *
   * @param onlineUser ignore
   */
  void saveOrUpdate(OnlineUser onlineUser);

  /**
   * 获取在线主播推荐.
   *
   * @param excludeUserIds 排除用户id
   * @param size           数量
   * @return uid
   */
//  List<Long> getOnlineFemaleAnchor(List<Long> excludeUserIds, Integer size);

  /**
   * 获取最近没有相遇的在线男性用户.
   *
   * @param excludeUserIds 排除用户id
   * @param size           数量
   * @return uid
   */
//  List<Long> getLatestNotMeetOnlineMale(List<Long> excludeUserIds, Integer size);

  /**
   * 获取最新没有相遇过的在线女性.
   *
   * @param excludeUserIds ignore
   * @return ignore
   */
//  Long getLatestNotMeetOnlineFemaleUserId(List<Long> excludeUserIds);

  /**
   * 获取在线在线用户.
   *
   * @param query 条件
   * @return ignore
   */
  List<OnlineUser> getOnline(OnlineUserQuery query);

  /**
   * 获取dataV统计数据展示.
   *
   * @param query 参数
   * @return dataV
   */
  Long count(OnlineCountQryCmd query);

  /**
   * 获取后台在线在线用户.
   *
   * @param query 条件
   * @return ignore
   */
  List<OnlineUser> listOnlineUser(OnlineUserListQuery query);

  /**
   * 获取用户在线状态.
   *
   * @param userIds 用户id
   * @return 映射
   */
//  Map<Long, UserOnlineStatusEnum> mapUserOnlineStatusByUserIds(Set<Long> userIds);

  /**
   * 获取会话在线用户.
   *
   * @param sessionId    会话id
   * @param lastTimingId 时序id
   * @return 观众信息
   */
  List<OnlineUser> flowSessionOnlineUser(String sessionId, UserOnlineStatusEnum status,
      Long lastTimingId);

  /**
   * 获取前100个在线用户.
   *
   * @param topSize      数量
   * @param inSysOrigins 排除系统来源
   * @return ignore
   */
  List<OnlineUser> listTop(Integer topSize, List<String> inSysOrigins);

  /**
   * 统计回话数量.
   */
  Long countSessionId(Long sessionId);

  /**
   * 移除在线用户.
   */
  void removeByUserId(Long userId);

  /**
   * 获取后台在线在线用户.
   *
   * @param query 条件
   * @return ignore
   */
  List<OnlineUser> getBackOnline(OnlineUserBackQryCmd query);


  /**
   * 获取音频房间top20.
   *
   * @param roomId       房间id
   * @param lastTimingId 时序id
   * @return 观众信息
   */
  List<OnlineUser> flowLanguageHallTop200(Long roomId, Long lastTimingId);

  /**
   * 获取音频房间在线用户
   *
   * @param userIds  用户id
   * @return 观众信息
   */
  List<OnlineUser> userOnlineByUserIds(Set<Long> userIds);

  /**
   * 获取音频房间用户
   *
   * @param roomId       房间id
   * @return 观众信息
   */
  List<OnlineUser> flowLanguageHallByRoomId(Long roomId);

}
