package main

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

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

var (
	dbName    string
	mysqlIP   string
	mysqlPort string
	mysqlPwd  string
	tidbIP    string
	tidbPort  string
	tidbPwd   string
	user      string
)

func init() {
	flag.StringVar(&dbName, "db", "randgen", "database name")
	flag.StringVar(&mysqlIP, "mysqlIP", "10.0.1.5", "mysql server IP")
	flag.StringVar(&mysqlPort, "mysqlPort", "3306", "mysql server port")
	flag.StringVar(&mysqlPwd, "mysqlPwd", "mysql", "mysql server password")
	flag.StringVar(&tidbIP, "tidbIP", "127.0.0.1", "tidb server IP")
	flag.StringVar(&tidbPort, "tidbPort", "4000", "tidb server port")
	flag.StringVar(&tidbPwd, "tidbPwd", "", "tidb server password")
	flag.StringVar(&user, "user", "root", "connect user")
}

func main() {
	flag.Parse()

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

	sc := make(chan os.Signal, 1)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)

	go func() {
		sig := <-sc
		client.Infof("[randgen] Got signal [%d] to exit.", sig)
		cancel()
		os.Exit(0)
	}()

	tidbDSN, mysqlDSN := fetchDSNs(cli)
	cfg := &RandGenCaseConfig{
		tidbDSN:  tidbDSN,
		mysqlDSN: mysqlDSN,
	}
	client.Info("[randgen] config: %v", cfg)
	client.Info("[randgen] start randgen")

	cases := NewRandGenCase(cfg)
	for _, c := range cases {
		if err := c.Execute(); err != nil {
			client.Fatalf("[randgen] return with error %v", err)
		}
	}
}

func fetchDSNs(cli *client.Client) (string, string) {
	tidbAddr := strings.Split(cli.TiDBService(), ":")
	tidbIP, tidbPort := tidbAddr[0], tidbAddr[1]
	tidbDSN := fmt.Sprintf("dbi:mysql:host=%s:port=%s:user=%s:database=%s", tidbIP, tidbPort, user, dbName)
	mysqlDSN := fmt.Sprintf("dbi:mysql:host=%s:port=%s:user=%s:database=%s", mysqlIP, mysqlPort, user, dbName)
	if mysqlPwd != "" {
		mysqlDSN += ":password=" + mysqlPwd
	}
	if tidbPwd != "" {
		tidbDSN += ":password=" + tidbPwd
	}
	return tidbDSN, mysqlDSN
}
