"""Tests para infer_provincia_from_cp."""

import sys
import os

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from infer_provincia_from_cp import infer_provincia_from_cp


def test_inferencia_con_cp_dominante_madrid():
    """inferencia con cp dominante madrid"""
    rows = [
        {"codigo_postal": "28001", "provincia": "Madrid"},
        {"codigo_postal": "28010", "provincia": "Madrid"},
    ]
    result = infer_provincia_from_cp(rows)
    assert result == ["Madrid", "Madrid"]


def test_fila_con_cp_fuera_de_top2_usa_dominante():
    """fila con cp fuera de top2 usa dominante"""
    # Madrid tiene 3 prefijos distintos: 28 (x4), 29 (x1), 41 (x1).
    # top-2 son: 28 y 29 (o 41 dependiendo del orden, pero 41 queda fuera).
    # Para que 41 quede fuera del top-2 necesitamos mas de 2 prefijos distintos.
    rows = [
        {"codigo_postal": "28001", "provincia": "Madrid"},
        {"codigo_postal": "28002", "provincia": "Madrid"},
        {"codigo_postal": "28003", "provincia": "Madrid"},
        {"codigo_postal": "28004", "provincia": "Madrid"},
        {"codigo_postal": "29001", "provincia": "Madrid"},
        {"codigo_postal": "29002", "provincia": "Madrid"},
        {"codigo_postal": "41001", "provincia": "Madrid"},  # outlier: fuera de top-2
    ]
    result = infer_provincia_from_cp(rows)
    # top-2 de Madrid: "28" (4 ocurrencias) y "29" (2 ocurrencias).
    # "41" no esta en top-2, asi que usa el dominante (28 -> Madrid)
    assert result[6] == "Madrid"


def test_fila_sin_provincia_retorna_none():
    """fila sin provincia retorna None"""
    rows = [
        {"codigo_postal": "28001", "provincia": None},
    ]
    result = infer_provincia_from_cp(rows)
    assert result == [None]


def test_fila_sin_cp_retorna_none():
    rows = [
        {"codigo_postal": None, "provincia": "Madrid"},
    ]
    result = infer_provincia_from_cp(rows)
    assert result == [None]


def test_columnas_custom():
    rows = [
        {"cp": "28001", "prov": "Madrid"},
        {"cp": "28010", "prov": "Madrid"},
    ]
    result = infer_provincia_from_cp(rows, cp_col="cp", prov_col="prov")
    assert result == ["Madrid", "Madrid"]


def test_multiples_provincias():
    rows = [
        {"codigo_postal": "28001", "provincia": "Madrid"},
        {"codigo_postal": "08001", "provincia": "Barcelona"},
        {"codigo_postal": "41001", "provincia": "Sevilla"},
    ]
    result = infer_provincia_from_cp(rows)
    assert result == ["Madrid", "Barcelona", "Sevilla"]


def test_lista_vacia():
    assert infer_provincia_from_cp([]) == []
