package grpc

import (
	"context"
	"time"

	"braces.dev/errtrace"
	tigrpc "github.com/tidbcloud/tiinf/transport/tigrpc/client"
	"google.golang.org/grpc"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	utils "github.com/tidbcloud/tidb-management-service/utilities/grpc"
)

func NewMgmtClsuterOperationClient(addr string) (tidbmgmtservicev1.ClusterServiceClient, error) {
	conn, err := createGrpcConn(addr, 15*time.Second)
	if err != nil {
		return nil, err
	}

	return tidbmgmtservicev1.NewClusterServiceClient(conn), nil
}

func NewNextGenBackupClient(addr string) (globalngv1.BackupServiceClient, error) {
	conn, err := createGrpcConn(addr, 15*time.Second)
	if err != nil {
		return nil, err
	}

	return globalngv1.NewBackupServiceClient(conn), nil
}

func createGrpcConn(address string, timeout time.Duration) (*grpc.ClientConn, error) {
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	defer cancel()

	opts := []tigrpc.Option{
		tigrpc.WithPrometheus(),
		tigrpc.WithTracing(),
		tigrpc.WithUnaryInterceptors(utils.ClientPayloadLogInterceptor, utils.TimeoutInterceptor(timeout)),
	}

	conn, err := tigrpc.NewClientContext(ctx, address, opts...)
	if err != nil {
		return nil, errtrace.Wrap(err)
	}

	return conn, nil
}
