"""Infiere la provincia correcta de cada fila basandose en el codigo postal dominante por provincia."""

from __future__ import annotations

import os
import sys
from collections import Counter


def infer_provincia_from_cp(
    rows: list[dict],
    cp_col: str = "codigo_postal",
    prov_col: str = "provincia",
) -> list:
    """Infiere la provincia correcta de cada fila usando el CP dominante por provincia.

    Para cada provincia en el dataset calcula los top-2 prefijos de CP mas
    frecuentes. Si el CP de una fila pertenece a ese top-2 para su provincia,
    se usa la provincia derivada del CP real; si no, se usa la provincia
    derivada del prefijo dominante (top-1) de su provincia.

    Logica generica (stdlib puro, sin pandas):
      1. Calcular frecuencia de prefijos por provincia.
      2. Seleccionar top-2 prefijos por provincia.
      3. Para cada fila: si su prefijo esta en top-2 de su provincia,
         retornar cp_provincia_es(prefijo); si no, retornar cp_provincia_es(top1).
      4. Si la provincia de la fila no tiene datos, retornar None.

    Args:
        rows: Lista de dicts con al menos las columnas cp_col y prov_col.
        cp_col: Nombre de la columna con el codigo postal (default "codigo_postal").
        prov_col: Nombre de la columna con la provincia original (default "provincia").

    Returns:
        Lista de strings (o None) con la provincia inferida para cada fila,
        en el mismo orden que rows.
    """
    _here = os.path.dirname(os.path.abspath(__file__))
    if _here not in sys.path:
        sys.path.insert(0, _here)
    from cp_provincia_es import cp_provincia_es

    # Paso 1: contar frecuencia de (provincia, prefijo)
    freq: dict[str, Counter] = {}
    for row in rows:
        prov = row.get(prov_col)
        cp_raw = row.get(cp_col)
        if prov is None or cp_raw is None:
            continue
        cp_str = str(cp_raw).strip().zfill(5)
        prefix = cp_str[:2]
        if prov not in freq:
            freq[prov] = Counter()
        freq[prov][prefix] += 1

    # Paso 2: top-2 prefijos por provincia y prefijo dominante (top-1)
    top2: dict[str, list[str]] = {}
    dominant: dict[str, str] = {}
    for prov, counter in freq.items():
        ordered = [p for p, _ in counter.most_common(2)]
        top2[prov] = ordered
        if ordered:
            dominant[prov] = ordered[0]

    # Paso 3: resolver provincia para cada fila
    result = []
    for row in rows:
        prov = row.get(prov_col)
        cp_raw = row.get(cp_col)

        if prov is None or cp_raw is None:
            result.append(None)
            continue

        cp_str = str(cp_raw).strip().zfill(5)
        prefix = cp_str[:2]

        if prov in top2 and prefix in top2[prov]:
            result.append(cp_provincia_es(prefix))
        elif prov in dominant:
            result.append(cp_provincia_es(dominant[prov]))
        else:
            result.append(None)

    return result
