//go:generate ${GOBIN}/mockgen -destination auth_client_mock.go -package=opscore github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/auth/v1 AuthServiceClient
//go:generate ${GOBIN}/mockgen -destination iam_client_mock.go -package=opscore github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/iam/v1 IAMServiceClient
//go:generate ${GOBIN}/mockgen -destination user_client_mock.go -package=opscore github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/user/v1 UserServiceClient
package opscore

import (
	"fmt"

	authv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/auth/v1"
	iamv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/iam/v1"
	userv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/user/v1"
	"github.com/tidbcloud/devops/pkg/infra/utils/grpcutil"
	"go.uber.org/mock/gomock"
	"google.golang.org/grpc"
)

type Client struct {
	Auth authv1.AuthServiceClient
	IAM  iamv1.IAMServiceClient
	User userv1.UserServiceClient
}

func NewClient(addr string) (*Client, error) {
	opts := grpcutil.PresetDailOption().Default()
	conn, err := grpc.NewClient(addr, opts...)
	if err != nil {
		return nil, fmt.Errorf("dial ops core %s failed: %w", addr, err)
	}

	return &Client{
		Auth: authv1.NewAuthServiceClient(conn),
		IAM:  iamv1.NewIAMServiceClient(conn),
		User: userv1.NewUserServiceClient(conn),
	}, nil
}

func NewMockClient(ctrl *gomock.Controller) *Client {
	return &Client{
		Auth: NewMockAuthServiceClient(ctrl),
		IAM:  NewMockIAMServiceClient(ctrl),
		User: NewMockUserServiceClient(ctrl),
	}
}
