"""Tests para merge_entity_aliases."""

from __future__ import annotations

import os
import sys

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

from core.merge_entity_aliases import merge_entity_aliases


def test_duplicados_case_insensitive_se_mapean_al_mismo_canonical():
    """duplicados case-insensitive se mapean al mismo canonical"""
    result = merge_entity_aliases(["BBVA", "bbva", "Bbva"])
    # Todos deben apuntar al mismo canonical (el mas largo / mayor)
    vals = set(result.values())
    assert len(vals) == 1
    # El canonical debe ser la forma de mayor longitud/orden: "BBVA" (mayusculas, misma longitud)
    canon = vals.pop()
    assert canon.lower() == "bbva"


def test_nombre_corto_se_absorbe_en_nombre_largo_que_lo_contiene():
    """nombre corto se absorbe en nombre largo que lo contiene"""
    # El substring merge funciona cuando la forma corta APARECE LITERALMENTE
    # en la forma larga (normalizada). Ejemplo: "bilbao" esta en "banco bilbao vizcaya argentaria"
    names = ["Bilbao", "Banco Bilbao Vizcaya Argentaria"]
    result = merge_entity_aliases(names)
    # "bilbao" (6 chars) aparece como palabra en la forma larga normalizada
    assert result["Bilbao"] == "Banco Bilbao Vizcaya Argentaria"
    assert result["Banco Bilbao Vizcaya Argentaria"] == "Banco Bilbao Vizcaya Argentaria"


def test_siglas_cortas_menos_de_4_chars_no_absorben_falsamente():
    """siglas cortas menos de 4 chars no absorben falsamente"""
    # "US" es 2 chars normalizados -> no debe absorber a "USA" ni a "BBUSA"
    names = ["US", "USA", "Standard Chartered"]
    result = merge_entity_aliases(names)
    # "US" (2 chars) no debe poder absorber nada
    assert result["USA"] in ("USA", "Standard Chartered") or result["USA"] == "USA"
    # "US" puede quedarse como identidad o ser absorbido por algo que lo contenga
    # Lo importante: NO absorbe a nombres que no lo contienen como palabra completa
    assert result["Standard Chartered"] == "Standard Chartered"


def test_nombres_totalmente_disjuntos_se_mapean_a_si_mismos():
    """nombres totalmente disjuntos se mapean a si mismos"""
    names = ["Inditex", "Santander", "Telefonica"]
    result = merge_entity_aliases(names)
    assert result["Inditex"] == "Inditex"
    assert result["Santander"] == "Santander"
    assert result["Telefonica"] == "Telefonica"


def test_lista_vacia_retorna_dict_vacio():
    """lista vacia retorna dict vacio"""
    assert merge_entity_aliases([]) == {}
