"""Préparation locale d'un article : hashtags et langue estimée.

La même liste vit dans vyneric-news-nodejs/src/text.js. On la garde courte
pour que les deux services restent lisibles l'un sans l'autre.
"""

import re
import unicodedata

TOPICS = (
    ("ia", "IA", ("intelligence artificielle", "ia")),
    ("donnees", "données", ("donnees", "analyse")),
    ("logiciel", "logiciel", ("logiciel", "api", "plateforme")),
    ("cybersecurite", "cybersécurité", ("cybersecurite", "securite informatique")),
    ("iot", "IoT", ("iot", "capteur", "capteurs")),
    ("talents", "talents", ("formation", "carriere", "academy")),
    ("geomobilite", "géomobilité", ("geomobilite", "territoire")),
    ("partenariat", "partenariat", ("partenariat", "collaboration")),
)

CUES = {
    "fr": ("le", "la", "les", "des", "une", "nous", "est", "dans", "pour", "avec"),
    "en": ("the", "and", "for", "with", "this", "that", "from", "are", "your"),
    "es": ("el", "los", "las", "para", "con", "una", "del", "por"),
    "it": ("che", "non", "per", "della", "gli", "sono", "come"),
}

_LABELS = {slug: label for slug, label, _phrases in TOPICS}


def fold(value):
    text = unicodedata.normalize("NFKD", value or "")
    return "".join(char for char in text if not unicodedata.combining(char)).lower()


def slugify(value):
    ascii_slug = re.sub(r"[^a-z0-9]+", "-", fold(value)).strip("-")[:80]
    if ascii_slug:
        return ascii_slug
    raw = re.sub(r"[^\w]+", "-", (value or "").lower(), flags=re.UNICODE).strip("-")
    return raw[:80]


def explicit_tags(text):
    found = []
    seen = set()
    for match in re.finditer(r"#([\w-]{2,40})", text or "", flags=re.UNICODE):
        slug = slugify(match.group(1))
        if not slug or slug in seen:
            continue
        seen.add(slug)
        found.append({"slug": slug, "label": _LABELS.get(slug, match.group(1).replace("_", " "))})
    return found


def suggest_tags(text):
    folded = fold(text)
    tokens = set(re.findall(r"[a-z0-9]+", folded))
    tags = {tag["slug"]: tag for tag in explicit_tags(text)}
    for slug, label, phrases in TOPICS:
        if slug in tags:
            continue
        if any((phrase in folded) if " " in phrase else (phrase in tokens) for phrase in phrases):
            tags[slug] = {"slug": slug, "label": label}
    return list(tags.values())[:12]


def guess_language(text):
    raw = text or ""
    if re.search(r"[\u0600-\u06FF]", raw):
        return "ar"
    words = re.findall(r"[a-z']+", fold(raw))
    scores = {lang: 0 for lang in CUES}
    for word in words:
        for lang, cues in CUES.items():
            if word in cues:
                scores[lang] += 1
    best = "en"
    high = 0
    for lang in ("fr", "en", "es", "it"):
        if scores[lang] > high:
            best = lang
            high = scores[lang]
    return best if high else "en"


def prepare_article(title, deck, text):
    blob = f"{title or ''}\n{deck or ''}\n{text or ''}"
    return {"hashtags": suggest_tags(blob), "language": guess_language(blob)}
