import {
  GetOnlineUsersOptions,
  PresenceOptions,
  RtmChannelType,
  StateItem,
} from './AgoraRtmBase';

/// Generated by terra, DO NOT MODIFY BY HAND.

/**
 * The IRtmPresence class.
 *
 * This class provides the rtm presence methods that can be invoked by your app.
 */
export abstract class IRtmPresence {
  /**
   * To query who joined this channel
   *
   * @param [in] channelName The name of the channel.
   * @param [in] channelType The type of the channel.
   * @param [in] options The query option.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract whoNow(
    channelName: string,
    channelType: RtmChannelType,
    options: PresenceOptions
  ): number;
  /**
   * To query which channels the user joined
   *
   * @param [in] userId The id of the user.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract whereNow(userId: string): number;
  /**
   * Set user state
   *
   * @param [in] channelName The name of the channel.
   * @param [in] channelType The type of the channel.
   * @param [in] items The states item of user.
   * @param [in] count The count of states item.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract setState(
    channelName: string,
    channelType: RtmChannelType,
    items: StateItem[],
    count: number
  ): number;
  /**
   * Delete user state
   *
   * @param [in] channelName The name of the channel.
   * @param [in] channelType The type of the channel.
   * @param [in] keys The keys of state item.
   * @param [in] count The count of keys.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract removeState(
    channelName: string,
    channelType: RtmChannelType,
    keys: string[],
    count: number
  ): number;
  /**
   * Get user state
   *
   * @param [in] channelName The name of the channel.
   * @param [in] channelType The type of the channel.
   * @param [in] userId The id of the user.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract getState(
    channelName: string,
    channelType: RtmChannelType,
    userId: string
  ): number;
  /**
   * To query who joined this channel
   *
   * @param [in] channelName The name of the channel.
   * @param [in] channelType The type of the channel.
   * @param [in] options The query option.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract getOnlineUsers(
    channelName: string,
    channelType: RtmChannelType,
    options: GetOnlineUsersOptions
  ): number;
  /**
   * To query which channels the user joined
   *
   * @param [in] userId The id of the user.
   * @param [out] requestId The related request id of this operation.
   * @return
   * - 0: Success.
   * - < 0: Failure.
   */
  abstract getUserChannels(userId: string): number;
}
