from __future__ import annotations

from collections.abc import Mapping

from guests.guest_defaults import is_missing_istat_value


ISTAT_GUEST_TYPE_CHOICES = [
    ("16", "Single Guest"),
    ("17", "Head of Family"),
    ("18", "Group Leader"),
    ("19", "Family Member"),
    ("20", "Group Member"),
]


def derive_guest_type_codes(group_type: str | None, count: int) -> list[str]:
    if count <= 0:
        return []

    normalized = (group_type or "").strip().lower()
    if normalized == "family":
        return ["17"] + ["19"] * (count - 1)
    if normalized == "single":
        return ["16"] * count
    return ["18"] + ["20"] * (count - 1)


def apply_guest_istat_defaults(
    guest_data,
    *,
    booking,
    index: int,
    total_guests: int,
):
    payload = dict(guest_data)

    extra_data = payload.get("extra_data")
    if isinstance(extra_data, Mapping):
        extra_data = dict(extra_data)
    else:
        extra_data = {}

    for field in ("guest_type", "tourism_type", "transport_type"):
        extra_value = extra_data.pop(field, None)
        if is_missing_istat_value(payload.get(field)) and not is_missing_istat_value(extra_value):
            payload[field] = extra_value

    guest_type_codes = derive_guest_type_codes(
        getattr(booking, "guest_group_type", None),
        total_guests,
    )
    if is_missing_istat_value(payload.get("guest_type")):
        payload["guest_type"] = (
            guest_type_codes[index] if 0 <= index < len(guest_type_codes) else None
        )

    if is_missing_istat_value(payload.get("tourism_type")):
        payload["tourism_type"] = getattr(booking, "tourism_type", None)

    if is_missing_istat_value(payload.get("transport_type")):
        payload["transport_type"] = getattr(booking, "transport_type", None)

    payload["extra_data"] = extra_data
    return payload
