from app.mapping import FieldKey
from app.models import CustomerRecord
from app.salutation import generate_letter_salutation, is_valid_letter_salutation


def _record(**values: object) -> CustomerRecord:
    return CustomerRecord(values=dict(values))


def test_frau_herr_firma_and_doctor() -> None:
    frau = _record(
        **{
            FieldKey.SALUTATION: "Frau",
            FieldKey.LAST_NAME: "Schmidt",
        }
    )
    assert generate_letter_salutation(frau) == "Sehr geehrte Frau Schmidt"

    herr = _record(
        **{
            FieldKey.SALUTATION: "Herr",
            FieldKey.LAST_NAME: "Weber",
        }
    )
    assert generate_letter_salutation(herr) == "Sehr geehrter Herr Weber"

    herr_dr = _record(
        **{
            FieldKey.SALUTATION: "Herr",
            FieldKey.TITLE: "Dr.",
            FieldKey.LAST_NAME: "Weber",
        }
    )
    assert generate_letter_salutation(herr_dr) == "Sehr geehrter Herr Dr. Weber"

    frau_dr = _record(
        **{
            FieldKey.SALUTATION: "Frau",
            FieldKey.TITLE: "Dr.",
            FieldKey.LAST_NAME: "Müller",
        }
    )
    assert generate_letter_salutation(frau_dr) == "Sehr geehrte Frau Dr. Müller"

    firma = _record(
        **{
            FieldKey.SALUTATION: "Firma",
            FieldKey.LAST_NAME: "Meier AG",
            FieldKey.COMPANY: "Meier AG",
        }
    )
    assert generate_letter_salutation(firma) == "Sehr geehrte Damen und Herren"


def test_existing_salutation_not_overwritten() -> None:
    record = _record(
        **{
            FieldKey.SALUTATION: "Herr",
            FieldKey.LAST_NAME: "Mustermann",
            FieldKey.LETTER_SALUTATION: "Sehr geehrter Herr Mustermann",
        }
    )
    assert generate_letter_salutation(record) == "Sehr geehrter Herr Mustermann"
    assert is_valid_letter_salutation(record.get(FieldKey.LETTER_SALUTATION))


def test_unknown_falls_back() -> None:
    record = _record(**{FieldKey.FIRST_NAME: "Alex"})
    assert generate_letter_salutation(record) == "Sehr geehrte Damen und Herren"
