package grpcli

import (
	"context"
	"sync"

	"github.com/tidbcloud/account/idl/pbgen/proto/acl"
	"github.com/tidbcloud/dataflow-service/internal/config"
	"github.com/tidbcloud/dataflow-service/pkg/grpc/grpcli"
	"github.com/tidbcloud/pkgv2/bizerr"
)

var (
	accountAclSvcOnce sync.Once
	accountAclSvcCli  acl.AccessServiceClient
)

func getAccountAclSvcClient() acl.AccessServiceClient {
	accountAclSvcOnce.Do(func() {
		ctx := context.Background()
		addr := config.Global().GrpcConfig.AccountAclSvcAddr
		conn := grpcli.MustBuildGrpcClientConnection(ctx, addr)
		accountAclSvcCli = acl.NewAccessServiceClient(conn)
	})

	return accountAclSvcCli
}

func GetOpenAPIAccess(ctx context.Context, req *acl.GetOpenAPIAccessReq) (*acl.GetOpenAPIAccessResp, bizerr.BizError) {
	client := getAccountAclSvcClient()

	resp, e := client.GetOpenAPIAccess(ctx, req)
	if e != nil {
		return resp, bizerr.WrapGrpcError(e, "GetOpenAPIAccess")
	}
	return resp, nil
}

func GetDelegateJwtByUser(ctx context.Context, req *acl.GetJwtByUserReq) (*acl.GetJwtByUserResp, bizerr.BizError) {
	client := getAccountAclSvcClient()

	resp, err := client.GetJwtByUser(ctx, req)
	if err != nil {
		return resp, bizerr.WrapGrpcError(err, "GetJwtByUser")
	}

	return resp, nil
}
