package gateway

import (
	"context"
	"fmt"
	"os"
	"testing"
	"time"

	"github.com/joho/godotenv"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/pov-service/internal/client/rms"
	"github.com/tidbcloud/pov-service/internal/client/tcms"
	"github.com/tidbcloud/pov-service/internal/client/tiworkload"
	"github.com/tidbcloud/pov-service/internal/common/params"
	"github.com/tidbcloud/pov-service/internal/model"
)

func TestListWorkloads(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TCMS_ADDRESS")
	tauth := os.Getenv("TCMS_AUTHORITY")
	ttoken := os.Getenv("TCMS_TOKEN")

	tcmsClient := tcms.NewClient(thost, tauth, ttoken, 0)
	rmsHost := os.Getenv("RMS_ADDRESS")
	rmsClient := rms.NewClient(rmsHost, ttoken)

	thost = os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	tiworkloadClient := tiworkload.NewClient(thost, tak, tsk)

	wlGw := NewWorkload(tcmsClient, rmsClient, tiworkloadClient)
	workloads, err := wlGw.ListWorkloads(params.ListWorkloads{})
	assert.NoError(t, err)
	assert.NotEmpty(t, workloads)
}

func TestRunTraffic(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TCMS_ADDRESS")
	tauth := os.Getenv("TCMS_AUTHORITY")
	ttoken := os.Getenv("TCMS_TOKEN")

	tcmsClient := tcms.NewClient(thost, tauth, ttoken, 0)

	thost = os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	tiworkloadClient := tiworkload.NewClient(thost, tak, tsk)

	rmsHost := os.Getenv("RMS_ADDRESS")
	rmsClient := rms.NewClient(rmsHost, ttoken)

	wlGw := NewWorkload(tcmsClient, rmsClient, tiworkloadClient)

	workloads, err := wlGw.TriggerRunTraffic(
		context.Background(),
		model.TiDBCluster{
			TiWorkloadClusterID: "1dbb0884-c0d2-4061-a5a5-2a071dd5c6fe",
			Host:                "10.2.12.57",
			Port:                30031,
		},
		model.PrepareDataResult{
			TiWorkloadWorkloadName: "tpcc",

			TiWorkloadClusterID: "1dbb0884-c0d2-4061-a5a5-2a071dd5c6fe",
		},
		[]model.WorkloadParam{
			{
				Name:  "duration",
				Value: "5",
			},
		},
	)

	assert.NoError(t, err)
	assert.NotEmpty(t, workloads)
}

func TestPollCreateClusterTask(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TCMS_ADDRESS")
	tauth := os.Getenv("TCMS_AUTHORITY")
	ttoken := os.Getenv("TCMS_TOKEN")

	tcmsClient := tcms.NewClient(thost, tauth, ttoken, 0)

	thost = os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	tiworkloadClient := tiworkload.NewClient(thost, tak, tsk)

	rmsHost := os.Getenv("RMS_ADDRESS")
	rmsClient := rms.NewClient(rmsHost, ttoken)

	wlGw := NewWorkload(tcmsClient, rmsClient, tiworkloadClient)

	start := time.Now()
	taskBase, cluster, err := wlGw.PollCreateClusterTask(
		context.Background(),
		nil,
		model.WorkloadTaskBase{
			RelatedServiceID: "180680",
		})
	elapsed := time.Since(start).Seconds()
	fmt.Printf("PollCreateClusterTask took %.2f \n", elapsed)

	assert.NoError(t, err)
	assert.NotEmpty(t, taskBase)
	assert.NotEmpty(t, cluster)
}
