package scenario

import (
	"context"

	. "github.com/onsi/ginkgo"
	"github.com/pingcap/test-infra/sdk/resource"
	"golang.org/x/sync/errgroup"

	"github.com/pingcap/endless/pkg/client/tidb"
	. "github.com/pingcap/endless/pkg/matcher"
	. "github.com/pingcap/endless/pkg/util"
	"github.com/pingcap/endless/testcase/oltp/oltppkg"
	"github.com/pingcap/endless/testcase/oltp/scenario/betting"
	"github.com/pingcap/endless/testcase/oltp/scenario/params"
	"github.com/pingcap/endless/testcase/oltp/scenario/qhad"
)

func TTruncate001(rootCtx context.Context, config Config, tc resource.TiDBCluster, tidbClient *tidb.Client) {
	workloadName := config.WorkloadName

	By("initializing parameters")
	var parameters *params.Truncate
	if workloadName == "qhad" {
		parameters = Try(qhad.InitializeTruncate001Params(rootCtx, tidbClient)).(*params.Truncate)
	} else {
		parameters = Try(betting.InitializeTruncate001Params()).(*params.Truncate)
	}

	By("runnning truncate data")
	ctx, cancel := context.WithTimeout(rootCtx, parameters.RunTime)
	defer cancel()
	g, gctx := errgroup.WithContext(ctx)
	oltppkg.FunCommonCheck(gctx, tc, g, parameters.RunTime, nil)
	oltppkg.WaitFor(gctx, "Warm Up before truncate data", parameters.WarmUpTime)
	g.Go(WithGinkgoRecover(func() {
		if workloadName == "qhad" {
			Try(qhad.TruncatePartitionsRepeatedly(ctx, tc, config.QHAdOpts))
		} else if workloadName == "betting" {
			br := suiteTestCtx.Resource("br").(resource.WorkloadNode)
			Try(betting.TruncateDB(ctx, tc, br, config.BettingOpts, tidbClient))
		}
	}))
	Try(g.Wait())
}
