package grpc

// @Time    : 2022/11/14 4:47 PM
// @Author  : lvhongmeng

import (
	"context"
	"fmt"
	"message-service/commons/config"
	"message-service/commons/utils"
	"sync"

	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/tiinf/errs"
	tigrpc "github.com/tidbcloud/tiinf/transport/tigrpc/client"
)

var (
	accountProviderSvcOnce sync.Once
	accountProviderSvcCli  account.AccountAPIServiceClient
)

func getAccountProviderSvcClient() account.AccountAPIServiceClient {
	accountProviderSvcOnce.Do(func() {
		conn, err := tigrpc.NewClientConn(config.Global().GrpcConf.AccountProviderSvcAddr, tigrpc.WithDefault())
		if err != nil {
			panic(fmt.Sprintf("dial account-provider-svc: %s", err))
		}

		accountProviderSvcCli = account.NewAccountAPIServiceClient(conn)
	})

	return accountProviderSvcCli
}

func GetUserByToken(ctx context.Context, req *account.GetUserByTokenRequest) (*account.GetUserByTokenResponse, error) {
	client := getAccountProviderSvcClient()

	resp, e := client.GetUserByToken(ctx, req)
	if e != nil {
		return resp, errs.NewInternalGRPC(utils.GetFuncName(), e)
	}
	return resp, formatError(ctx, e, resp.BaseResp)
}

func ListOrgsByUser(ctx context.Context, req *account.ListOrgsByUserRequest) (*account.ListOrgsByUserResponse, error) {
	client := getAccountProviderSvcClient()
	resp, e := client.ListOrgsByUser(ctx, req)
	if e != nil {
		return resp, errs.NewInternalGRPC(utils.GetFuncName(), e)
	}
	return resp, formatError(ctx, e, resp.BaseResp)
}

func ListProjectsByOrgsInUser(ctx context.Context, req *account.ListProjectsByOrgsInUserRequest) (*account.ListProjectsByOrgsInUserResponse, error) {
	client := getAccountProviderSvcClient()

	resp, e := client.ListProjectsByOrgsInUser(ctx, req)
	if e != nil {
		return resp, errs.NewInternalGRPC(utils.GetFuncName(), e)
	}
	return resp, formatError(ctx, e, resp.BaseResp)
}

func GetAuthUser(ctx context.Context, req *account.GetAuthUserRequest) (*account.GetAuthUserResponse, error) {
	client := getAccountProviderSvcClient()

	resp, e := client.GetAuthUser(ctx, req)
	if e != nil {
		return resp, errs.NewInternalGRPC(utils.GetFuncName(), e)
	}
	return resp, formatError(ctx, e, resp.BaseResp)
}
