import pytest
from src.enrichment import _generate_email_permutations, _is_valid_email, _normalize_name

def test_normalize_name():
    """Test the name normalization helper."""
    assert _normalize_name("John") == "john"
    assert _normalize_name("  DOE  ") == "doe"
    assert _normalize_name("Gérard") == "gerard"
    assert _normalize_name("Jean-Pierre") == "jean-pierre"
    assert _normalize_name("Munoz Ruiz") == "munoz-ruiz"
    assert _normalize_name("Müller") == "muller"
    assert _normalize_name("") == ""

def test_generate_email_permutations_basic():
    """Test basic email permutations for John Doe."""
    perms = _generate_email_permutations("John", "Doe", "example.com")

    # Check some expected patterns
    assert "john@example.com" in perms
    assert "doe@example.com" in perms
    assert "john.doe@example.com" in perms
    assert "doe.john@example.com" in perms
    assert "jdoe@example.com" in perms
    assert "j.doe@example.com" in perms
    assert "j-doe@example.com" in perms
    assert "j_doe@example.com" in perms

    # Ensure all are strings and contain @example.com
    for p in perms:
        assert isinstance(p, str)
        assert p.endswith("@example.com")

    # Ensure no duplicates
    assert len(perms) == len(set(perms))

def test_generate_email_permutations_normalization():
    """Test permutations with accents and mixed case."""
    perms = _generate_email_permutations("Gérard", "Müller", "Example.Com")

    assert "gerard.muller@Example.Com" in perms
    assert "muller.gerard@Example.Com" in perms
    assert "gmuller@Example.Com" in perms

def test_generate_email_permutations_compound_names():
    """Test permutations with compound names (spaces and hyphens)."""
    # Name with spaces
    perms_space = _generate_email_permutations("Jean Pierre", "De La Vega", "test.com")
    assert "jean-pierre.de-la-vega@test.com" in perms_space

    # Name with hyphens
    perms_hyphen = _generate_email_permutations("Jean-Pierre", "Polnareff", "test.com")
    assert "jean-pierre.polnareff@test.com" in perms_hyphen
    # Special cases for hyphens in first name
    assert "jeanpierre@test.com" in perms_hyphen
    assert "jp.polnareff@test.com" in perms_hyphen

def test_generate_email_permutations_empty_input():
    """Test that empty input returns an empty list."""
    assert _generate_email_permutations("", "Doe", "example.com") == []
    assert _generate_email_permutations("John", "", "example.com") == []
    assert _generate_email_permutations("", "", "example.com") == []

def test_generate_email_permutations_deduplication():
    """Test that permutations are deduplicated."""
    # If first name and last name are the same (unlikely but good for test)
    perms = _generate_email_permutations("John", "John", "example.com")
    assert len(perms) == len(set(perms))
    assert "john@example.com" in perms
    # Check that we don't have john.john@example.com twice if it were generated twice
    # patterns list has f.l and l.f, which would both be john.john here.
    count = sum(1 for p in perms if p == "john.john@example.com")
    assert count == 1


# --- Email validation tests ---

def test_is_valid_email_accepts_valid():
    """Test that valid emails are accepted."""
    assert _is_valid_email("jean.dupont@example.com") is True
    assert _is_valid_email("contact@entreprise.fr") is True
    assert _is_valid_email("j.p.martin@sub.domain.co") is True

def test_is_valid_email_rejects_brackets():
    """Test that emails with brackets are rejected."""
    assert _is_valid_email("[email protected]") is False
    assert _is_valid_email("<user@example.com>") is False
    assert _is_valid_email("(user@example.com)") is False

def test_is_valid_email_rejects_phone_numbers():
    """Test that phone numbers mistakenly parsed as emails are rejected."""
    assert _is_valid_email("514 425-4435") is False
    assert _is_valid_email("01.23.45.67.89@orange.fr") is False
    assert _is_valid_email("") is False
    assert _is_valid_email("not an email") is False
