package main

import (
	"flag"
	"os"
	"os/signal"
	"syscall"

	"fmt"
	"github.com/pingcap/schrodinger-test/util"
	"github.com/pingcap/schrodinger/pkg/test_client"
	"golang.org/x/net/context"
)

var (
	pwd             = flag.String("pwd", "", "password")
	database        = flag.String("db", "test", "database")
	table           = flag.String("table", "region_available", "region available table name")
	totalRows       = flag.Int("rows", 500000, "total rows")
	maxRespDuration = flag.Int("max-resp-dur", 2, "max response duration in seconds")
	concurrency     = flag.Int("concurrency", 1, "concurrency read worker count")
	sleepDuration   = flag.Int("sleep-dur", 0, "sleep duration between two queries in milliseconds")
	runMode         = flag.String("run-mode", "online", "case mode, support values: online / dev, default value: online")
)

func main() {
	client.Info("[region available] start regoin available test")
	flag.Parse()

	ctx, cancel := context.WithCancel(context.Background())
	cli := client.New(ctx, func(mode string) (clientMode client.Mode) {
		switch client.Mode(mode) {
		case client.ModeOnline:
			clientMode = client.ModeOnline
		case client.ModeDev:
			clientMode = client.ModeDev
		default:
			client.Fatalf("[region available] Invalid mode: %v,support values: online / dev", mode)
		}
		client.Info("Mode:", clientMode)
		return clientMode
	}(*runMode))

	dbAddr := cli.TiDBService()
	dbDNS := fmt.Sprintf("root:%s@tcp(%s)/%s", *pwd, dbAddr, *database)
	client.Info("dbDNS: ", dbDNS)
	db, err := util.OpenDB(dbDNS, *concurrency)
	if err != nil {
		client.Fatalf("[region available] create db client err %v", err)
	}

	sc := make(chan os.Signal, 1)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)
	go func() {
		sig := <-sc
		client.Infof("[region available] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	availableDetector, err := NewRegionAvailableDetector(db, *database, *table, *totalRows, *maxRespDuration, *sleepDuration, *concurrency)
	if err != nil {
		client.Fatalf("[region available] new region available detector failed %v", err)
	}
	if err = availableDetector.Initialize(); err != nil {
		client.Fatalf("[region available] initial failed %v", err)
	}
	availableDetector.Execute(ctx)
}
