using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

namespace UniVerse.Api.Tests.Helpers;

/// <summary>
/// Генерирует подписанные JWT токены для использования в интеграционных тестах.
/// Использует те же секрет/издателя/аудиторию (secret/issuer/audience), которые внедряет ApiWebApplicationFactory.
/// </summary>
public static class TestJwtFactory
{
    public const string Secret   = "test-super-secret-key-32-chars!!";
    public const string Issuer   = "UniVerse-Test";
    public const string Audience = "UniVerse-Test";

    /// <summary>Создает валидную строку токена JWT (bearer) для заданной роли и идентификатора пользователя.</summary>
    public static string Generate(string role, int userId = 1)
    {
        var key     = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Secret));
        var creds   = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, userId.ToString()),
            new Claim(ClaimTypes.Role, role),
            new Claim("sub", userId.ToString()),
        };

        var token = new JwtSecurityToken(
            issuer:             Issuer,
            audience:           Audience,
            claims:             claims,
            expires:            DateTime.UtcNow.AddHours(1),
            signingCredentials: creds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }

    /// <summary>Создает значение заголовка Authorization: "Bearer &lt;token&gt;".</summary>
    public static string BearerHeader(string role, int userId = 1)
        => $"Bearer {Generate(role, userId)}";
}
