package main

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

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

var (
	dbName       = flag.String("db", "test", "database name. default: test")
	concurrency  = flag.Int("concurrency", 200, "concurrency of sql.DB. default: 200")
	timeLimit    = flag.Int64("time", 180, "time limit (in minutes) to run the test. pass 0 to run forever. no less than 60. default: 60")
	maxTableSize = flag.Int("max-table-size", 100000, "max size of each table. default: 100000")
)

func main() {
	client.Info("[gc unsafe destroy range] start...")
	flag.Parse()

	if *timeLimit < 60 {
		client.Infof("[gc unsafe destroy range] Run time limit was set less than 60 minutes. The actual time limit will be 60 minutes.")
		*timeLimit = 60
	}

	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*timeLimit)*time.Minute)
	cli := client.New(ctx, client.ModeOnline)
	//Monitoring system exit message
	sc := make(chan os.Signal, 1)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)
	go func() {
		sig := <-sc
		client.Infof("[gc unsafe destroy range] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	dbAddr := cli.TiDBService()
	dbDSN := fmt.Sprintf("root:@tcp(%s)/%s", dbAddr, *dbName)
	db, err := util.OpenDB(dbDSN, *concurrency)
	if err != nil {
		client.Fatalf("[gc unsafe destroy range] OpenDB error %v", errors.Trace(err))
	}
	defer db.Close()

	unsafeDestroyRangeCase := NewGCUnsafeDestroyRangeCase(db, *dbName, *maxTableSize)

	err = unsafeDestroyRangeCase.Run(ctx)
	if err != nil {
		client.Fatal("[gc unsafe destroy range] Test failed, err: %v", err)
	}
}
