"""Common vehicle body type values for UI dropdowns and normalization."""

BODY_TYPE_CHOICES: list[dict[str, str]] = [
    {"code": "hatchback", "label": "Hatchback"},
    {"code": "sedan", "label": "Sedan / Saloon"},
    {"code": "suv", "label": "SUV"},
    {"code": "muv", "label": "MUV"},
    {"code": "coupe", "label": "Coupe"},
    {"code": "convertible", "label": "Convertible"},
    {"code": "pickup", "label": "Pickup"},
    {"code": "van", "label": "Van"},
    {"code": "auto_rickshaw", "label": "Auto Rickshaw"},
    {"code": "solo", "label": "Solo (Two Wheeler)"},
    {"code": "open", "label": "Open Body"},
    {"code": "closed", "label": "Closed Body"},
    {"code": "flat_bed", "label": "Flat Bed"},
    {"code": "tanker", "label": "Tanker"},
    {"code": "tipper", "label": "Tipper"},
    {"code": "trailer", "label": "Trailer"},
    {"code": "other", "label": "Other"},
]

BODY_TYPE_LABELS = {item["code"]: item["label"] for item in BODY_TYPE_CHOICES}

_ALIASES: dict[str, str] = {
    "hatch back": "hatchback",
    "hatchback": "hatchback",
    "saloon": "sedan",
    "sedan": "sedan",
    "suv": "suv",
    "muv": "muv",
    "coupe": "coupe",
    "convertible": "convertible",
    "pickup": "pickup",
    "pick up": "pickup",
    "van": "van",
    "rikshaw": "auto_rickshaw",
    "rickshaw": "auto_rickshaw",
    "auto rickshaw": "auto_rickshaw",
    "ape auto": "auto_rickshaw",
    "solo": "solo",
    "open": "open",
    "open body": "open",
    "closed": "closed",
    "closed body": "closed",
    "flat bed": "flat_bed",
    "tanker": "tanker",
    "tipper": "tipper",
    "trailer": "trailer",
}


def body_type_label(code: str | None) -> str | None:
    if not code:
        return None
    if code in BODY_TYPE_LABELS:
        return BODY_TYPE_LABELS[code]
    return code.replace("_", " ").title()


def normalize_body_type(value: str | None) -> str | None:
    """Map PDF wording to canonical body type code when possible; else cleaned free text."""
    if not value:
        return None
    cleaned = " ".join(value.split()).strip(" .,:;-")
    if not cleaned:
        return None
    lower = cleaned.lower()
    if lower in _ALIASES:
        return _ALIASES[lower]
    for phrase, code in _ALIASES.items():
        if phrase in lower:
            return code
    return cleaned.upper() if cleaned.isupper() or len(cleaned) <= 20 else cleaned.title()


def infer_body_type(text: str) -> str | None:
    return normalize_body_type(text)
