package main

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

	"git.loafle.net/commons/configuration-go"
	"git.loafle.net/commons/logging-go"
	"git.loafle.net/overflow/member_gateway_rpc/config"
	"git.loafle.net/overflow/member_gateway_rpc/server"
)

var (
	configDir *string
)

func init() {
	configDir = flag.String("config-dir", "./", "Config directory")
	logConfigPath := flag.String("log-config", "", "logging config path")
	flag.Parse()

	logging.InitializeLogger(*logConfigPath)
}

func main() {
	_config := &config.Config{}
	configuration.SetConfigPath(*configDir)
	if err := configuration.Load(_config, "config.json"); nil != err {
		logging.Logger().Panic(err)
	}

	s := server.New(*configDir, _config)

	go func() {
		err := s.ListenAndServe()
		if nil != err {
			log.Printf("err: %v", err)
		}
	}()

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

	<-interrupt
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := s.Shutdown(ctx); err != nil {
		logging.Logger().Errorf("error: %v", err)
	}
}
