from email_enrichment.naming import clean_for_local_part, fold_to_ascii, parse_name


def test_parse_simple():
    p = parse_name("Jon Mitchell")
    assert p.first == "Jon"
    assert p.last == "Mitchell"
    assert p.nickname is None


def test_parse_with_nickname():
    p = parse_name("Andrew (Andy) Hart")
    assert p.first == "Andrew"
    assert p.last == "Hart"
    assert p.nickname == "Andy"


def test_parse_drops_academic_degrees():
    p = parse_name("Onyeka Okwuagwu BEng, MSc, CSCP")
    assert p.first == "Onyeka"
    assert p.last == "Okwuagwu"


def test_parse_uppercase_with_prefix():
    p = parse_name("MS. LOUISA SERENC SCHNEIDER")
    assert p.first and p.first.lower() == "louisa"
    assert p.last and p.last.lower() == "schneider"


def test_parse_with_title_in_parens_is_stripped():
    # "(Co-founder & CEO)" is NOT a nickname (multi-word), should be stripped
    # without polluting first/last.
    p = parse_name("Noura Sakkijha (Co-founder & CEO)")
    assert p.first == "Noura"
    assert p.last == "Sakkijha"
    assert p.nickname is None


def test_fold_to_ascii_accents():
    assert fold_to_ascii("Émile") == "Emile"
    assert fold_to_ascii("Sørensen") == "Sorensen"
    assert fold_to_ascii("Müller") == "Muller"


def test_clean_for_local_part_strips_specials():
    assert clean_for_local_part("Jean-Pierre") == "jeanpierre"
    assert clean_for_local_part("O'Brien") == "obrien"
    assert clean_for_local_part("Émile ") == "emile"


# --- ADVMFR real-world CSV edge cases ---


def test_parse_strips_lkn_marker():
    p = parse_name("Adina Reyter >> LKN")
    assert p.first == "Adina"
    assert p.last == "Reyter"

    p = parse_name("JinaChang>>LKN")
    assert p.first == "Jina"
    assert p.last == "Chang"

    # Pure marker should yield empty.
    p = parse_name(">> LKN")
    assert p.first is None
    assert p.last is None


def test_parse_cuts_title_separator():
    # "Ana C- Manager" — "- " is the title separator.
    p = parse_name("Ana C- Manager")
    assert p.first == "Ana"
    assert p.last == "C"

    p = parse_name("Natalie Dueñas- Procurement and vendor management")
    assert p.first == "Natalie"
    assert p.last == "Dueñas"

    p = parse_name("Pau lRice - Vp of Ecommerce")
    assert p.first == "Pau"
    # "lRice" is a typo in the source; just make sure we don't take "Ecommerce"
    # as the last name.
    assert p.last and "commerce" not in p.last.lower()

    p = parse_name("Jordan Meyer - VP")
    assert p.first == "Jordan"
    assert p.last == "Meyer"


def test_parse_strips_leading_role_prefix():
    p = parse_name("Co-Owner Taylor Moody")
    assert p.first == "Taylor"
    assert p.last == "Moody"

    p = parse_name("MR. ANDREW HART")
    assert p.first and p.first.lower() == "andrew"
    assert p.last and p.last.lower() == "hart"


def test_parse_splits_concatenated_camel_case():
    p = parse_name("NicciCaton")
    assert p.first == "Nicci"
    assert p.last == "Caton"

    p = parse_name("DaniellaYacobovsky")
    assert p.first == "Daniella"
    assert p.last == "Yacobovsky"


def test_parse_handles_multi_person_with_shared_lastname():
    # "Jason & Gorjana Reidel" — the last named person is "Gorjana Reidel".
    p = parse_name("Jason & Gorjana Reidel")
    assert p.first == "Gorjana"
    assert p.last == "Reidel"

    p = parse_name("Lauren Weiner & Hanna Thaler")
    assert p.first == "Hanna"
    assert p.last == "Thaler"


def test_parse_empty_and_noise():
    assert parse_name("").first is None
    assert parse_name(">>").first is None
    assert parse_name(">> LKN").first is None
