package main

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

	log "github.com/sirupsen/logrus"
)

var (
	driver = flag.String("driver", "mysql", "database driver name, support 'mysql', 'postgres'")
	dsn    = flag.String("dsn", "root:@tcp(127.0.0.1:4000)/test", `data source name
MySQL: root:@tcp(127.0.0.1:4000)/test
PostgreSQL: postgres://root:@127.0.0.1:5432/postgres?sslmode=disable
`)
	create   = flag.Bool("create", false, "create new tables for test")
	insert   = flag.Bool("insert", false, "insert data for test")
	accounts = flag.Int("accounts", 1000000, "the number of the bank accounts")
	interval = flag.Duration("interval", 2*time.Second, "verify interval")
	threads  = flag.Int("threads", 10, "threads count")
)

var remark = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXVZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXVZlkjsanksqiszndqpijdslnnq"

func main() {
	flag.Parse()

	log.Info("Data source name: ", *dsn)
	db, err := OpenDB(*dsn, *driver)
	if err != nil {
		log.Fatalf("Open database error %v", err)
	}

	sc := make(chan os.Signal, 1)

	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)

	go func() {
		sig := <-sc
		log.Infof("Got signal [%s] to exist.", sig)
		os.Exit(0)
	}()

	cfg := config{
		Accounts: *accounts,
		Interval: *interval,
		Threads:  *threads,
	}

	bank := newBankCase(&cfg)
	if err := bank.initialize(db, *create, *insert); err != nil {
		log.Fatalf("Initial failed %v", err)
	}

	bank.execute(db)
}
