package ccb_application_router

import (
	"context"
	"encoding/json"
	"fmt"
	"time"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/pingcap/log"
	"github.com/pingcap/test-infra/sdk/core"
	"github.com/pingcap/test-infra/sdk/resource"
	v1 "github.com/prometheus/client_golang/api/prometheus/v1"
	"golang.org/x/sync/errgroup"

	"github.com/pingcap/endless/pkg/workloadnode/tiup"
)

func RunHATestCaseByCLJ(suiteTestCtx core.TestContext, ctx context.Context, tiupCluster *tiup.TiUPCluster, clusterInfo ClusterInfo) {
	clusterInfoStr, err := json.Marshal(clusterInfo)
	Expect(err).Should(BeNil())
	CLJClient := suiteTestCtx.Resource("tiup").(resource.WorkloadNode)
	cmd := fmt.Sprintf("echo '%s' > /usr/src/automate/clusterInfo.json", string(clusterInfoStr))
	options := resource.WorkloadNodeExecOptions{Command: cmd}
	_, _, _, err = CLJClient.Exec(options)
	Expect(err).Should(BeNil())

	cmd = fmt.Sprintf("echo '%s' > /usr/src/automate/rawkv.scale-out-kv.yaml", clusterInfo.ScaleOutTiKVYML)
	options = resource.WorkloadNodeExecOptions{Command: cmd}
	_, _, _, err = CLJClient.Exec(options)
	Expect(err).Should(BeNil())

	cmd = "bb test /usr/src/automate/clusterInfo.json 1 2 3 > test.log"
	options = resource.WorkloadNodeExecOptions{Command: cmd}
	_, _, _, err = CLJClient.Exec(options)
	Expect(err).Should(BeNil())
}

func HATestWithCCBWorkloadByTiUP(suiteTestCtx core.TestContext, ctx context.Context, tiupCluster *tiup.TiUPCluster, ccbloadClientAPIPrometheus v1.API, instancesCount InstancesCount, APIVersion int, RestorePathOnMinio string) {
	pdClientAddrs := GetPDAddrsToStr(tiupCluster)
	clusterInfo := GetRawKVClusterInfo(instancesCount, "tiup-0.tiup-peer:6330", "clientmonitor-0.clientmonitor-peer:9090")
	By("Before running testcases, importing some data into the cluster")
	if APIVersion == 1 {
		g, gctx := errgroup.WithContext(ctx)
		g.Go(func() error {
			return ImporterClientPrepareData(suiteTestCtx, gctx)
		})
		Expect(g.Wait()).Should(BeNil())
		ImportData(suiteTestCtx, ctx, "importer.properties", pdClientAddrs, 1, "Import Data")
		ImportData(suiteTestCtx, ctx, "importer-setstate.properties", pdClientAddrs, 2, "Set state")
		SetImporterRW(suiteTestCtx, ctx, pdClientAddrs, "R-W")
	} else {
		tiupWorkloadNode := suiteTestCtx.Resource("tiup").(resource.WorkloadNode)
		RawKVRestore("Restore 1e kv data", tiupWorkloadNode, pdClientAddrs, RestorePathOnMinio)
	}

	log.Info("Testcase runs")
	By("Start wrokload with 1w TPS")
	// TODO: Adjust TPS before running on prod
	wn := suiteTestCtx.Resource("workload0").(resource.WorkloadNode)
	LaunchCCBLoadClient(pdClientAddrs, wn, 0, instancesCount.WorkloadNodeCount, APIVersion, 0, 15, ctx)
	time.Sleep(10 * time.Minute)
	RunHATestCaseByCLJ(suiteTestCtx, ctx, tiupCluster, clusterInfo)
}
