package tidbtools

import (
	"testing"

	"github.com/tidbcloud/devops/pkg/infra/clients/coresvccli"
	"github.com/tidbcloud/devops/pkg/infra/clients/dataflowcli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/service/tidbtools/api"
	nextgenglobal "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"go.uber.org/dig"
	"google.golang.org/grpc"
)

func TestNewServiceUsesCoreSvcNextGenClients(t *testing.T) {
	conn := &grpc.ClientConn{}
	clusterClient := nextgenglobal.NewClusterServiceClient(conn)
	backupClient := nextgenglobal.NewBackupServiceClient(conn)
	coreSvc := &coresvccli.CoreSvcCli{Mgmt: &coresvccli.MgmtService{
		NextGenCluster: clusterClient,
		NextGenBackup:  backupClient,
	}}

	container := dig.New()
	for _, constructor := range []any{
		func() *config.RootConfig { return &config.RootConfig{} },
		func() *dataflowcli.DataflowCli { return &dataflowcli.DataflowCli{} },
		func() *coresvccli.CoreSvcCli { return coreSvc },
		NewService,
	} {
		if err := container.Provide(constructor); err != nil {
			t.Fatalf("provide dependency: %v", err)
		}
	}

	if err := container.Invoke(func(serviceAPI api.TidbToolsServiceAPI) {
		service := serviceAPI.(*svc)
		if service.nextGenGlobal != clusterClient {
			t.Fatal("NextGen cluster client was not sourced from CoreSvc")
		}
		if service.nextGenBackup != backupClient {
			t.Fatal("NextGen backup client was not sourced from CoreSvc")
		}
	}); err != nil {
		t.Fatalf("resolve TiDB Tools service: %v", err)
	}
}
