package main

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/go-chi/chi/v5"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/metrics2"

	"go.skia.org/infra/golden/go/config/validation"
	"go.skia.org/infra/golden/go/web"
)

func TestAddJSONRoute_ValidRoute_Success(t *testing.T) {

	test := func(router chi.Router, jsonRoute, expectedResponse string, callCountMetricExpectedToIncrease metrics2.Counter) {
		// Mock HTTP request and response.
		req, err := http.NewRequest("GET", jsonRoute, nil)
		require.NoError(t, err)
		rr := httptest.NewRecorder()

		// Call code under test, keeping track of the metric value.
		countBefore := callCountMetricExpectedToIncrease.Get()
		router.ServeHTTP(rr, req)
		countAfter := callCountMetricExpectedToIncrease.Get()

		assert.Equal(t, http.StatusOK, rr.Code)
		assert.Equal(t, expectedResponse, rr.Body.String())
		assert.Equal(t, int64(0), countBefore)
		assert.Equal(t, int64(1), countAfter)
	}

	// We will use the string written by our fake handler functions to assert that each route added
	// with addJSONRoute is associated with the right handler function.
	fakeHandler := func(body string) http.HandlerFunc {
		return func(w http.ResponseWriter, r *http.Request) {
			_, err := w.Write([]byte(body))
			require.NoError(t, err)
		}
	}

	// Set up some routes to test against.
	router := chi.NewRouter()
	addJSONRoute("GET", "/json/foo", fakeHandler("hello from /foo unversioned"), router, "")
	addJSONRoute("GET", "/json/v1/foo", fakeHandler("hello from /foo v1"), router, "")
	addJSONRoute("GET", "/json/v2/foo", fakeHandler("hello from /foo v2"), router, "")
	addJSONRoute("GET", "/json/bar", fakeHandler("hello from /bar unversioned"), router, "")
	addJSONRoute("GET", "/json/v1/bar", fakeHandler("hello from /bar v1"), router, "")
	addJSONRoute("GET", "/json/v10/foo/{bar}/{baz}", fakeHandler("hello from /foo/{bar}/{baz} v10"), router, "")
	router.Route("/json", func(prefixedRouter chi.Router) {
		addJSONRoute("GET", "/json/qux", fakeHandler("hello from /qux unversioned"), prefixedRouter, "/json")
		addJSONRoute("GET", "/json/v1/qux", fakeHandler("hello from /qux v1"), prefixedRouter, "/json")
	})

	counterFor := func(route, version string) metrics2.Counter {
		return metrics2.GetCounter(web.RPCCallCounterMetric, map[string]string{
			"route":   route,
			"version": version,
		})
	}

	// Test against routes from the root router.
	test(router, "/json/foo", "hello from /foo unversioned", counterFor("/foo", "v0"))
	test(router, "/json/v1/foo", "hello from /foo v1", counterFor("/foo", "v1"))
	test(router, "/json/v2/foo", "hello from /foo v2", counterFor("/foo", "v2"))
	test(router, "/json/bar", "hello from /bar unversioned", counterFor("/bar", "v0"))
	test(router, "/json/v1/bar", "hello from /bar v1", counterFor("/bar", "v1"))
	test(router, "/json/v10/foo/hello/world", "hello from /foo/{bar}/{baz} v10", counterFor("/foo/{bar}/{baz}", "v10"))

	// Test against routes from the prefixed router.
	test(router, "/json/qux", "hello from /qux unversioned", counterFor("/qux", "v0"))
	test(router, "/json/v1/qux", "hello from /qux v1", counterFor("/qux", "v1"))
}

func TestAddJSONRoute_InvalidRoute_Panics(t *testing.T) {

	test := func(routerPathPrefix, jsonRoute, expectedError string) {
		require.PanicsWithValue(t, expectedError, func() {
			router := chi.NewRouter()
			addJSONRoute("GET", jsonRoute, func(w http.ResponseWriter, r *http.Request) {}, router, routerPathPrefix)
		}, jsonRoute)
	}

	// Route is not prefixed with the router's path prefix.
	test("/json/alpha", "/json/beta/foo", `Prefix "/json/alpha" not found in JSON RPC route: /json/beta/foo`)

	// Interesting edge cases.
	test("", "/json", "Unrecognized JSON RPC route format: /json")
	test("", "/json/", "Unrecognized JSON RPC route format: /json/")
	test("", "/json/v0/myrpc", "JSON RPC version cannot be 0: /json/v0/myrpc")

	// Other invalid routes.
	test("", "", "Unrecognized JSON RPC route format: ")
	test("", "/", "Unrecognized JSON RPC route format: /")
	test("", "/foo", "Unrecognized JSON RPC route format: /foo")
	test("", "/foo/", "Unrecognized JSON RPC route format: /foo/")
	test("", "/foo/bar", "Unrecognized JSON RPC route format: /foo/bar")
}

func TestLoadExistingConfigs_Valid(t *testing.T) {
	var cfg frontendServerConfig
	err := validation.ValidateServiceConfigs("frontend", validation.AllInstances, &cfg)
	require.NoError(t, err)
	assert.NotZero(t, cfg, "Config object should not be nil.")
}
