using System;
using System.Threading.Tasks;
using Timeline.Entities;
using Timeline.Services.User;
namespace Timeline.Services.Token
{
    public interface IUserTokenManager
    {
        /// 
        /// Try to create a token for given username and password.
        /// 
        /// The username.
        /// The password.
        /// The expire time of the token.
        /// The created token and the user info.
        /// Thrown when  or  is null.
        /// Thrown when  is of bad format.
        /// Thrown when the user with  does not exist.
        /// Thrown when  is wrong.
        public Task CreateTokenAsync(string username, string password, DateTime? expireAt = null);
        /// 
        /// Verify a token and get the saved user info. This also check the database for existence of the user.
        /// 
        /// The token.
        /// The user stored in token.
        /// Thrown when  is null.
        /// Thrown when the token is expired.
        /// Thrown when the token is of bad version.
        /// Thrown when the token is of bad format.
        /// Thrown when the user specified by the token does not exist. Usually the user had been deleted after the token was issued.
        public Task VerifyTokenAsync(string token);
    }
}