using MediaBrowser.Common.Events;
using MediaBrowser.Controller.Entities;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
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;
        
        /// 
        /// Gets a User by Id
        /// 
        /// The id.
        /// User.
        /// 
        User GetUserById(Guid id);
        /// 
        /// Authenticates a User and returns a result indicating whether or not it succeeded
        /// 
        /// The user.
        /// The password.
        /// Task{System.Boolean}.
        /// user
        Task AuthenticateUser(User user, string password);
        /// 
        /// Refreshes metadata for each user
        /// 
        /// The cancellation token.
        /// if set to true [force].
        /// Task.
        Task RefreshUsersMetadata(CancellationToken cancellationToken, bool force = false);
        /// 
        /// 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);
        /// 
        /// Changes the password.
        /// 
        /// The user.
        /// The new password.
        /// Task.
        Task ChangePassword(User user, string newPassword);
    }
}