using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using ApplicationLayer.InfrastructureServicesInterfaces;
using ApplicationLayer.Services.AuthServices.Common;
using Domains.Users;
namespace Infrastructure.Auth;
/// 
/// options kind of one in authorization registration in DI methods
/// token handler
/// date time provider
public class TokenGenerator(TokenGeneratorOptions options, JwtSecurityTokenHandler tokenHandler, IDateTimeProvider dateTimeProvider)
    : ITokenGenerator
{
    /// 
    public AuthToken CreateToken(User user)
    {
        var claims = new List
        {
            new(ClaimTypes.Role, user.Role.ToString()),
            new(ClaimTypes.NameIdentifier, user.Id.ToString())
        };
        var token = new JwtSecurityToken(
            issuer: options.Issuer,
            audience: options.Audience,
            expires: dateTimeProvider.Now().Add(options.ValidTime),
            signingCredentials: options.Credentials,
            claims: claims);
        return new AuthToken { Token = tokenHandler.WriteToken(token) };
    }
}