package remotewrite

import (
	"fmt"
	"testing"

	"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
	"github.com/golang/snappy"
)

func TestPushWriteRequest(t *testing.T) {
	for _, rowsCount := range []int{1, 10, 100, 1e3, 1e4} {
		t.Run(fmt.Sprintf("%d", rowsCount), func(t *testing.T) {
			testPushWriteRequest(t, rowsCount)
		})
	}
}

func testPushWriteRequest(t *testing.T, rowsCount int) {
	wr := newTestWriteRequest(rowsCount, 10)
	pushBlockLen := 0
	pushBlock := func(block []byte) {
		if pushBlockLen > 0 {
			panic(fmt.Errorf("BUG: pushBlock called multiple times; pushBlockLen=%d at first call, len(block)=%d at second call", pushBlockLen, len(block)))
		}
		pushBlockLen = len(block)
	}
	pushWriteRequest(wr, pushBlock)
	b := prompbmarshal.MarshalWriteRequest(nil, wr)
	zb := snappy.Encode(nil, b)
	maxPushBlockLen := len(zb)
	minPushBlockLen := maxPushBlockLen / 2
	if pushBlockLen < minPushBlockLen {
		t.Fatalf("unexpected block len after pushWriteRequest; got %d bytes; must be at least %d bytes", pushBlockLen, minPushBlockLen)
	}
	if pushBlockLen > maxPushBlockLen {
		t.Fatalf("unexpected block len after pushWriteRequest; got %d bytes; must be smaller or equal to %d bytes", pushBlockLen, maxPushBlockLen)
	}
}

func newTestWriteRequest(seriesCount, labelsCount int) *prompbmarshal.WriteRequest {
	var wr prompbmarshal.WriteRequest
	for i := 0; i < seriesCount; i++ {
		var labels []prompbmarshal.Label
		for j := 0; j < labelsCount; j++ {
			labels = append(labels, prompbmarshal.Label{
				Name:  fmt.Sprintf("label_%d_%d", i, j),
				Value: fmt.Sprintf("value_%d_%d", i, j),
			})
		}
		wr.Timeseries = append(wr.Timeseries, prompbmarshal.TimeSeries{
			Labels: labels,
			Samples: []prompbmarshal.Sample{
				{
					Value:     float64(i),
					Timestamp: 1000 * int64(i),
				},
			},
		})
	}
	return &wr
}