import re

from app.pipeline import german_numbers as gn

# Emojis/Piktogramme/Symbole: stoeren das Vorlesen (TTS spricht sie aus oder verschluckt
# sich). Deckt die gaengigen Unicode-Bloecke ab (Emoticons, Symbole, Transport, Flaggen,
# Dingbats, Pfeile, Variationsselektoren, ZWJ).
_EMOJI_RE = re.compile(
    "["
    "\U0001F300-\U0001FAFF"   # Symbole/Emoticons/Transport/Erweiterungen
    "\U00002600-\U000027BF"   # Diverse Symbole + Dingbats (☀ ⚠ ✅ ❤ …)
    "\U0001F1E6-\U0001F1FF"   # Regional-Indikatoren (Flaggen)
    "\U00002B00-\U00002BFF"   # Symbole/Pfeile (⭐ …)
    "\U00002190-\U000021FF"   # Pfeile (→ ← …)
    "\U00002300-\U000023FF"   # Technische Symbole (⌚ ⏰ …)
    "\U0000FE00-\U0000FE0F"   # Variationsselektoren
    "\U0000200D"              # Zero-Width-Joiner
    "]+"
)


class SpokenResponseAdapter:
    async def run(self, text: str, language: str = "de") -> str:
        if not text:
            return ""

        text = text.strip()

        # Markdown / Formatierung entfernen
        text = re.sub(r"```[\s\S]*?```", " ", text)          # code blocks
        text = re.sub(r"`([^`]*)`", r"\1", text)             # inline code
        text = re.sub(r"\[([^\]]+)\]\([^)]+\)", r"\1", text) # markdown links
        text = re.sub(r"[*_~#>]+", " ", text)                # markdown symbols
        text = _EMOJI_RE.sub("", text)                       # Emojis/Symbole

        # Listen entschärfen: Aufzählungspunkte weg, nummerierte Listen zu
        # Ordinalwörtern ("1. " -> "erstens, "), damit Piper nicht "eins" sagt.
        text = re.sub(r"(?m)^\s*[-•]\s+", "", text)

        def _numbered(m):
            n = int(m.group(1))
            return f"{gn.ordinal_adverbial(n)}, " if gn.has_ordinal(n) else ""

        text = re.sub(r"(?m)^\s*(\d{1,2})\.\s+", _numbered, text)

        # Mehrfache Leerzeichen / Zeilenumbrüche glätten
        text = re.sub(r"\s+", " ", text).strip()

        # Für Voice natürlicher machen: Doppelpunkte/Semikolons etwas beruhigen,
        # aber Uhrzeiten/Verhältnisse (10:30) nicht zerstören -> nur am Wortende ersetzen.
        text = re.sub(r"[:;](?=\s|$)", ",", text)

        # Klammern meist nicht gut für TTS
        text = text.replace("(", ", ")
        text = text.replace(")", " ")

        # Abschlusspunktion sicherstellen
        if text and not text.endswith((".", "!", "?")):
            text += "."

        return text

