using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Timeline.Entities;
namespace Timeline.Services.User
{
    public interface IUserService : IBasicUserService
    {
        /// 
        /// Try to get a user by id.
        /// 
        /// The id of the user.
        /// The user info.
        /// Thrown when the user with given id does not exist.
        Task GetUserAsync(long id);
        /// 
        /// List all users.
        /// 
        /// The user info of users.
        Task> GetUsersAsync();
        /// 
        /// Create a user with given info.
        /// 
        /// Info of new user.
        /// The the new user.
        /// Thrown when  is null.
        /// Thrown when param field is illegal.
        /// Thrown when a user with given username already exists.
        Task CreateUserAsync(CreateUserParams param);
        /// 
        /// Modify a user.
        /// 
        /// The id of the user.
        /// The new information.
        /// The new user info.
        /// Thrown when some fields in  is bad.
        /// Thrown when user with given id does not exist.
        /// 
        /// Version will increase if password is changed.
        /// 
        Task ModifyUserAsync(long id, ModifyUserParams? param);
        /// 
        /// Try to verify the given username and password.
        /// 
        /// The username of the user to verify.
        /// The password of the user to verify.
        /// User id.
        /// Thrown when  or  is null.
        /// Thrown when  is of bad format or  is empty.
        /// Thrown when the user with given username does not exist.
        /// Thrown when password is wrong.
        Task VerifyCredential(string username, string password);
        /// 
        /// Try to change a user's password with old password.
        /// 
        /// The id of user to change password of.
        /// Old password.
        /// New password.
        /// Thrown if  or  is null.
        /// Thrown if  or  is empty.
        /// Thrown if the user with given username does not exist.
        /// Thrown if the old password is wrong.
        Task ChangePassword(long id, string oldPassword, string newPassword);
    }
}