"""Tekstų valymas ir normalizavimas.

- Pašalina emoji ir kontrolinius simbolius
- Sumažina baltųjų tarpų
- Variantas su unidecode (lotyniškas variantas, nuokrypiams kalbos nustatymui)
- Generuoja "normalized" raktą deduplikacijai
"""

from __future__ import annotations

import re
import unicodedata
from typing import Optional

import emoji
from langdetect import DetectorFactory, LangDetectException, detect as _ld_detect
from unidecode import unidecode

# stabilus kalbos aptikimas (atkartojami rezultatai)
DetectorFactory.seed = 0

_CTRL_RE = re.compile(r"[\u0000-\u001F\u007F-\u009F]")
_WS_RE = re.compile(r"\s+")
_PUNCT_RE = re.compile(r"[^\w\s]", flags=re.UNICODE)


def remove_emoji(text: str) -> str:
    return emoji.replace_emoji(text, replace="")


def clean_text(text: Optional[str], *, strip_punct: bool = False) -> str:
    """Pirminis valymas: trim, NFKC, emoji ir kontrolinius simbolius pašalinam."""
    if not text:
        return ""
    text = unicodedata.normalize("NFKC", text)
    text = remove_emoji(text)
    text = _CTRL_RE.sub(" ", text)
    if strip_punct:
        text = _PUNCT_RE.sub(" ", text)
    text = _WS_RE.sub(" ", text).strip()
    return text


def normalize_for_dedup(text: str) -> str:
    """Įvertis deduplikacijai – tinka greitam string panašumui."""
    t = clean_text(text, strip_punct=True).lower()
    t = unidecode(t)
    return _WS_RE.sub(" ", t).strip()


def detect_language(text: str, fallback: Optional[str] = None) -> Optional[str]:
    if not text or len(text) < 4:
        return fallback
    try:
        return _ld_detect(text)
    except LangDetectException:
        return fallback
