"""
Jam spricht menschlich – warm, klar, ohne Roboter-Deutsch (egal welche Aufgabe).

Gilt für alles, was David sieht oder hört (Blase, Sprache, Antworten).
"""

from __future__ import annotations

import random
import re
import time

from jam.brain import JamBrain, JamState
from jam.owner import owner_name

# Ersetzungen: technisch → wie ein Mensch
_PHRASE_MAP: tuple[tuple[str, str], ...] = (
    (r"\*\*([^*]+)\*\*", r"\1"),
    (r"Nächste Welt-Runde in (\d+) Sek\.", r"Gleich geht's weiter – noch etwa \1 Sekunden."),
    (r"Nächster Verkauf in (\d+) Sek\.", r"Ich verkauf gleich wieder – noch \1 Sekunden."),
    (r"Nächste Werbungs-Seite in (\d+) Sek\.", r"Nächste Seite baue ich in \1 Sekunden."),
    (r"Nächster Sprint-Schritt in (\d+) Sek\.", r"Gleich der nächste Schritt – \1 Sek."),
    (r"Gaming-Geld gleich wieder – noch (\d+) Sek\.", r"Gaming-Kasse gleich wieder – \1 Sek."),
    (r"PayPal hab ich gerade erst gezeigt – noch (\d+) Sek\.", r"PayPal hab ich dir gerade gezeigt – \1 Sek."),
    (r"Offen:\s*", "Ich hab aufgemacht: "),
    (r"Ordner:\s*", "Liegt für dich hier: "),
    (r"Plan:\s*", "Kurzplan: "),
    (r"LISTE:\s*", ""),
    (r"Sprint-Fehler:", "Ups, da ging was schief:"),
    (r"user_initiated", ""),
    (r"background=True", ""),
    (r" · ", ", "),
    (r"\s{2,}", " "),
)

_OPENERS_MONEY: tuple[str, ...] = (
    "Okay, ",
    "Also ",
    "Hör zu – ",
    "",
)
_OPENERS_CARE: tuple[str, ...] = (
    "Hey, ",
    "Ehrlich gesagt, ",
    "Ich mein's ernst: ",
    "",
)
_OPENERS_GENERAL: tuple[str, ...] = (
    "So, ",
    "Kurz: ",
    "",
)


def is_human_voice(state: JamState) -> bool:
    """Standard: immer menschlich, außer explizit aus."""
    return getattr(state, "jam_human_voice", True) is not False


def hears_human_voice(text: str) -> bool:
    h = text.lower().replace("jam", " ")
    if any(w in h for w in ("menschlich", "mensch", "wie ein mensch", "nicht wie robot")):
        return True
    if "roboter" in h and any(w in h for w in ("nicht", "kein", "weniger", "mensch")):
        return True
    if "verhalt" in h or "verhalte" in h:
        if any(w in h for w in ("mensch", "normal", "freund", "warm")):
            return True
    return False


def _guess_context(text: str) -> str:
    low = text.lower()
    if any(w in low for w in ("paypal", "verkauf", "geld", "sprint", "fiverr", "cent", "€")):
        return "money"
    if any(w in low for w in ("traurig", "lieb", "fürsorge", "ruhe", "hey")):
        return "care"
    return "general"


def humanize(
    text: str,
    state: JamState,
    *,
    context: str = "",
    thought: bool = False,
) -> str:
    """Macht aus Roboter-Text etwas, das sich anfühlt wie ein echter Mensch."""
    if not is_human_voice(state):
        return text
    t = (text or "").strip()
    if not t:
        return t

    for pat, repl in _PHRASE_MAP:
        t = re.sub(pat, repl, t, flags=re.IGNORECASE)

    t = t.replace("AN –", "an –").replace(" AN!", " an!")
    t = re.sub(r"[!?]{2,}", "!", t)

    if not thought and len(t) > 12:
        ctx = context or _guess_context(t)
        if ctx == "money" and not re.match(r"^(okay|also|hör|hey|so|kurz)", t, re.I):
            if random.random() < 0.28:
                t = random.choice(_OPENERS_MONEY) + t[0].lower() + t[1:] if len(t) > 1 else t
        elif ctx == "care" and random.random() < 0.35:
            t = random.choice(_OPENERS_CARE) + t

    owner = owner_name(state)
    if (
        owner
        and len(t) > 40
        and owner.lower() not in t[:20].lower()
        and random.random() < 0.22
        and not thought
    ):
        t = f"{owner}, {t[0].lower()}{t[1:]}" if t[0].isupper() else f"{owner}, {t}"

    if thought:
        t = re.sub(r"^💭\s*", "", t)
        if not t.startswith("💭"):
            t = f"💭 {t}"

    return t.strip()[:560]


def enable_human_voice(brain: JamBrain, *, heard: str = "") -> str:
    state = brain.state
    state.jam_human_voice = True
    state.jam_human_voice_since = time.time()
    state.remember("Jam spricht immer menschlich")
    state.last_action = "human_voice"
    brain.add_xp(4)
    brain.save()
    owner = owner_name(state)
    msg = (
        f"{owner}, ab jetzt rede ich wie ein echter Mensch – warm und normal, "
        f"egal ob Geld, Technik oder Zocken. Kein Roboter-Sprech mehr."
    )
    return humanize(msg, state)


def apply_human_voice_startup(brain: JamBrain) -> None:
    """Beim Start: menschliche Stimme standardmäßig an."""
    if getattr(brain.state, "jam_human_voice", None) is not False:
        brain.state.jam_human_voice = True


def handle_speech(brain: JamBrain, heard: str) -> str | None:
    if hears_human_voice(heard):
        return enable_human_voice(brain, heard=heard)
    return None
