package mgmt

import (
	"context"
	"fmt"
	"sync"

	"github.com/tidbcloud/account/commons/config"
	mgmtv1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	tigrpc "github.com/tidbcloud/tiinf/transport/tigrpc/client"
	"go.uber.org/zap"
)

var (
	mgmtSvcOnce   sync.Once
	mgmtSvcClient mgmtv1.ClusterServiceClient
)

type MgmtSvcGrpcClientImpl struct {
}

func getMgmtSvcClient() mgmtv1.ClusterServiceClient {
	addr := config.Global().GrpcConfig.MgmtSvcAddr
	//addr = "127.0.0.1:8888"
	mgmtSvcOnce.Do(func() {
		conn, err := tigrpc.NewClientConn(addr, tigrpc.WithDefault())
		if err != nil {
			panic(fmt.Sprintf("dial mgmt-svc error: %s", err))
		}

		mgmtSvcClient = mgmtv1.NewClusterServiceClient(conn)
		tilog.Info(context.Background(), "Initializing core service client", zap.String("addr", addr), zap.Any("err", err))
	})

	return mgmtSvcClient
}

func (impl *MgmtSvcGrpcClientImpl) ListClusters(ctx context.Context, in *mgmtv1.ListClustersRequest) (*mgmtv1.ListClustersResponse, error) {
	rsp, err := getMgmtSvcClient().ListClusters(ctx, in)
	tilog.Info(ctx, "mgmt list clusters result", zap.Any("req", in), zap.Any("rsp", rsp), zap.Any("err", err))
	return rsp, err
}
