from app.mapping import FieldKey, match_columns
from app.normalize import (
    combine_street,
    format_zip,
    is_empty,
    normalize_header,
    normalize_plate,
    normalize_vin,
)


def test_empty_placeholders() -> None:
    for value in ["", "-", "--", "---", "N/A", "NA", "NULL", "None", "nan", "nicht vorhanden", "unbekannt"]:
        assert is_empty(value)


def test_plate_normalization_variants() -> None:
    expected = "KISD221"
    for value in ["KI-SD 221", "KI-SD221", "KI SD 221", "KISD221", "ki-sd221"]:
        assert normalize_plate(value) == expected


def test_vin_normalization() -> None:
    assert normalize_vin("YV1XYZ123 ABC") == normalize_vin("YV1XYZ123ABC")
    assert normalize_vin("YV1XYZ123ABC") == "YV1XYZ123ABC"


def test_header_normalization() -> None:
    assert normalize_header("Straße") == "strasse"
    assert normalize_header("AN = Adressnr.") == "anadressnr"
    assert normalize_header("B_vorname") == "bvorname"


def test_zip_and_street() -> None:
    assert format_zip(24111.0) == "24111"
    assert combine_street("Russeer Weg", "9") == "Russeer Weg 9"
    assert combine_street("Russeer Weg 9", "9") == "Russeer Weg 9"


def test_source_aliases() -> None:
    headers = ["Adressnr.", "Haltervorname", "Nachname", "Fahrgestellnr.", "Kennzeichen"]
    mapping = match_columns(headers, "source")
    assert mapping[FieldKey.FIRST_NAME] == 1
    assert mapping[FieldKey.VIN] == 3
    assert mapping[FieldKey.PLATE] == 4


def test_target_aliases() -> None:
    headers = [
        "AN = Adressnr.",
        "Z2 = Vorname",
        "Z6 = Straße + Hausnummer",
        "AKZ = amtl. KZ",
        "FGN = Fahrgestellnr.",
    ]
    mapping = match_columns(headers, "target")
    assert mapping[FieldKey.ADDRESS_NO] == 0
    assert mapping[FieldKey.FIRST_NAME] == 1
    assert mapping[FieldKey.STREET] == 2
    assert mapping[FieldKey.PLATE] == 3
    assert mapping[FieldKey.VIN] == 4
