package metrics

import (
	"net/http"
	"net/url"

	"github.com/jarcoal/httpmock"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/onsi/gomega/types"
	"github.com/pingcap/test-infra/sdk/resource"

	pdpkg "github.com/pingcap/endless/pkg/client/pd"
	. "github.com/pingcap/endless/pkg/matcher"
	mock "github.com/pingcap/endless/pkg/matcher/metrics/generated"
)

var _ = BeforeSuite(func() {
	httpmock.Activate()
})

var _ = BeforeEach(func() {
	httpmock.Reset()
})

var _ = AfterSuite(func() {
	httpmock.DeactivateAndReset()
})

var _ = Describe("Api", func() {
	Context("PdApi", func() {
		var MockHttpRoot = "http://127.3.2.13:2379"
		var mockTc *mock.MockTiDBCluster
		var pd *pdpkg.Client

		BeforeEach(func() {
			mockTc = mock.NewMockTiDBCluster(GomockController)
			mockTc.EXPECT().
				ServiceURL(resource.PDAddr).
				Return(url.Parse(MockHttpRoot)).Times(1)
			httpmock.RegisterResponder("GET", MockHttpRoot+"/test_01",
				httpmock.NewStringResponder(200, `
{
  "name": {"first": "Tom", "last": "Anderson"},
  "age":37,
  "children": ["Sara","Alex","Jack"],
  "fav.movie": "Deer Hunter",
  "friends": [
    {"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
    {"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
    {"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
  ]
}`))

			pd = Try(pdpkg.NewPDClient(mockTc)).(*pdpkg.Client)
		})

		It("should assert value", func() { // assert directly (use api as a GomegaMatcher)
			resp := Try(pd.Get("/test_01")).(*http.Response)
			Expect(JSONSelector(resp, "friends.#.age")).
				Should(All(func() types.GomegaMatcher { return BeNumerically(">=", 44) }))
		})
		It("should retrieve value", func() { // assert on value (only use api.Selected)
			resp := Try(pd.Get("/test_01")).(*http.Response)
			Expect(JSONSelector(resp, "children.2")).Should(Equal("Jack"))
		})
		It("should assert HTTPStatus", func() {
			resp := Try(pd.Get("/test_01")).(*http.Response)
			Expect(resp).Should(HaveHTTPStatus(200))
		})
	})
})
