//
//  MobileRTCMeetingService+User.h
//  MobileRTC
//
//  Created by Zoom Video Communications on 2018/6/6.
//  Copyright © 2019 Zoom Video Communications, Inc. All rights reserved.
//

#import <MobileRTC/MobileRTC.h>

@interface MobileRTCMeetingService (User)

/*!
 @brief Set to change user's screen name in meeting.
 @param inputName The screen name displayed in meeting.
 @param userId User ID.
 @return YES means that the method is called successfully, otherwise not.
 @warning Normal user can change his own screen name, while the host/co-host can change all attendees' names. 
 */
- (BOOL)changeName:(nonnull NSString*)inputName withUserID:(NSUInteger)userId;

/*!
 @brief Get all the users in the meeting.
 @return user id array, each user id is a NSNumber object.
 @warning For Webinar Meeting, returned list does not include Attendee User
 */
- (nullable NSArray <NSNumber *> *)getInMeetingUserList;

/*!
 @brief Get all the attendees in the webinar.
 @return user id array, each Attendee id is a NSNumber object.
 @warning Only webinar meeting host/co-host/panelist can run the function.
 */
- (nullable NSArray <NSNumber *> *)getWebinarAttendeeList;
/*!
 @brief Get user information in the meeting.
 @param userId In-meeting user ID.
 @return User information.
 @warning webinar attendee can not call the function, please use: [attendeeInfoByID:].
 */
- (nullable MobileRTCMeetingUserInfo*)userInfoByID:(NSUInteger)userId;

/*!
 @brief Get attendees' information in the webinar.
 @param userId attendee's ID in meeting.
 @return attendee info, a MobileRTCMeetingWebinarAttendeeInfo object.
 @warning webinar meeting host/co-host/panelist can get other attendee info.
 @warning webinar attendee can only get their own attendee info.
 */
- (nullable MobileRTCMeetingWebinarAttendeeInfo*)attendeeInfoByID:(NSUInteger)userId;

/*!
 @brief Assign a user as the host in meeting.
 @param userId The ID of user who is specified as host in meeting.
 @return YES means that the method is called successfully, otherwise not.
 @warning only meeting host can run this function, and userId should not be myself.
 */
- (BOOL)makeHost:(NSUInteger)userId;

/*!
 @brief Remove a user from the meeting.
 @param userId The ID of user to be removed from the meeting.
 @return YES means that the method is called successfully, otherwise not.
 @warning The method is available only for the host/co-host, and the host/co-host can not remove himself.
 */
- (BOOL)removeUser:(NSUInteger)userId;

/*!
 @brief Get the ID of the current user in the meeting.
 @return The ID of the current user.
 */
- (NSUInteger)myselfUserID;

/*!
 @brief Get the ID of the active user in the meeting.
 @return Active user ID.
 */
- (NSUInteger)activeUserID;

/*!
 @brief Get the ID of user who is sharing in the meeting.
 @return The ID of user who is sharing in the meeting.
 */
- (NSUInteger)activeShareUserID;

/*!
 @brief Judge if the two IDs from different sessions are of the same user.
 @param user1 One user ID in meeting
 @param user2 Another user ID in meeting
 @return YES means the same user.
 */
- (BOOL)isSameUser:(NSUInteger)user1 compareTo:(NSUInteger)user2;

/*!
 @brief Query if the user is host.
 @param userID The ID of user.
 @return YES means that the user is the host, otherwise not.
 */
- (BOOL)isHostUser:(NSUInteger)userID;

/*!
 @brief Query if the ID is the current user's.  
 @param userID The ID of user to be checked.
 @return TRUE means user himself. FALSE not.
 */
- (BOOL)isMyself:(NSUInteger)userID;

/*!
 @brief Query if the user join meeting from H323.
 @param userID The ID of user.
 @return TRUE means user join meeting from H323. FALSE not.
 */
- (BOOL)isH323User:(NSUInteger)userID;

/*!
 @brief Raise hand of the current user.
 @return YES means that the method is called successfully, otherwise not.
 */
- (BOOL)raiseMyHand;
/*!
 @brief Put hands down of the current user.
 @return YES means that the method is called successfully, otherwise not.
 @warning Only meeting host/cohost can run the function when in meeting.
 */
- (BOOL)lowerHand:(NSUInteger)userId;

/*!
 @brief Set to put all users' hands down.
 @param isWebinarAttendee YES indicates to lower all hands for webinar attendee. 
 @return YES means that the method is called successfully, otherwise not.
 @@warning Only meeting host/cohost can run the function when in meeting.
 */
- (BOOL)lowerAllHand:(BOOL)isWebinarAttendee;

/*!
 @brief Query if the current user can claim to be a host
 @return YES means that the current user can claim to be a host, otherwise not.
 */
- (BOOL)canClaimhost;

/*!
 @brief Reclaim the role of the host.
 @return YES means that the current user can claim to be a host, otherwise not.
 */
- (BOOL)reclaimHost;

/*!
 @brief Set to claim to be a host by host key.
 @param hostKey Host key.
 @return YES means that the method is called successfully, otherwise not.
 */
- (BOOL)claimHostWithHostKey:(nonnull NSString*)hostKey;

/*!
 @brief Assign a user as co-host in meeting.
 @return YES means that the method is called successfully, otherwise not.
 @warning The co-host cannot be assigned as co-host by himself. And the user should have the power to assign the role.
 */
- (BOOL)assignCohost:(NSUInteger)userID;

/*!
 @brief Revoke co-host role of another user in meeting.
 @return YES means that the method is called successfully, otherwise not.
 @warning Only meeting host can run the function.
 */
- (BOOL)revokeCoHost:(NSUInteger)userID;

/*!
 @brief Query if the user can be assigned as co-host in meeting.
 @return YES means that the method is called successfully, otherwise not.
 */
- (BOOL)canBeCoHost:(NSUInteger)userID;

/*!
@brief Determine whether the user has started a live stream.
@return YES indicates that the specified user has started a raw live stream, otherwise NO.
 */
- (BOOL)isRawLiveStreaming:(NSUInteger)userID;

/*!
@brief Determine whether the user has raw live stream privilege.
@return YES indicates that the specified user has raw live stream privilege, otherwise false NO.
 */
- (BOOL)hasRawLiveStreamPrivilege:(NSUInteger)userID;

@end