"""Tests para guess_email_formats."""

from guess_email_formats import guess_email_formats


def test_nombre_simple_un_apellido():
    """Nombre simple con un apellido produce los patrones base."""
    result = guess_email_formats("Juan", "Perez", "empresa.com")
    assert "juan.perez@empresa.com" in result
    assert "juanperez@empresa.com" in result
    assert "j.perez@empresa.com" in result
    assert "jperez@empresa.com" in result
    assert "juan_perez@empresa.com" in result
    assert "perez.juan@empresa.com" in result
    assert "juan@empresa.com" in result
    # Sin segundo apellido no hay variantes unidas.
    assert all("@empresa.com" in e for e in result)


def test_acentos_y_enie_normalizados():
    """Acentos y ñ se transliteran a ASCII en minusculas."""
    result = guess_email_formats("José", "Muñoz", "acme.org")
    assert "jose.munoz@acme.org" in result
    assert "j.munoz@acme.org" in result
    # No debe aparecer ningun caracter no ASCII.
    for email in result:
        assert email == email.encode("ascii", "ignore").decode("ascii")


def test_dos_apellidos_genera_variantes_unidas():
    """Dos apellidos producen variantes que los unen."""
    result = guess_email_formats("Maria", "Garcia Lopez", "uni.edu")
    assert "maria.garcialopez@uni.edu" in result
    assert "mariagarcialopez@uni.edu" in result
    assert "maria.lopez@uni.edu" in result
    assert "mgarcialopez@uni.edu" in result
    # El patron de primer apellido sigue presente.
    assert "maria.garcia@uni.edu" in result


def test_dedup_preserva_orden():
    """Los candidatos no se repiten y mantienen el orden de generacion."""
    result = guess_email_formats("Ana", "Ruiz", "x.com")
    assert len(result) == len(set(result))
    # nombre.apellido aparece antes que apellido.nombre.
    assert result.index("ana.ruiz@x.com") < result.index("ruiz.ana@x.com")


def test_dominio_con_arroba_se_limpia():
    """Un dominio prefijado con @ se normaliza sin duplicar la arroba."""
    result = guess_email_formats("Luis", "Soto", "@corp.io")
    assert "luis.soto@corp.io" in result
    assert all(e.count("@") == 1 for e in result)
