package grpcli

import (
	"context"
	"errors"
	"fmt"
	"go.uber.org/zap"
	"sync"

	"github.com/pingcap/log"
	"github.com/tidbcloud/debug_portal/config"
	"github.com/tidbcloud/debug_portal/idl/pbgen/core"
	"google.golang.org/grpc"
)

var (
	coreCli     core.CoreServiceClient
	coreSvcOnce sync.Once
)

func getCoreSvcClient() core.CoreServiceClient {
	coreSvcOnce.Do(func() {
		conn, err := grpc.DialContext(
			context.Background(),
			config.Global().GrpcConfig.CoreSvcAddr,
			grpc.WithInsecure(),
			grpc.WithChainUnaryInterceptor(),
		)
		if err != nil {
			panic(fmt.Sprintf("dial core-svc: %s", err))
		}

		coreCli = core.NewCoreServiceClient(conn)
	})

	return coreCli
}

func ListClusters(ctx context.Context, req *core.ListClustersReq) (*core.ListClustersResp, error) {
	client := getCoreSvcClient()

	resp, e := client.ListClusters(ctx, req)
	if e != nil {
		return resp, e
	}
	if resp.BaseResp.ErrCode != 0 {
		log.Error("list clusters error", zap.String("error", resp.BaseResp.ErrMsg))
		return resp, errors.New(resp.BaseResp.ErrMsg)
	}
	return resp, nil
}

func CountClusters(ctx context.Context, req *core.CountClustersReq) (*core.CountClustersResp, error) {
	client := getCoreSvcClient()

	resp, e := client.CountClusters(ctx, req)
	if e != nil {
		return resp, e
	}
	if resp.BaseResp.ErrCode != 0 {
		log.Error("count clusters error", zap.String("error", resp.BaseResp.ErrMsg))
		return resp, errors.New(resp.BaseResp.ErrMsg)
	}
	return resp, nil
}
