using MediaBrowser.Model.Connect;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Model.ApiClient
{
    public interface IConnectionManager
    {
        /// 
        /// Occurs when [connected].
        /// 
        event EventHandler> Connected;
        /// 
        /// Occurs when [local user sign in].
        /// 
        event EventHandler> LocalUserSignIn;
        /// 
        /// Occurs when [connect user sign in].
        /// 
        event EventHandler> ConnectUserSignIn;
        /// 
        /// Occurs when [local user sign out].
        /// 
        event EventHandler> LocalUserSignOut;
        /// 
        /// Occurs when [connect user sign out].
        /// 
        event EventHandler ConnectUserSignOut;
        /// 
        /// Occurs when [remote logged out].
        /// 
        event EventHandler RemoteLoggedOut;
        /// 
        /// Gets the device.
        /// 
        /// The device.
        IDevice Device { get; }
        /// 
        /// Gets the connect user.
        /// 
        /// The connect user.
        ConnectUser ConnectUser { get; }
        /// 
        /// Gets or sets a value indicating whether [save local credentials].
        /// 
        /// true if [save local credentials]; otherwise, false.
        bool SaveLocalCredentials { get; set; }
        /// 
        /// Gets the client capabilities.
        /// 
        /// The client capabilities.
        ClientCapabilities ClientCapabilities { get; }
        /// 
        /// Gets the API client.
        /// 
        /// The item.
        /// IApiClient.
        IApiClient GetApiClient(IHasServerId item);
        /// 
        /// Gets the API client.
        /// 
        /// The server identifier.
        /// IApiClient.
        IApiClient GetApiClient(string serverId);
        
        /// 
        /// Connects the specified cancellation token.
        /// 
        /// The cancellation token.
        /// Task<ConnectionResult>.
        Task Connect(CancellationToken cancellationToken = default(CancellationToken));
        /// 
        /// Connects the specified API client.
        /// 
        /// The API client.
        /// The cancellation token.
        /// Task<ConnectionResult>.
        Task Connect(IApiClient apiClient, CancellationToken cancellationToken = default(CancellationToken));
        
        /// 
        /// Connects the specified server.
        /// 
        /// The server.
        /// The cancellation token.
        /// Task<ConnectionResult>.
        Task Connect(ServerInfo server, CancellationToken cancellationToken = default(CancellationToken));
        /// 
        /// Connects the specified server.
        /// 
        /// The server.
        /// The options.
        /// The cancellation token.
        /// Task<ConnectionResult>.
        Task Connect(ServerInfo server, ConnectionOptions options, CancellationToken cancellationToken = default(CancellationToken));
        /// 
        /// Connects the specified server.
        /// 
        /// The address.
        /// The cancellation token.
        /// Task<ConnectionResult>.
        Task Connect(string address, CancellationToken cancellationToken = default(CancellationToken));
        /// 
        /// Logouts this instance.
        /// 
        /// Task<ConnectionResult>.
        Task Logout();
        /// 
        /// Logins to connect.
        /// 
        /// Task.
        Task LoginToConnect(string username, string password);
        /// 
        /// Gets the active api client instance
        /// 
        IApiClient CurrentApiClient { get; }
        /// 
        /// Creates the pin.
        /// 
        /// Task<PinCreationResult>.
        Task CreatePin();
        /// 
        /// Gets the pin status.
        /// 
        /// The pin.
        /// Task<PinStatusResult>.
        Task GetPinStatus(PinCreationResult pin);
        /// 
        /// Exchanges the pin.
        /// 
        /// The pin.
        /// Task.
        Task ExchangePin(PinCreationResult pin);
        /// 
        /// Gets the server information.
        /// 
        /// The identifier.
        /// Task<ServerInfo>.
        Task GetServerInfo(string id);
        /// 
        /// Gets the available servers.
        /// 
        /// The cancellation token.
        Task> GetAvailableServers(CancellationToken cancellationToken = default(CancellationToken));
        /// 
        /// Authenticates an offline user with their password
        /// 
        /// The user.
        /// The password.
        /// if set to true [remember credentials].
        /// Task.
        Task AuthenticateOffline(UserDto user, string password, bool rememberCredentials);
        /// 
        /// Gets the offline users.
        /// 
        /// Task<List<UserDto>>.
        Task> GetOfflineUsers();
        /// 
        /// Signups for connect.
        /// 
        /// The email.
        /// The username.
        /// The password.
        /// The cancellation token.
        /// Task.
        Task SignupForConnect(string email, string username, string password, CancellationToken cancellationToken = default(CancellationToken));
    }
}