package authidentity

import (
	"testing"

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

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

	emailIdentifier, err := ResolveLoginIdentifier(" Alice@Example.com ")
	require.NoError(t, err)
	require.Equal(t, KindEmail, emailIdentifier.Kind)
	require.Equal(t, "alice@example.com", emailIdentifier.Value)

	mobileIdentifier, err := ResolveLoginIdentifier(" +1 (555) 123-4567 ")
	require.NoError(t, err)
	require.Equal(t, KindMobile, mobileIdentifier.Kind)
	require.Equal(t, "+15551234567", mobileIdentifier.Value)
}

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

	normalized, err := NormalizeMobile("138 0013 8000")
	require.NoError(t, err)
	require.Equal(t, "+8613800138000", normalized)

	normalized, err = NormalizeMobile("86-13800138000")
	require.NoError(t, err)
	require.Equal(t, "+8613800138000", normalized)
}

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

	_, err := NormalizeMobile("5551234567")
	require.EqualError(t, err, "invalid mobile number")

	_, err = NormalizeMobile("123456")
	require.EqualError(t, err, "invalid mobile number")
}

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

	normalizedEmail, err := NormalizeEmailAllowlistPattern(" Alice@Example.com ")
	require.NoError(t, err)
	require.Equal(t, "alice@example.com", normalizedEmail)

	normalizedDomain, err := NormalizeEmailAllowlistPattern(" @Example.com ")
	require.NoError(t, err)
	require.Equal(t, "@example.com", normalizedDomain)
}

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

	require.True(t, EmailMatchesAllowlistPattern("alice@example.com", "alice@example.com"))
	require.True(t, EmailMatchesAllowlistPattern("Alice@Example.com", "@example.com"))
	require.False(t, EmailMatchesAllowlistPattern("alice@sub.example.com", "@example.com"))
	require.False(t, EmailMatchesAllowlistPattern("bob@other.com", "@example.com"))
}

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

	require.Equal(t, "+1555*****67", RedactMobile("+15551234567"))
	require.Equal(t, "+8613*******00", RedactMobile("+8613800000000"))
}
