package main

import (
	"flag"
	"net"
	"net/http"
	_ "net/http/pprof"
	"os"
	"os/signal"
	"syscall"

	"github.com/pingcap/log"
	"github.com/tidbcloud/ffs/config"
	"github.com/tidbcloud/ffs/pkg/v1/proto"
	"github.com/tidbcloud/ffs/throttler"
	"github.com/tidbcloud/ffs/util/logutil"
	"github.com/tidbcloud/ffs/util/netutil"
	"google.golang.org/grpc"
)

var (
	universe      = flag.String("universe", "localhost:9091,localhost:19091,localhost:29091", "The universe endpoints in the format of host:port,host:port")
	zone          = flag.String("zone", "zone-1", "The zone name")
	serverAddr    = flag.String("addr", "localhost:9095", "The server address in the format of host:port")
	advertiseAddr = flag.String("advertise-addr", "", "advertise address")
	statusAddr    = flag.String("status-addr", "localhost:6065", "status address")
	logLevel      = flag.String("log-level", "info", "log level: info, debug, warn, error, fatal")
)

var (
	gitHash = "None"
)

func main() {
	flag.Parse()
	logutil.SetLevel(*logLevel)
	log.S().Infof("gitHash: %s", gitHash)

	port := netutil.ParsePort(*serverAddr)
	if len(port) == 0 {
		log.S().Fatalf("failed to parse port: %v", *serverAddr)
	}
	lis, err := net.Listen("tcp", ":"+port)
	if err != nil {
		log.S().Fatalf("failed to listen: %v", err)
	}
	log.S().Infof("server listening at %v", lis.Addr())

	s := grpc.NewServer(
		grpc.MaxRecvMsgSize(config.GrpcMaxMsgSize),
		grpc.MaxSendMsgSize(config.GrpcMaxMsgSize),
	)
	if len(*advertiseAddr) == 0 {
		*advertiseAddr = netutil.GetLocalIP() + ":" + port
	}
	throttlerSvr := throttler.NewThrottlerServer(*universe, *zone, *advertiseAddr)
	proto.RegisterThrottlingServiceServer(s, throttlerSvr)

	go http.ListenAndServe(*statusAddr, nil)
	go s.Serve(lis)
	sigCh := make(chan os.Signal, 1)
	signal.Notify(sigCh,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT)
	sig := <-sigCh
	log.S().Infof("got signal [%s] to exit.", sig)
	throttlerSvr.Stop()
}
