using System.Text.Json;

namespace ZB.MOM.WW.MxGateway.Server.Security.Authentication;

public static class ApiKeyConstraintSerializer
{
    private static readonly JsonSerializerOptions JsonOptions = new()
    {
        PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
        WriteIndented = false,
    };

    /// <summary>Serializes API key constraints to JSON, or returns null if the constraints are empty.</summary>
    /// <param name="constraints">The constraints to serialize.</param>
    public static string? Serialize(ApiKeyConstraints constraints)
    {
        ArgumentNullException.ThrowIfNull(constraints);
        return constraints.IsEmpty ? null : JsonSerializer.Serialize(constraints, JsonOptions);
    }

    /// <summary>Deserializes API key constraints from JSON, or returns empty constraints if JSON is null or whitespace.</summary>
    /// <param name="json">The JSON string to deserialize.</param>
    public static ApiKeyConstraints Deserialize(string? json)
    {
        if (string.IsNullOrWhiteSpace(json))
        {
            return ApiKeyConstraints.Empty;
        }

        return JsonSerializer.Deserialize<ApiKeyConstraints>(json, JsonOptions) ?? ApiKeyConstraints.Empty;
    }
}
