package main

import (
	"flag"
	"log"
	"os"
	"os/signal"
	"strings"
	"syscall"

	"tailscale-clone/internal/client"
)

func main() {
	var (
		controllerAddr = flag.String("controller", "localhost:8080", "Controller address")
		nodeName       = flag.String("name", "", "Node name (required)")
		interfaceName  = flag.String("interface", "utun0", "WireGuard interface name")
		subnetRouter   = flag.Bool("subnet-router", false, "Enable subnet router mode")
		subnets        = flag.String("subnets", "", "Comma-separated list of subnets to advertise (e.g., 192.168.1.0/24,10.0.1.0/24)")
	)
	flag.Parse()

	if *nodeName == "" {
		log.Fatal("Node name is required (use -name flag)")
	}

	// Check if running as root on macOS
	if os.Geteuid() != 0 {
		log.Println("Warning: Not running as root. Some features may not work.")
		log.Println("For full functionality, please run with sudo.")
	}

	// Create client
	c, err := client.New(*controllerAddr, *nodeName, *interfaceName)
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}

	// Configure subnet router if enabled
	if *subnetRouter {
		if *subnets == "" {
			log.Fatal("Subnets are required when subnet router mode is enabled (use -subnets flag)")
		}
		
		subnetList := strings.Split(*subnets, ",")
		for i, subnet := range subnetList {
			subnetList[i] = strings.TrimSpace(subnet)
		}
		
		c.SetSubnetRouter(subnetList)
		log.Printf("Subnet router mode enabled, advertising: %v", subnetList)
	}

	// Start client
	if err := c.Start(); err != nil {
		log.Fatalf("Failed to start client: %v", err)
	}

	log.Printf("macOS client started, connected to %s", *controllerAddr)
	log.Printf("Node name: %s", *nodeName)
	if *subnetRouter {
		log.Printf("Subnet router mode: enabled")
	}

	// Wait for shutdown signal
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	log.Println("Shutting down macOS client...")
	c.Stop()
} 