package main

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

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

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

	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("[lightning] Got signal [%s] to exist.", sig)
		cancel()
		os.Exit(0)
	}()

	importer, err := setUpImporter(cli)
	if err != nil {
		client.Fatalf("[lightning] return with error %v", client.ErrorStack(err))
	}
	tidbServiceIP := strings.Split(cli.TiDBService(), ":")[0]
	pdServiceIP := strings.Split(cli.PdService(), ":")[0]
	lightning, err := setUpLightning(cli, importer.Host, tidbServiceIP, pdServiceIP)
	if err != nil {
		client.Fatalf("[lightning] return with error %v", client.ErrorStack(err))
	}

	nemesisCli := newNemesis(importer.Host, lightning.Host)
	ctrl := newController(ctx, nemesisCli, tidbServiceIP)
	client.Debugf("importer %+v, lightning %+v", importer, lightning)

	go ctrl.startNemesis()
	go ctrl.check()

	for {
		client.Debugf("loop")
		select {
		case <-ctrl.done:
			client.Infof("all test pass")
			return
		case err := <-ctrl.errCh:
			client.Fatalf("[lightning] executer ddl task failed %v", client.ErrorStack(err))
		default:
		}
		time.Sleep(5 * time.Second)
	}
}
