package acl

import (
	"context"
	"fmt"
	"sync"

	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/account/idl/pbgen/proto/acl"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	tigrpc "github.com/tidbcloud/tiinf/transport/tigrpc/client"
	"go.uber.org/zap"
)

var (
	aclCli     acl.AccessServiceClient
	aclSvcOnce sync.Once
)

type AccessHandlerImpl struct{}

func getAclSvcClient() acl.AccessServiceClient {
	aclSvcOnce.Do(func() {
		ctx := context.Background()
		addr := config.Global().GrpcConfig.AclSvcAddr

		conn, err := tigrpc.NewClientConn(addr, tigrpc.WithDefault())
		tilog.Info(ctx, "Initializing acl service client", zap.Any("err", err), zap.String("addr", addr))
		if err != nil {
			panic(fmt.Sprintf("dial acl-svc: %s", err))
		}

		aclCli = acl.NewAccessServiceClient(conn)
	})
	return aclCli
}

func (a *AccessHandlerImpl) GetOpenAPIAccess(ctx context.Context, req *acl.GetOpenAPIAccessReq) (*acl.GetOpenAPIAccessResp, error) {
	client := getAclSvcClient()

	resp, err := client.GetOpenAPIAccess(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (a *AccessHandlerImpl) HasAdminAccess(ctx context.Context, req *acl.HasAdminAccessReq) (*acl.HasAdminAccessResp, error) {
	client := getAclSvcClient()

	resp, err := client.HasAdminAccess(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp, nil
}
