package query

import (
	"context"
	"errors"
	"io"
	"strings"
	"time"

	. "github.com/onsi/gomega"
	. "github.com/pingcap/endless/pkg/util"
	"github.com/pingcap/endless/pkg/workloadnode/cluster"
	"github.com/pingcap/endless/testcase/oltp/oltppkg"
	"golang.org/x/sync/errgroup"
)

func OLTP_FULL_SCAN_FUN_001(
	ctx context.Context,
	tc cluster.BaseCluster,
	pr *io.PipeReader,
	caseCmdParms oltppkg.CaseCmdParms,
) {
	oltppkg.LogAndBy("full table scans repeatedly during running workload")
	var useDb string
	workloadType := caseCmdParms.WorkloadType.Type[0]
	if strings.HasPrefix(workloadType, "sysbench_") || strings.HasPrefix(workloadType, "ycsb") {
		useDb = caseCmdParms.SysbenchParms.Db
	} else if strings.HasPrefix(workloadType, "tpcc") {
		useDb = caseCmdParms.TpccParms.Db
	} else {
		err := errors.New("invalid workloadType")
		Expect(err).Should(Succeed())
	}

	var runTime time.Duration = 60 * time.Minute
	ctxAll, cancel := context.WithTimeout(ctx, runTime)
	defer cancel()
	g, ctxg := errgroup.WithContext(ctxAll)

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

	g.Go(WithGinkgoRecover(func() {
		oltppkg.WaitFor(ctxg, "wait for full scan start, which is 2min later than qps check", 7*time.Minute)
		err := FullScanAllTablesRepeatedly(ctxg, tc, runTime, useDb, nil, nil)
		Expect(err).Should(Succeed())
	}))

	Expect(g.Wait()).Should(BeNil())
}
