package newrelic

import (
	"testing"

	"github.com/valyala/fastjson"
)

func BenchmarkRequestUnmarshal(b *testing.B) {
	reqBody := `[
    {
      "EntityID":28257883748326179,
      "IsAgent":true,
      "Events":[
        {
          "eventType":"SystemSample",
          "timestamp":1690286061,
          "entityKey":"macbook-pro.local",
          "cpuPercent":25.056660790748904,
          "cpuUserPercent":8.687987912389374,
          "cpuSystemPercent":16.36867287835953,
          "cpuIOWaitPercent":0,
          "cpuIdlePercent":74.94333920925109,
          "cpuStealPercent":0,
          "loadAverageOneMinute":5.42333984375,
          "loadAverageFiveMinute":4.099609375,
          "loadAverageFifteenMinute":3.58203125,
          "memoryTotalBytes":17179869184,
          "memoryFreeBytes":3782705152,
          "memoryUsedBytes":13397164032,
          "memoryFreePercent":22.01824188232422,
          "memoryUsedPercent":77.98175811767578,
          "memoryCachedBytes":0,
          "memorySlabBytes":0,
          "memorySharedBytes":0,
          "memoryKernelFree":89587712,
          "swapTotalBytes":7516192768,
          "swapFreeBytes":1737293824,
          "swapUsedBytes":5778898944,
          "diskUsedBytes":0,
          "diskUsedPercent":0,
          "diskFreeBytes":0,
          "diskFreePercent":0,
          "diskTotalBytes":0,
          "diskUtilizationPercent":0,
          "diskReadUtilizationPercent":0,
          "diskWriteUtilizationPercent":0,
          "diskReadsPerSecond":0,
          "diskWritesPerSecond":0,
          "uptime":762376
        }
      ],
      "ReportingAgentID":28257883748326179
    }
  ]`
	b.SetBytes(int64(len(reqBody)))
	b.ReportAllocs()
	b.RunParallel(func(pb *testing.PB) {
		value, err := fastjson.Parse(reqBody)
		if err != nil {
			b.Errorf("cannot parse json error: %s", err)
		}
		v, err := value.Array()
		if err != nil {
			b.Errorf("cannot get array from json")
		}
		for pb.Next() {
			e := &Events{Metrics: []Metric{}}
			if err := e.Unmarshal(v); err != nil {
				b.Errorf("Unmarshal() error = %v", err)
			}
			if len(e.Metrics) == 0 {
				b.Errorf("metrics should have at least one element")
			}
		}
	})
}