// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text.Json;
using BenchmarkDotNet.Attributes;
using Google.Protobuf;
using Google.Protobuf.Reflection;
using Greet;
using Microsoft.AspNetCore.Grpc.JsonTranscoding;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;

namespace Microsoft.AspNetCore.Grpc.Microbenchmarks.Json;

public class JsonWriting
{
    private HelloRequest _request = default!;
    private JsonSerializerOptions _serializerOptions = default!;
    private JsonFormatter _jsonFormatter = default!;

    [GlobalSetup]
    public void GlobalSetup()
    {
        var descriptorRegistry = new DescriptorRegistry();
        descriptorRegistry.RegisterFileDescriptor(HelloRequest.Descriptor.File);

        _request = new HelloRequest() { Name = "Hello world" };
        _serializerOptions = JsonConverterHelper.CreateSerializerOptions(
            new JsonContext(new GrpcJsonSettings { WriteIndented = false }, TypeRegistry.Empty, descriptorRegistry));
        _jsonFormatter = new JsonFormatter(new JsonFormatter.Settings(formatDefaultValues: false));
    }

    [Benchmark]
    public void WriteMessage_JsonSerializer()
    {
        JsonSerializer.Serialize(_request, _serializerOptions);
    }

    [Benchmark]
    public void WriteMessage_JsonFormatter()
    {
        _jsonFormatter.Format(_request);
    }
}
