package xmpp

import (
	"strings"
	"testing"
)

func TestParseAddr(t *testing.T) {
	tests := []struct {
		name  string
		input string
		want  string
	}{
		{name: "ipv4-no-port-1", input: "localhost", want: "localhost:5222"},
		{name: "ipv4-with-port-1", input: "localhost:5555", want: "localhost:5555"},
		{name: "ipv4-no-port-2", input: "127.0.0.1", want: "127.0.0.1:5222"},
		{name: "ipv4-with-port-2", input: "127.0.0.1:5555", want: "127.0.0.1:5555"},
		{name: "ipv6-no-port-1", input: "::1", want: "[::1]:5222"},
		{name: "ipv6-no-port-2", input: "[::1]", want: "[::1]:5222"},
		{name: "ipv6-no-port-3", input: "2001::7334", want: "[2001::7334]:5222"},
		{name: "ipv6-no-port-4", input: "2001:db8:85a3:0:0:8a2e:370:7334", want: "[2001:db8:85a3:0:0:8a2e:370:7334]:5222"},
		{name: "ipv6-with-port-1", input: "[::1]:5555", want: "[::1]:5555"},
	}
	for _, tc := range tests {
		t.Run(tc.name, func(st *testing.T) {
			addr := ensurePort(tc.input, 5222)

			if addr != tc.want {
				st.Errorf("incorrect Result: %v (!= %v)", addr, tc.want)
			}
		})
	}
}

func TestEnsurePort(t *testing.T) {
	testAddresses := []string{
		"1ca3:6c07:ee3a:89ca:e065:9a70:71d:daad",
		"1ca3:6c07:ee3a:89ca:e065:9a70:71d:daad:5252",
		"[::1]",
		"127.0.0.1:5555",
		"127.0.0.1",
		"[::1]:5555",
	}

	for _, oldAddr := range testAddresses {
		t.Run(oldAddr, func(st *testing.T) {
			newAddr := ensurePort(oldAddr, 5222)

			if len(newAddr) < len(oldAddr) {
				st.Errorf("incorrect Result: transformed address is shorter than input : %v (old) > %v (new)", newAddr, oldAddr)
			}
			// If IPv6, the new address needs brackets to specify a port, like so : [2001:db8:85a3:0:0:8a2e:370:7334]:5222
			if strings.Count(newAddr, "[") < strings.Count(oldAddr, "[") ||
				strings.Count(newAddr, "]") < strings.Count(oldAddr, "]") {

				st.Errorf("incorrect Result. Transformed address seems to not have correct brakets : %v => %v", oldAddr, newAddr)
			}

			// Check if we messed up the colons, or didn't properly add a port
			if strings.Count(newAddr, ":") < strings.Count(oldAddr, ":") {
				st.Errorf("incorrect Result: transformed address doesn't seem to have a port %v (=> %v, no port ?)", oldAddr, newAddr)
			}
		})
	}

}