using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Events;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Library
{
    /// 
    /// Interface IUserManager
    /// 
    public interface IUserManager
    {
        /// 
        /// Gets the users.
        /// 
        /// The users.
        IEnumerable Users { get; }
        /// 
        /// Occurs when [user updated].
        /// 
        event EventHandler> UserUpdated;
        /// 
        /// Occurs when [user deleted].
        /// 
        event EventHandler> UserDeleted;
        event EventHandler> UserCreated;
        event EventHandler> UserConfigurationUpdated;
        event EventHandler> UserPasswordChanged;
        event EventHandler> UserLockedOut;
        /// 
        /// Gets a User by Id
        /// 
        /// The id.
        /// User.
        /// 
        User GetUserById(Guid id);
        /// 
        /// Gets the user by identifier.
        /// 
        /// The identifier.
        /// User.
        User GetUserById(string id);
        /// 
        /// Gets the name of the user by.
        /// 
        /// The name.
        /// User.
        User GetUserByName(string name);
        /// 
        /// Authenticates a User and returns a result indicating whether or not it succeeded
        /// 
        /// The username.
        /// The password sha1.
        /// The remote end point.
        /// Task{System.Boolean}.
        /// user
        Task AuthenticateUser(string username, string passwordSha1, string remoteEndPoint);
        
        /// 
        /// Refreshes metadata for each user
        /// 
        /// The cancellation token.
        /// Task.
        Task RefreshUsersMetadata(CancellationToken cancellationToken);
        /// 
        /// Renames the user.
        /// 
        /// The user.
        /// The new name.
        /// Task.
        /// user
        /// 
        Task RenameUser(User user, string newName);
        /// 
        /// Updates the user.
        /// 
        /// The user.
        /// user
        /// 
        Task UpdateUser(User user);
        /// 
        /// Creates the user.
        /// 
        /// The name.
        /// User.
        /// name
        /// 
        Task CreateUser(string name);
        /// 
        /// Deletes the user.
        /// 
        /// The user.
        /// Task.
        /// user
        /// 
        Task DeleteUser(User user);
        /// 
        /// Resets the password.
        /// 
        /// The user.
        /// Task.
        Task ResetPassword(User user);
        /// 
        /// Gets the offline user dto.
        /// 
        /// The user.
        /// UserDto.
        UserDto GetOfflineUserDto(User user);
        /// 
        /// Resets the easy password.
        /// 
        /// The user.
        /// Task.
        Task ResetEasyPassword(User user);
        
        /// 
        /// Changes the password.
        /// 
        /// The user.
        /// The new password sha1.
        /// Task.
        Task ChangePassword(User user, string newPasswordSha1);
        /// 
        /// Changes the easy password.
        /// 
        /// The user.
        /// The new password sha1.
        /// Task.
        Task ChangeEasyPassword(User user, string newPasswordSha1);
        
        /// 
        /// Gets the user dto.
        /// 
        /// The user.
        /// The remote end point.
        /// UserDto.
        UserDto GetUserDto(User user, string remoteEndPoint = null);
        /// 
        /// Authenticates the user.
        /// 
        /// The username.
        /// The password sha1.
        /// The password MD5.
        /// The remote end point.
        /// Task<System.Boolean>.
        Task AuthenticateUser(string username, string passwordSha1, string passwordMd5, string remoteEndPoint);
        /// 
        /// Starts the forgot password process.
        /// 
        /// The entered username.
        /// if set to true [is in network].
        /// ForgotPasswordResult.
        ForgotPasswordResult StartForgotPasswordProcess(string enteredUsername, bool isInNetwork);
        /// 
        /// Redeems the password reset pin.
        /// 
        /// The pin.
        /// true if XXXX, false otherwise.
        Task RedeemPasswordResetPin(string pin);
        /// 
        /// Gets the user policy.
        /// 
        /// The user.
        /// UserPolicy.
        UserPolicy GetUserPolicy(User user);
        /// 
        /// Gets the user configuration.
        /// 
        /// The user.
        /// UserConfiguration.
        UserConfiguration GetUserConfiguration(User user);
        /// 
        /// Updates the configuration.
        /// 
        /// The user identifier.
        /// The new configuration.
        /// Task.
        Task UpdateConfiguration(string userId, UserConfiguration newConfiguration);
        /// 
        /// Updates the user policy.
        /// 
        /// The user identifier.
        /// The user policy.
        Task UpdateUserPolicy(string userId, UserPolicy userPolicy);
        /// 
        /// Makes the valid username.
        /// 
        /// The username.
        /// System.String.
        string MakeValidUsername(string username);
    }
}