package app

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

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver"
	"github.com/tidbcloud/aisupport/services/ticket-manager/config"
)

type testHandler struct{}

func (testHandler) Name() string {
	return "test"
}

func (testHandler) Register(routers map[apiserver.RoutePath]gin.IRouter) error {
	routers[APIRoutePath].GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"status": "ok"})
	})
	routers[PublicRoutePath].GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"status": "public-ok"})
	})
	return nil
}

func TestNewAPIServerRegistersHealthzAndTicketManagerRoutes(t *testing.T) {
	t.Parallel()
	gin.SetMode(gin.TestMode)

	server, err := NewAPIServer(APIServerParam{
		Config:   &config.RootConfig{},
		Handlers: []apiserver.Handler{testHandler{}},
	})
	require.NoError(t, err)

	healthReq := httptest.NewRequest(http.MethodGet, "/healthz", nil)
	healthRec := httptest.NewRecorder()
	server.ServeHTTP(healthRec, healthReq)
	require.Equal(t, http.StatusOK, healthRec.Code)
	require.Empty(t, healthRec.Body.String())

	businessReq := httptest.NewRequest(http.MethodGet, "/api/v1/ticketmanager/ping", nil)
	businessRec := httptest.NewRecorder()
	server.ServeHTTP(businessRec, businessReq)
	require.Equal(t, http.StatusOK, businessRec.Code)
	require.JSONEq(t, `{"status":"ok"}`, businessRec.Body.String())

	publicReq := httptest.NewRequest(http.MethodGet, "/public/v1/ticketmanager/ping", nil)
	publicRec := httptest.NewRecorder()
	server.ServeHTTP(publicRec, publicReq)
	require.Equal(t, http.StatusOK, publicRec.Code)
	require.JSONEq(t, `{"status":"public-ok"}`, publicRec.Body.String())
}
