package main

import (
	"context"
	"encoding/base64"
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"time"

	consolev1 "github.com/tidbcloud/metrics-integration/global/api/integration/v1"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/metadata"
)

const userMetadataKey = "grpc-metadata-x-metrics-integration-user"

func main() {
	addr := flag.String("addr", "127.0.0.1:18081", "global gRPC address")
	clusterID := flag.Uint64("cluster-id", 0, "cluster id")
	orgID := flag.Uint64("org-id", 0, "org id")
	projectID := flag.Uint64("project-id", 0, "project id")
	userEmail := flag.String("user-email", "control-plane-e2e@local.dev", "user email injected into grpc metadata")
	tenantID := flag.Uint64("tenant-id", 60205, "tenant id injected into grpc metadata")
	flag.Parse()

	if *clusterID == 0 || *orgID == 0 || *projectID == 0 {
		log.Fatal("--cluster-id, --org-id and --project-id are required")
	}

	userJSON, err := json.Marshal(map[string]any{
		"Email":    *userEmail,
		"TenantID": *tenantID,
		"Projects": []map[string]any{
			{"ID": *projectID},
		},
	})
	if err != nil {
		log.Fatalf("marshal user: %v", err)
	}

	conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("dial global grpc: %v", err)
	}
	defer func() { _ = conn.Close() }()

	client := consolev1.NewIntegrationServiceClient(conn)
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(
		userMetadataKey, base64.StdEncoding.EncodeToString(userJSON),
	))

	resp, err := client.CreateMetricsKey(ctx, &consolev1.CreateMetricsKeyRequest{
		OrgId:     *orgID,
		ProjectId: *projectID,
		ClusterId: *clusterID,
	})
	if err != nil {
		log.Fatalf("CreateMetricsKey failed: %v", err)
	}

	fmt.Printf("query_endpoint=%s\n", resp.QueryEndpoint)
	fmt.Printf("key_id=%d\n", resp.Key.KeyId)
	fmt.Printf("key=%s\n", resp.Key.Key)
}
