package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/tidbcloud/dataservices/idl/pbgen/proto/dataapi"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

const (
	AUTH0TOKEN = ""
)

var (
	client    dataapi.DataAPIExecutorServiceClient
	projectID = 3199529
	clusterID = uint64(10397230906819574004)
	token     = ""
	email     = "fangdong.jia@pingcap.com"

	credential = &dataapi.Credential{
		Type:      dataapi.CrtType_AUTH0,
		Key:       token,
		AccountId: email,
	}
)

func main() {

	addr := "127.0.0.1:12000"
	conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	client = dataapi.NewDataAPIExecutorServiceClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Second)
	defer cancel()

	testExecSql(ctx)
}

func testExecSql(ctx context.Context) {

	req := &dataapi.BasicEndpointReqV2{
		ProjectId:  uint64(projectID),
		ClusterId:  uint64(clusterID),
		Sql:        "select * from github_events limit 1",
		Credential: credential,
		TimeoutMs:  1000000,
	}
	res, err := client.ExecSql(ctx, req)
	log.Printf("Result: %+v, Error: %v", res, err)
}

func testSessionExecSql(ctx context.Context) {

	sid, err := createSession(ctx)
	if err != nil {
		log.Fatalln("createSession failed:", err)
	}

	req := &dataapi.BasicEndpointReqV2{
		SessionId:  sid,
		ProjectId:  uint64(projectID),
		ClusterId:  uint64(clusterID),
		Sql:        "select * from github_events limit 1",
		Credential: credential,
		TimeoutMs:  1000000,
	}
	res, err := client.ExecSql(ctx, req)
	log.Printf("Result: %+v, Error: %v", res, err)
}

func createSession(ctx context.Context) (string, error) {
	req := &dataapi.CreateSessionReq{
		ProjectId:  uint64(projectID),
		ClusterId:  uint64(clusterID),
		ExpireSec:  3600,
		Credential: credential,
	}
	res, err := client.CreateSession(ctx, req)
	if err != nil {
		return "", err
	}
	if res.BaseResp.ErrCode != 0 {
		err = fmt.Errorf("base_resp:%+v", res.BaseResp)
		return "", err
	}
	return res.SessionId, nil
}
