package main

import (
	"context"
	"flag"
	"log"
	"strings"
	"time"

	"github.com/pingcap/chaos/cmd/util"
	"github.com/pingcap/chaos/db/rawkv"
	"github.com/pingcap/chaos/pkg/check/porcupine"
	"github.com/pingcap/chaos/pkg/control"
	"github.com/pingcap/chaos/pkg/core"
	"github.com/pingcap/chaos/pkg/model"
	"github.com/pingcap/chaos/pkg/verify"
	client "github.com/pingcap/schrodinger/pkg/test_client"
)

var (
	round        = flag.Int("round", 100000, "client test request count")
	requestCount = flag.Int("request-count", 1000, "client test request count")
	runTime      = flag.Duration("run-time", 10*time.Minute, "client test run time")
	clientCase   = flag.String("case", "register", "client test case, like register")
	historyFile  = flag.String("history", "./history.log", "history file")
)

func main() {
	flag.Parse()
	ctx := context.Background()
	cli := client.New(ctx, client.ModeOnline)
	// An example of pd address: 10.128.28.35:2379
	nodes := cli.PDs()
	// Trim ports.
	for i, n := range nodes {
		parts := strings.Split(n, ":")
		nodes[i] = parts[0]
	}
	cfg := control.Config{
		// "noop" db is enough, schrodinger starts up TiKV cluster
		// automatically.
		DB:           "noop",
		RequestCount: *requestCount,
		RunRound:     *round,
		RunTime:      *runTime,
		History:      *historyFile,
	}
	var creator core.ClientCreator
	switch *clientCase {
	case "register":
		creator = rawkv.RegisterClientCreator{}
	default:
		log.Fatalf("invalid client test case %s", *clientCase)
	}
	verifySuit := verify.Suit{
		Model:   model.RegisterModel(),
		Checker: porcupine.Checker{},
		Parser:  model.RegisterParser(),
	}
	suit := util.Suit{
		Config:        &cfg,
		ClientCreator: creator,
		VerifySuit:    verifySuit,
		// We dont need to set up nemesis, because schrodinger has its
		// built-in failure injection.
		// Nemesises:     *nemesises,
	}
	suit.Run(ctx, nodes)
}
