package interfaces

import (
	"testing"

	"git.quad4.io/Networks/Reticulum-Go/pkg/common"
)

func TestNewUDPInterface(t *testing.T) {
	validAddr := "127.0.0.1:0" // Use port 0 for OS to assign a free port
	validTarget := "127.0.0.1:8080"
	invalidAddr := "invalid-address"

	t.Run("ValidConfig", func(t *testing.T) {
		ui, err := NewUDPInterface("udpValid", validAddr, validTarget, true)
		if err != nil {
			t.Fatalf("NewUDPInterface failed with valid config: %v", err)
		}
		if ui == nil {
			t.Fatal("NewUDPInterface returned nil interface with valid config")
		}
		if ui.GetName() != "udpValid" {
			t.Errorf("GetName() = %s; want udpValid", ui.GetName())
		}
		if ui.GetType() != common.IF_TYPE_UDP {
			t.Errorf("GetType() = %v; want %v", ui.GetType(), common.IF_TYPE_UDP)
		}
		if ui.targetAddr.String() != validTarget {
			t.Errorf("Resolved targetAddr = %s; want %s", ui.targetAddr.String(), validTarget)
		}
		if !ui.Enabled { // BaseInterface field
			t.Error("Interface not enabled by default when requested")
		}
		if ui.IsOnline() { // Should be offline initially
			t.Error("Interface online initially")
		}
	})

	t.Run("ValidConfigNoTarget", func(t *testing.T) {
		ui, err := NewUDPInterface("udpNoTarget", validAddr, "", true)
		if err != nil {
			t.Fatalf("NewUDPInterface failed with valid config (no target): %v", err)
		}
		if ui == nil {
			t.Fatal("NewUDPInterface returned nil interface with valid config (no target)")
		}
		if ui.targetAddr != nil {
			t.Errorf("targetAddr = %v; want nil", ui.targetAddr)
		}
	})

	t.Run("InvalidAddress", func(t *testing.T) {
		_, err := NewUDPInterface("udpInvalidAddr", invalidAddr, validTarget, true)
		if err == nil {
			t.Error("NewUDPInterface succeeded with invalid address")
		}
	})

	t.Run("InvalidTarget", func(t *testing.T) {
		_, err := NewUDPInterface("udpInvalidTarget", validAddr, invalidAddr, true)
		if err == nil {
			t.Error("NewUDPInterface succeeded with invalid target address")
		}
	})
}

func TestUDPInterfaceState(t *testing.T) {
	// Basic state tests are covered by BaseInterface tests
	addr := "127.0.0.1:0"
	ui, _ := NewUDPInterface("udpState", addr, "", true)

	if ui.conn != nil {
		t.Error("conn field is not nil before Start()")
	}

	// We don't call Start() here because it requires actual network binding
	// Testing Send requires Start() and a listener, which is too complex for unit tests here

	// Test Detach
	ui.Detach()
	if !ui.IsDetached() {
		t.Error("IsDetached() is false after Detach()")
	}

	// Further tests on Send/ProcessOutgoing/readLoop would require mocking net.UDPConn
	// or setting up a local listener.
}
