"""`normalize_keyword` — forme canonique d'un mot-clé (spec Imports §3.1, §4.2).

C'est cette forme, et elle seule, qui est écrite dans `keywords.keyword` : l'unicité
`(org_id, locale, keyword)` ne vaut que si toutes les sources y arrivent par le même
chemin. Les exports réels diffèrent sur la casse, les espaces (tabulations, doubles
espaces, espaces insécables d'Excel) et la composition Unicode (« é » précomposé ou
« e » + accent combinant) : sans normalisation, le même mot-clé s'insère plusieurs fois.

Fonction pure, sans I/O. Une entrée blanche rend `""` : c'est au pipeline d'en faire une
ligne en erreur (§4.2), pas à la normalisation de lever.
"""

import unicodedata


def normalize_keyword(raw: str) -> str:
    # `str.split()` sans argument découpe sur toute l'espace Unicode (tabulation, retour,
    # espace insécable) : trim et réduction des espaces en un seul geste.
    collapsed = " ".join(raw.split())
    # NFC **après** `lower()` : la mise en minuscules peut décomposer (İ → i + U+0307),
    # normaliser en dernier garantit l'invariant « la sortie est en NFC ».
    return unicodedata.normalize("NFC", collapsed.lower())
