package metrics

import (
	"bytes"

	//"bytes"
	//"github.com/DataDog/zstd"
	"os"
	"testing"

	"github.com/DataDog/zstd"
	"github.com/onsi/gomega"
	"github.com/prometheus/prometheus/prompb"

	"github.com/pingcap-inc/clinic/pkg/stream"
)

func Test_NewMetricIterator(t *testing.T) {
	g := gomega.NewWithT(t)
	f, err := os.Open("../testdata/monitor/metrics/10.9.20.28-9090/test.json")
	g.Expect(err).To(gomega.Succeed())

	dec := zstd.NewReader(f)
	defer dec.Close()

	iterator, err := NewMetricIterator(dec, "path", "1234", getHostName("10.9.20.28-9090"), "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108")
	g.Expect(err).To(gomega.Succeed())

	stream.OfIterator(iterator).Each(func(ts prompb.TimeSeries) {
		g.Expect(len(ts.Labels) > 0).To(gomega.BeTrue())
		labels := make(map[string]string)
		for _, label := range ts.Labels {
			labels[label.Name] = label.Value
		}

		g.Expect(labels[ClusterLabel]).To(gomega.Equal("1234"))
		g.Expect(labels[HostLabel], "10.9.20.28")
	})
}

//func Test_NewMetricIteratorWithPlain(t *testing.T) {
//	g := gomega.NewWithT(t)
//
//	data, err := mockPromResponse("test", 0, false)
//	g.Expect(err).To(gomega.Succeed())
//
//	iterator, err := NewMetricIterator(data, 111, "111", "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108")
//	g.Expect(err).To(gomega.Succeed())
//
//	stream.OfIterator(iterator).Each(func(ts prompb.TimeSeries) {
//		g.Expect(len(ts.Labels) > 0).To(gomega.BeTrue())
//		labels := make(map[string]string)
//		for _, label := range ts.Labels {
//			labels[label.Name] = label.Value
//		}
//
//		g.Expect(labels[ClusterLabel]).To(gomega.Equal("111"))
//		g.Expect(labels[HostLabel], "111")
//	})
//}

func Test_NewMetricIteratorWithoutZstd(t *testing.T) {
	g := gomega.NewWithT(t)

	data, err := MockPromResponse("test", 0, false)
	g.Expect(err).To(gomega.Succeed())

	iterator, err := NewMetricIterator(bytes.NewReader(data), "path", "222", "222", "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108")
	g.Expect(err).To(gomega.Succeed())

	stream.OfIterator(iterator).Each(func(ts prompb.TimeSeries) {
		g.Expect(len(ts.Labels) > 0).To(gomega.BeTrue())
		labels := make(map[string]string)
		for _, label := range ts.Labels {
			labels[label.Name] = label.Value
		}

		g.Expect(labels[ClusterLabel]).To(gomega.Equal("222"))
		g.Expect(labels[HostLabel], "222")
	})
}
