package kvm

import (
	"net"

	"github.com/pion/mdns/v2"
	"golang.org/x/net/ipv4"
	"golang.org/x/net/ipv6"
)

var mDNSConn *mdns.Conn

func startMDNS() error {
	// If server was previously running, stop it
	if mDNSConn != nil {
		logger.Info().Msg("stopping mDNS server")
		err := mDNSConn.Close()
		if err != nil {
			logger.Warn().Err(err).Msg("failed to stop mDNS server")
		}
	}

	// Start a new server
	hostname := "jetkvm.local"

	scopedLogger := logger.With().Str("hostname", hostname).Logger()
	scopedLogger.Info().Msg("starting mDNS server")

	addr4, err := net.ResolveUDPAddr("udp4", mdns.DefaultAddressIPv4)
	if err != nil {
		return err
	}

	addr6, err := net.ResolveUDPAddr("udp6", mdns.DefaultAddressIPv6)
	if err != nil {
		return err
	}

	l4, err := net.ListenUDP("udp4", addr4)
	if err != nil {
		return err
	}

	l6, err := net.ListenUDP("udp6", addr6)
	if err != nil {
		return err
	}

	mDNSConn, err = mdns.Server(ipv4.NewPacketConn(l4), ipv6.NewPacketConn(l6), &mdns.Config{
		LocalNames:    []string{hostname}, //TODO: make it configurable
		LoggerFactory: defaultLoggerFactory,
	})
	if err != nil {
		scopedLogger.Warn().Err(err).Msg("failed to start mDNS server")
		mDNSConn = nil
		return err
	}
	//defer server.Close()
	return nil
}