package tiworkload

import (
	"context"
	"os"
	"testing"

	"github.com/joho/godotenv"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/pov-service/internal/model"
)

func TestPing(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	err := c.Ping()
	if err != nil {
		t.Fatal(err)
	}
}

func TestGetWorkloads(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	wls, err := c.ListTraffics()
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, wls)
}

func TestGetTrafficForms(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	forms, err := c.GetTrafficForm("airbnb")
	if err != nil {
		t.Fatal(err)
	}

	assert.Greater(t, len(forms), 0)
}

func TestRunTraffic(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	id, err := c.RunTraffic(WorkloadParams{
		ExecuteBase: ExecuteBase{
			ClusterID:    "c37651ea-d7f4-4d36-9c07-2e3b502145a8",
			DBHost:       "tc-tidb.testbed-tps-7782619-1-458",
			DBPort:       4000,
			PDHost:       "tc-tidb.testbed-tps-7782619-1-458",
			PDPort:       2379,
			User:         "root",
			WorkloadName: "oltp_insert",
		},
		WorkloadParams: TaskParams{
			Params: map[string]any{
				"command":          "run",
				"db_name":          "test",
				"duration":         1,
				"subtype":          "oltp_insert",
				"sysbench_options": "--tables=32 --table-size=100 --mysql-ignore-errors=1062,2013,8028,9002,9007 --auto-inc=false",
				"threads":          100,
				"tool_command":     "sysbench",
				"workload":         "oltp_insert",
			},
		},
	})
	if err != nil {
		t.Fatal(err)
	}

	assert.Greater(t, id, 0)
}

func TestGetTrafficExec(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	exec, err := c.GetTrafficExec(1020095)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, exec)
}

func TestDeleteTrafficExec(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	err := c.TerminateTrafficExec(900006)
	if err != nil {
		t.Fatal(err)
	}
}

func TestRestartTraffic(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	id, err := c.RunTraffic(WorkloadParams{
		ExecuteBase: ExecuteBase{
			WorkloadName: "oltp_insert",
			ClusterID:    "7d3631fa-0767-4b26-8764-84aed8158813",
			DBHost:       "tc-tidb.testbed-tps-7782619-1-458",
			DBPort:       4000,
			PDHost:       "tc-tidb.testbed-tps-7782619-1-458",
			PDPort:       2379,
			User:         "root",
		},
		WorkloadParams: TaskParams{
			Params: map[string]any{
				"command":          "run",
				"db_name":          "test",
				"duration":         1,
				"subtype":          "oltp_insert",
				"sysbench_options": "--tables=32 --table-size=100 --mysql-ignore-errors=1062,2013,8028,9002,9007 --auto-inc=false",
				"threads":          100,
				"tool_command":     "sysbench",
				"workload":         "oltp_insert",
			},
		},
	})
	if err != nil {
		t.Fatal(err)
	}

	assert.Greater(t, id, 0)

	newId, err := c.RecreateTraffic(
		context.Background(),
		id,
		WorkloadParams{
			ExecuteBase: ExecuteBase{
				WorkloadName: "oltp_insert",
				ClusterID:    "7d3631fa-0767-4b26-8764-84aed8158813",
				DBHost:       "tc-tidb.testbed-tps-7782619-1-458",
				DBPort:       4000,
				PDHost:       "tc-tidb.testbed-tps-7782619-1-458",
				PDPort:       2379,
				User:         "root",
			},
			WorkloadParams: TaskParams{
				Params: map[string]any{
					"command":          "run",
					"db_name":          "test",
					"duration":         2,
					"subtype":          "oltp_insert",
					"sysbench_options": "--tables=32 --table-size=100 --mysql-ignore-errors=1062,2013,8028,9002,9007 --auto-inc=false",
					"threads":          101,
					"tool_command":     "sysbench",
					"workload":         "oltp_insert",
				},
			},
		},
	)

	assert.NoError(t, err)
	assert.Greater(t, newId, 0)
}

func TestSampleDBs(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	dbs, err := c.SampleDBs(
		context.Background(),
		DBAccess{
			ClusterID: "1dbb0884-c0d2-4061-a5a5-2a071dd5c6fe",
			DBUser:    "root",
		},
		model.SampleDBOptions{},
	)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, dbs)
}

func TestSampleData(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	dbs, err := c.SampleData(
		context.Background(),
		DBAccess{
			ClusterID: "1dbb0884-c0d2-4061-a5a5-2a071dd5c6fe",
			DBUser:    "root",
		},
		model.SampleDataOptions{
			DBName:    "tpcc",
			TableName: "revenue1",
		})
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, dbs)
}

func TestOverprovision(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	name, err := c.PostOverProvision(
		context.Background(),
		"098d0bd7-70ea-46b4-a098-08974552ef51",
		OverProvisionOption{
			Resource: OverProvisionResource{
				CPU:    "7",
				Memory: "13Gi",
			},
			Name:     "test",
			Replicas: 5,
		},
	)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, name)
}

func TestRegisterTestbed(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	agentID, err := c.RegisterTestbed(
		context.Background(),
		"testbed-tps-7782619-1-458",
	)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, agentID)
}

func TestGet1stClusterByAgent(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	clstId, err := c.Get1stClusterByAgent(
		context.Background(),
		"ff3cba47-c77c-4baf-91c1-8836c9912152",
	)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, clstId)
}

func TestExecuteSql(t *testing.T) {
	_ = godotenv.Load("./.env")
	thost := os.Getenv("TIWORKLOAD_ADDRESS")
	tak := os.Getenv("TIWORKLOAD_AK")
	tsk := os.Getenv("TIWORKLOAD_SK")
	c := NewClient(thost, tak, tsk)
	resp, err := c.ExecuteSql(
		context.Background(),
		ExecteSqlReq{
			ClusterID: "1dbb0884-c0d2-4061-a5a5-2a071dd5c6fe",
			Query:     "show databases;",
		},
	)
	if err != nil {
		t.Fatal(err)
	}

	assert.NotEmpty(t, resp)
}
