package main

import (
	"context"
	"os"
	"os/signal"
	"syscall"

	"github.com/xvzc/SpoofDPI/util/log"

	"github.com/xvzc/SpoofDPI/proxy"
	"github.com/xvzc/SpoofDPI/util"
	"github.com/xvzc/SpoofDPI/version"
)

func main() {
	args := util.ParseArgs()
	if args.Version {
		version.PrintVersion()
		os.Exit(0)
	}

	config := util.GetConfig()
	config.Load(args)

	log.InitLogger(config)
	ctx := util.GetCtxWithScope(context.Background(), "MAIN")
	logger := log.GetCtxLogger(ctx)

	pxy := proxy.New(config)

	if config.Banner {
		util.PrintColoredBanner()
	} else {
		util.PrintSimpleInfo()
	}

	if config.SystemProxy {
		if err := util.SetOsProxy(uint16(config.Port)); err != nil {
			logger.Fatal().Msgf("error while changing proxy settings: %s", err)
		}
		defer func() {
			if err := util.UnsetOsProxy(); err != nil {
				logger.Fatal().Msgf("error while disabling proxy: %s", err)
			}
		}()
	}

	go pxy.Start(context.Background())

	// Handle signals
	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)

	signal.Notify(
		sigs,
		syscall.SIGKILL,
		syscall.SIGINT,
		syscall.SIGTERM,
		syscall.SIGQUIT,
		syscall.SIGHUP)

	go func() {
		_ = <-sigs
		done <- true
	}()

	<-done
}