using System.Text.Json.Serialization;

namespace NATS.Server.Imports;

public sealed class ServiceLatencyMsg
{
    [JsonPropertyName("type")]
    public string Type { get; set; } = "io.nats.server.metric.v1.service_latency";

    [JsonPropertyName("requestor")]
    public string Requestor { get; set; } = string.Empty;

    [JsonPropertyName("responder")]
    public string Responder { get; set; } = string.Empty;

    [JsonPropertyName("status")]
    public int Status { get; set; } = 200;

    [JsonPropertyName("svc_latency")]
    public long ServiceLatencyNanos { get; set; }

    [JsonPropertyName("total_latency")]
    public long TotalLatencyNanos { get; set; }
}

public static class LatencyTracker
{
    public static bool ShouldSample(ServiceLatency latency)
    {
        if (latency.SamplingPercentage <= 0) return false;
        if (latency.SamplingPercentage >= 100) return true;
        return Random.Shared.Next(100) < latency.SamplingPercentage;
    }

    public static ServiceLatencyMsg BuildLatencyMsg(
        string requestor, string responder,
        TimeSpan serviceLatency, TimeSpan totalLatency)
    {
        return new ServiceLatencyMsg
        {
            Requestor = requestor,
            Responder = responder,
            ServiceLatencyNanos = serviceLatency.Ticks * 100,
            TotalLatencyNanos = totalLatency.Ticks * 100,
        };
    }
}
