package ddl

import (
	"context"
	"database/sql"
	"errors"
	"fmt"
	"io"
	"strings"
	"time"

	_ "github.com/go-sql-driver/mysql"
	. "github.com/onsi/gomega"
	"golang.org/x/sync/errgroup"

	. "github.com/pingcap/endless/pkg/matcher"
	. "github.com/pingcap/endless/pkg/util"
	"github.com/pingcap/endless/pkg/workloadnode/cluster"
	"github.com/pingcap/endless/testcase/oltp/oltppkg"
	"github.com/pingcap/log"
	_ "github.com/pingcap/test-infra/sdk/resource/impl/k8s"
)

func OLTP_DROP_TABLE_FUN_001(
	ctx context.Context,
	tc cluster.BaseCluster,
	pr *io.PipeReader,
	caseCmdParms oltppkg.CaseCmdParms,
) {
	storeSize, sumSize, err := oltppkg.GetStoreSizeByType(tc, "used_size")
	Expect(err).Should(Succeed())
	log.Info(fmt.Sprintf("Store Size and sumSize%v %v before drop.", storeSize, sumSize))
	workloadType := caseCmdParms.WorkloadType.Type[0]
	g, ctxg := errgroup.WithContext(ctx)
	var runTime time.Duration = 3600 * time.Second

	oltppkg.FunCommonCheck(ctxg, tc, g, runTime, pr)

	g.Go(WithGinkgoRecover(func() {
		oltppkg.WaitFor(ctxg, "Warm Up before drop db", 10*time.Minute)
		db := Try(tc.GetDB("")).(*sql.DB)
		defer db.Close()
		var dbToDrop string
		if strings.HasPrefix(workloadType, "sysbench_") || strings.HasPrefix(workloadType, "ycsb") {
			dbToDrop = caseCmdParms.TpccParms.Db
			log.Info("Drop tpcc")
		} else if strings.HasPrefix(workloadType, "tpcc") {
			log.Info("Drop sysbench")
			dbToDrop = caseCmdParms.SysbenchParms.Db
		} else {
			err := errors.New("invalid workloadType")
			Expect(err).Should(Succeed())
		}
		Try(db.Exec(fmt.Sprintf("drop database if exists %s", dbToDrop)))
	}))
	Expect(g.Wait()).Should(BeNil())
}
