package mail

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestNormalizedSenderAddressNormalizesOnlyDomain(t *testing.T) {
	t.Parallel()

	canonical, err := CanonicalSenderAddress(
		"CaseSensitive@EXAMPLE.COM",
	)
	require.NoError(t, err)
	require.Equal(t, "CaseSensitive@example.com", canonical)

	unicodeDomain, err := CanonicalSenderAddress(
		"CaseSensitive@例子.测试",
	)
	require.NoError(t, err)
	require.Equal(
		t,
		"CaseSensitive@xn--fsqu00a.xn--0zwm56d",
		unicodeDomain,
	)
}

func TestNormalizedSenderAddressRejectsDisplayNameAndMalformedInput(
	t *testing.T,
) {
	t.Parallel()

	for _, value := range []string{
		"",
		"User <user@example.com>",
		"not-an-address",
		"missing-domain@",
	} {
		_, err := CanonicalSenderAddress(value)
		require.Error(t, err, value)
	}
}

func TestExternalSubjectRefIsStableKeyedAndLocalPartSensitive(
	t *testing.T,
) {
	t.Parallel()

	key := []byte(strings.Repeat("k", 32))
	upperDomain, err := ExternalSubjectRef(
		key,
		"CaseSensitive@EXAMPLE.COM",
	)
	require.NoError(t, err)
	lowerDomain, err := ExternalSubjectRef(
		key,
		"CaseSensitive@example.com",
	)
	require.NoError(t, err)
	lowerLocal, err := ExternalSubjectRef(
		key,
		"casesensitive@example.com",
	)
	require.NoError(t, err)
	otherKey, err := ExternalSubjectRef(
		[]byte(strings.Repeat("z", 32)),
		"CaseSensitive@example.com",
	)
	require.NoError(t, err)

	require.Equal(t, upperDomain, lowerDomain)
	require.NotEqual(t, upperDomain, lowerLocal)
	require.NotEqual(t, upperDomain, otherKey)
	require.Regexp(t, `^email:h1:[0-9a-f]{64}$`, upperDomain)
	require.NotContains(t, upperDomain, "example.com")
	require.NotContains(t, upperDomain, "CaseSensitive")
}

func TestExternalSubjectRefRejectsWeakKey(t *testing.T) {
	t.Parallel()

	_, err := ExternalSubjectRef(
		[]byte("short"),
		"user@example.com",
	)
	require.ErrorContains(t, err, "unavailable")
}
