package org_test

import (
	"net/http"
	"testing"

	"github.com/pingcap-inc/clinic/pkg/proxy"

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
	"go.uber.org/fx"
	"go.uber.org/fx/fxtest"

	"github.com/pingcap-inc/clinic/pkg/api/org"
	"github.com/pingcap-inc/clinic/pkg/auditlog"
	"github.com/pingcap-inc/clinic/pkg/auth/session"
	"github.com/pingcap-inc/clinic/pkg/config"
	"github.com/pingcap-inc/clinic/pkg/es"
	"github.com/pingcap-inc/clinic/pkg/rbac"
	"github.com/pingcap-inc/clinic/pkg/resource_limit"
	"github.com/pingcap-inc/clinic/pkg/task_manager"
	"github.com/pingcap-inc/clinic/pkg/upload_file/decrypt"
	"github.com/pingcap-inc/clinic/pkg/upload_file/manager"
)

func TestFxModule(t *testing.T) {
	cfg := &config.Config{}
	app := fxtest.New(
		t,
		fx.Supply(
			&gin.Default().RouterGroup,
			cfg,
			&session.SessionManager{},
			&rbac.AuthCasbin{},
			fx.Annotate(&resource_limit.QuotaLimiter{}, fx.As(new(resource_limit.IQuotaLimiter))),
			&es.ESClient{},
			&auditlog.AuditLogClient{},
			&decrypt.Decrypt{},
			&manager.FileStoreageManager{},
			&task_manager.TaskManagerClient{},
			&proxy.TiDBClusterMetricHandler{},
			&proxy.O11yProxyHandler{},
		),
		org.Module,
	)
	app.RequireStart()
	app.RequireStop()
}

func TestFxInternalAPIModule(t *testing.T) {
	cfg := &config.Config{}
	engine := gin.New()
	app := fxtest.New(
		t,
		fx.Supply(
			&engine.RouterGroup,
			cfg,
			&session.SessionManager{},
			&rbac.AuthCasbin{},
			fx.Annotate(&resource_limit.NopQuotaLimiter{}, fx.As(new(resource_limit.IQuotaLimiter))),
			&es.ESClient{},
			&auditlog.AuditLogClient{},
			&decrypt.Decrypt{},
			&manager.FileStoreageManager{},
			&task_manager.TaskManagerClient{},
			&proxy.TiDBClusterMetricHandler{},
			&proxy.O11yProxyHandler{},
		),
		org.InternalAPIModule,
	)
	app.RequireStart()

	const componentsPath = "/internal/data-proxy/v1/orgs/:orgId/clusters/:clusterId/components"
	found := false
	for _, route := range engine.Routes() {
		if route.Method == http.MethodGet && route.Path == componentsPath {
			found = true
			break
		}
	}
	require.True(t, found, "internal Data Proxy components route is not registered")

	app.RequireStop()
}
