"""Lookup de provincia espanola por codigo postal."""

from __future__ import annotations

_CP_TO_PROVINCIA = {
    "01": "Álava", "02": "Albacete", "03": "Alicante", "04": "Almería",
    "05": "Ávila", "06": "Badajoz", "07": "Illes Balears", "08": "Barcelona",
    "09": "Burgos", "10": "Cáceres", "11": "Cádiz", "12": "Castellón",
    "13": "Ciudad Real", "14": "Córdoba", "15": "A Coruña", "16": "Cuenca",
    "17": "Girona", "18": "Granada", "19": "Guadalajara", "20": "Gipuzkoa",
    "21": "Huelva", "22": "Huesca", "23": "Jaén", "24": "León",
    "25": "Lleida", "26": "La Rioja", "27": "Lugo", "28": "Madrid",
    "29": "Málaga", "30": "Murcia", "31": "Navarra", "32": "Ourense",
    "33": "Asturias", "34": "Palencia", "35": "Las Palmas",
    "36": "Pontevedra", "37": "Salamanca", "38": "Santa Cruz de Tenerife",
    "39": "Cantabria", "40": "Segovia", "41": "Sevilla",
    "42": "Soria", "43": "Tarragona", "44": "Teruel",
    "45": "Toledo", "46": "Valencia", "47": "Valladolid",
    "48": "Bizkaia", "49": "Zamora", "50": "Zaragoza",
    "51": "Ceuta", "52": "Melilla",
}


def cp_provincia_es(codigo_postal: "str | int") -> "str | None":
    """Retorna la provincia espanola correspondiente a un codigo postal.

    Acepta CP completo (5 digitos) o prefijo de 2 digitos. Normaliza con
    zfill(5)[:2] antes de hacer el lookup. Retorna None si el prefijo
    no esta en el diccionario.

    Args:
        codigo_postal: Codigo postal espanol como string o entero.
                       Puede ser CP completo ("28001", 28001) o prefijo ("28", 28).

    Returns:
        Nombre de la provincia en español, o None si el CP es desconocido.
    """
    cp = str(codigo_postal).strip()
    # Si ya es prefijo de 2 digitos (o menos), usar directamente con zfill(2)
    if len(cp) <= 2:
        prefix = cp.zfill(2)
    else:
        prefix = cp.zfill(5)[:2]
    return _CP_TO_PROVINCIA.get(prefix)
