package main

import (
	"flag"
	"fmt"
	"os"
	"strings"

	"github.com/awnumar/rosen/config"
)

var (
	modes = []string{"client", "server"}

	configure bool

	mode       string
	configFile string

	socksPort int
)

func main() {
	flag.BoolVar(&configure, "configure", false, "Specifies to run configuration client. All other flags are ignored.")

	flag.StringVar(&mode, "mode", "", strList(modes))
	flag.StringVar(&configFile, "config", "", "Path to configuration file generated by -configure")

	flag.IntVar(&socksPort, "socksPort", 23579, "Client-side port on which to start local SOCKS5 server.")

	flag.Parse()

	if configure {
		filename, err := config.Configure()
		if filename != "" {
			fmt.Println("\nConfig file path:", filename)
		}
		if err != nil {
			fmt.Println("error:", err)
			os.Exit(1)
		}
		return
	}

	if configFile == "" {
		help("configuration file must be specified")
	}

	if mode == "" {
		help("mode must be specified")
	}

	if !contains(modes, mode) {
		help("invalid mode specified")
	}

	conf, err := config.LoadConfig(configFile)
	if err != nil {
		fmt.Println("error:", err)
		os.Exit(1)
	}

	switch mode {
	case "client":
		if err := client(conf); err != nil {
			fmt.Println("error:", err)
		}
	case "server":
		if err := server(conf); err != nil {
			fmt.Println("error:", err)
		}
	}
}

func help(err string) {
	fmt.Println("error:", err)
	fmt.Printf("Usage of %s:\n", os.Args[0])
	flag.PrintDefaults()
	os.Exit(1)
}

func strList(list []string) string {
	return "One of " + strings.Join(list, ", ")
}

func contains(list []string, item string) bool {
	for _, v := range list {
		if item == v {
			return true
		}
	}
	return false
}
