package main

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

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

var defaultPushMetricsInterval = 15 * time.Second

var (
	dbName      = flag.String("db", "test", "database name")
	totalRows   = flag.Int("total_rows", 500000, "the number of total rows")
	concurrency = flag.Int("concurrency", 200, "concurrency worker count")
)

func main() {
	client.Info("[reverse scan] start reverse scan")
	flag.Parse()

	ctx, cancel := context.WithCancel(context.Background())
	cli := client.New(ctx, client.ModeOnline)

	dbAddr := cli.TiDBService()
	dbDSN := fmt.Sprintf("root:@tcp(%s)/%s", dbAddr, *dbName)
	db, err := util.OpenDB(dbDSN, *concurrency)
	if err != nil {
		client.Fatalf("[reverse scan] create db client error %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("[reverse scan] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	metricsAddr := cli.PrometheusAddr()
	if len(metricsAddr) > 0 {
		go util.PushPrometheus("reverse_scan", metricsAddr, defaultPushMetricsInterval)
	}

	cfg := Config{
		TotalRows:   *totalRows,
		Concurrency: *concurrency,
	}
	revserse_scan := NewReverseScanCase(&cfg)
	if err := revserse_scan.Initialize(ctx, db); err != nil {
		client.Fatalf("[reverse scan] initial failed %v", err)
	}

	if err := revserse_scan.Execute(ctx, db); err != nil {
		client.Fatalf("[reverse scan] return with error %v", err)
	}
}
