package com.red.circle.other.app.inner.service.user.user;

import com.red.circle.other.inner.model.cmd.user.OnlineCountQryCmd;
import com.red.circle.other.inner.model.cmd.user.OnlineStatusUploadCmd;
import com.red.circle.other.inner.model.cmd.user.OnlineUserBackQryCmd;
import com.red.circle.other.inner.model.dto.user.OnlineUserDTO;
import com.red.circle.other.inner.model.dto.user.PageOnlineUserDTO;
import com.red.circle.other.inner.enums.user.UserOnlineStatusEnum;
import java.util.List;

/**
 * 在线服务.
 *
 * @author pengliang on 2023/6/2
 */
public interface UserOnlineClientService {

  /**
   * 上传在线状态.
   */
  void upload(OnlineStatusUploadCmd cmd);

  /**
   * 获取用户权重.
   */
  Integer getWeights(Long userId);

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

  /**
   * 获取会话id.
   */
  String getSessionId(Long userId);

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

  /**
   * 获取会话在线用户.
   */
  List<OnlineUserDTO> flowSessionOnlineUser(String sessionId, UserOnlineStatusEnum status,
      Long lastTimingId);

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

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

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


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

}
