package main

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

	"go.uber.org/zap"

	"tiup-log-collector/config"
	"tiup-log-collector/log"
	"tiup-log-collector/web"
)

func StartApp(cfg *config.Config) error {
	var err error

	err = log.InitLogger(log.CreateLoggersConfig(cfg.Debug, cfg.Log))
	if err != nil {
		_, _ = fmt.Fprintln(os.Stderr, "Failed to init logger: ", err.Error())
		os.Exit(1)
	}

	watchSignal()

	// block when web server start successfully, will continue when server shutdown.
	err = web.StartWebServer(&cfg.Web)
	if err != nil {
		log.L().Error("Failed to start web server", zap.Error(err))
	}

	log.SyncAllLogs()
	return err
}

// watchSignal returns wait watch function
func watchSignal() {
	sc := make(chan os.Signal, 3)
	signal.Notify(sc,
		syscall.SIGHUP,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT,
		syscall.SIGUSR2,
	)

	go func() {
		for {
			sig := <-sc
			if sig == syscall.SIGUSR2 {
				log.L().Info("Got signal to reopen log file", zap.Stringer("signal", sig))
				log.ReopenAllLoggers()
			} else {
				log.L().Info("Got signal to exit", zap.Stringer("signal", sig))
				web.ShutdownWebServer()
				break
			}
		}
	}()
}
