package main

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

	"github.com/juju/errors"
	"github.com/ngaut/log"
	"github.com/pingcap/wormhole/ether"
	"github.com/pingcap/wormhole/ether/api"
	"github.com/pingcap/wormhole/pkg/util"
)

func main() {
	cfg := ether.NewConfig()
	err := cfg.Parse(os.Args[1:])

	if cfg.Version {
		util.PrintInfo()
		os.Exit(0)
	}

	switch errors.Cause(err) {
	case nil:
	case flag.ErrHelp:
		os.Exit(0)
	default:
		log.Fatalf("[ether] parse cmd flags error: %s\n", err)
	}

	log.SetLevelByString(cfg.LogLevel)
	if len(cfg.LogFile) > 0 {
		log.SetOutputByName(cfg.LogFile)
		if cfg.LogRotate == "hour" {
			log.SetRotateByHour()
		} else {
			log.SetRotateByDay()
		}
	} else {
		log.SetHighlighting(true)
	}
	log.Infof("[ether] git_hash %s, build_time %s", util.GitHash, util.BuildTS)

	err = ether.PrepareJoinCluster(cfg)
	if err != nil {
		log.Fatal("[ether] join error ", errors.ErrorStack(err))
	}
	svr := ether.CreateServer(cfg)
	err = svr.StartEtcd(api.NewHandler(svr))
	if err != nil {
		log.Fatalf("[ether] server start etcd failed - %v", errors.ErrorStack(err))
	}

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

	go svr.Run()

	sig := <-sc
	svr.Close()
	log.Infof("[ether] Got signal [%d] to exit.", sig)
	switch sig {
	case syscall.SIGTERM:
		os.Exit(0)
	default:
		os.Exit(1)
	}
}
