package main

import (
	"database/sql"
	"net/url"

	"github.com/joho/godotenv"

	. "github.com/pingcap/test-infra/sdk/core"
	. "github.com/pingcap/test-infra/sdk/resource"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
)

func main() {
	godotenv.Load()
	ctx := try(BuildContext()).(TestContext)
	tc := ctx.Resource("tc").(TiDBCluster)
	dbName := ctx.Param("db-name", "test")

	opOnTiDB(ctx, tc, dbName)
	scaleCluster(ctx, tc)
	upgradeCluster(ctx, tc)
}

func opOnTiDB(ctx TestContext, tc TiDBCluster, dbName string) {
	sugar := ctx.Logger().Sugar()
	defer sugar.Sync()

	dbURL := try(tc.ServiceURL(DBAddr)).(*url.URL)
	sugar.Infof("the tidb URL is: %s", dbURL)
	db := try(sql.Open("mysql", BuildDSN(dbURL, dbName))).(*sql.DB)
	try(db.Exec("create table IF NOT EXISTS sbtest (id int(11) not null primary key, k int(11) not null, c char(120) not null default '', pad char(255) not null default '', key idx(k))"))
}

func scaleCluster(ctx TestContext, tc TiDBCluster) {
	sugar := ctx.Logger().Sugar()
	defer sugar.Sync()
	sugar.Infof("scale tidb-server to 3 replicas")

	try(tc.Scale(TiDBClusterScaleOptions{
		Target:   TiDB,
		Replicas: 3,
	}))
}

func upgradeCluster(ctx TestContext, tc TiDBCluster) {
	sugar := ctx.Logger().Sugar()
	defer sugar.Sync()
	sugar.Infof("upgrade tidb-server to v5.0.1")

	tc.Upgrade(TiDBClusterUpgradeOptions{
		Target: TiDB,
		Image:  "pingcap/tidb:v5.0.1",
	})
}

func try(xs ...interface{}) interface{} {
	if len(xs) == 0 {
		return nil
	}
	if err, ok := xs[len(xs)-1].(error); ok && err != nil {
		Fail(err.Error())
	}
	return xs[0]
}
