using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Authentication;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Security;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.SyncPlay;
namespace MediaBrowser.Controller.Session
{
///
/// Interface ISessionManager.
///
public interface ISessionManager
{
///
/// Occurs when [playback start].
///
event EventHandler PlaybackStart;
///
/// Occurs when [playback progress].
///
event EventHandler PlaybackProgress;
///
/// Occurs when [playback stopped].
///
event EventHandler PlaybackStopped;
///
/// Occurs when [session started].
///
event EventHandler SessionStarted;
///
/// Occurs when [session ended].
///
event EventHandler SessionEnded;
event EventHandler SessionActivity;
///
/// Occurs when [capabilities changed].
///
event EventHandler CapabilitiesChanged;
///
/// Occurs when [authentication failed].
///
event EventHandler> AuthenticationFailed;
///
/// Occurs when [authentication succeeded].
///
event EventHandler> AuthenticationSucceeded;
///
/// Gets the sessions.
///
/// The sessions.
IEnumerable Sessions { get; }
///
/// Logs the user activity.
///
/// Type of the client.
/// The app version.
/// The device id.
/// Name of the device.
/// The remote end point.
/// The user.
SessionInfo LogSessionActivity(string appName, string appVersion, string deviceId, string deviceName, string remoteEndPoint, Jellyfin.Data.Entities.User user);
void UpdateDeviceName(string sessionId, string reportedDeviceName);
///
/// Used to report that playback has started for an item.
///
/// The info.
/// Task.
Task OnPlaybackStart(PlaybackStartInfo info);
///
/// Used to report playback progress for an item.
///
/// The info.
/// Task.
///
Task OnPlaybackProgress(PlaybackProgressInfo info);
Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated);
///
/// Used to report that playback has ended for an item.
///
/// The info.
/// Task.
///
Task OnPlaybackStopped(PlaybackStopInfo info);
///
/// Reports the session ended.
///
/// The session identifier.
/// Task.
void ReportSessionEnded(string sessionId);
///
/// Sends the general command.
///
/// The controlling session identifier.
/// The session identifier.
/// The command.
/// The cancellation token.
/// Task.
Task SendGeneralCommand(string controllingSessionId, string sessionId, GeneralCommand command, CancellationToken cancellationToken);
///
/// Sends the message command.
///
/// The controlling session identifier.
/// The session id.
/// The command.
/// The cancellation token.
/// Task.
Task SendMessageCommand(string controllingSessionId, string sessionId, MessageCommand command, CancellationToken cancellationToken);
///
/// Sends the play command.
///
/// The controlling session identifier.
/// The session id.
/// The command.
/// The cancellation token.
/// Task.
Task SendPlayCommand(string controllingSessionId, string sessionId, PlayRequest command, CancellationToken cancellationToken);
///
/// Sends the SyncPlayCommand.
///
/// The session id.
/// The command.
/// The cancellation token.
/// Task.
Task SendSyncPlayCommand(string sessionId, SendCommand command, CancellationToken cancellationToken);
///
/// Sends the SyncPlayGroupUpdate.
///
/// The session id.
/// The group update.
/// The cancellation token.
/// Task.
Task SendSyncPlayGroupUpdate(string sessionId, GroupUpdate command, CancellationToken cancellationToken);
///
/// Sends the browse command.
///
/// The controlling session identifier.
/// The session id.
/// The command.
/// The cancellation token.
/// Task.
Task SendBrowseCommand(string controllingSessionId, string sessionId, BrowseRequest command, CancellationToken cancellationToken);
///
/// Sends the playstate command.
///
/// The controlling session identifier.
/// The session id.
/// The command.
/// The cancellation token.
/// Task.
Task SendPlaystateCommand(string controllingSessionId, string sessionId, PlaystateRequest command, CancellationToken cancellationToken);
///
/// Sends the message to admin sessions.
///
///
/// The name.
/// The data.
/// The cancellation token.
/// Task.
Task SendMessageToAdminSessions(string name, T data, CancellationToken cancellationToken);
///
/// Sends the message to user sessions.
///
///
/// Task.
Task SendMessageToUserSessions(List userIds, string name, T data, CancellationToken cancellationToken);
Task SendMessageToUserSessions(List userIds, string name, Func dataFn, CancellationToken cancellationToken);
///
/// Sends the message to user device sessions.
///
///
/// The device identifier.
/// The name.
/// The data.
/// The cancellation token.
/// Task.
Task SendMessageToUserDeviceSessions(string deviceId, string name, T data, CancellationToken cancellationToken);
///
/// Sends the restart required message.
///
/// The cancellation token.
/// Task.
Task SendRestartRequiredNotification(CancellationToken cancellationToken);
///
/// Sends the server shutdown notification.
///
/// The cancellation token.
/// Task.
Task SendServerShutdownNotification(CancellationToken cancellationToken);
///
/// Sends the server restart notification.
///
/// The cancellation token.
/// Task.
Task SendServerRestartNotification(CancellationToken cancellationToken);
///
/// Adds the additional user.
///
/// The session identifier.
/// The user identifier.
void AddAdditionalUser(string sessionId, Guid userId);
///
/// Removes the additional user.
///
/// The session identifier.
/// The user identifier.
void RemoveAdditionalUser(string sessionId, Guid userId);
///
/// Reports the now viewing item.
///
/// The session identifier.
/// The item identifier.
void ReportNowViewingItem(string sessionId, string itemId);
///
/// Reports the now viewing item.
///
/// The session identifier.
/// The item.
void ReportNowViewingItem(string sessionId, BaseItemDto item);
///
/// Authenticates the new session.
///
/// The request.
/// Task{SessionInfo}.
Task AuthenticateNewSession(AuthenticationRequest request);
///
/// Creates the new session.
///
/// The request.
/// Task<AuthenticationResult>.
Task CreateNewSession(AuthenticationRequest request);
///
/// Reports the capabilities.
///
/// The session identifier.
/// The capabilities.
void ReportCapabilities(string sessionId, ClientCapabilities capabilities);
///
/// Reports the transcoding information.
///
/// The device identifier.
/// The information.
void ReportTranscodingInfo(string deviceId, TranscodingInfo info);
///
/// Clears the transcoding information.
///
/// The device identifier.
void ClearTranscodingInfo(string deviceId);
///
/// Gets the session.
///
/// The device identifier.
/// The client.
/// The version.
/// SessionInfo.
SessionInfo GetSession(string deviceId, string client, string version);
///
/// Gets the session by authentication token.
///
/// The token.
/// The device identifier.
/// The remote endpoint.
/// SessionInfo.
SessionInfo GetSessionByAuthenticationToken(string token, string deviceId, string remoteEndpoint);
///
/// Gets the session by authentication token.
///
/// The information.
/// The device identifier.
/// The remote endpoint.
/// The application version.
/// Task<SessionInfo>.
SessionInfo GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion);
///
/// Logouts the specified access token.
///
/// The access token.
/// Task.
void Logout(string accessToken);
void Logout(AuthenticationInfo accessToken);
///
/// Revokes the user tokens.
///
/// Task.
void RevokeUserTokens(Guid userId, string currentAccessToken);
///
/// Revokes the token.
///
/// The identifier.
/// Task.
void RevokeToken(string id);
void CloseIfNeeded(SessionInfo session);
}
}