"""Alexa-ähnlicher Modus: Wake-Word „Jam“, Folgefragen, Smalltalk & Hilfe."""

from __future__ import annotations

import random
import re
import time
from datetime import datetime

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

# Nach Antwort: Befehle ohne erneutes „Jam“ (wie Alexa-Folgefrage)
SESSION_FOLLOWUP_SEC = 14.0

_JAM_WAKE = re.compile(
    r"\b(jam|jem|jahm|germ|yam|alexa)\b",
    re.I,
)

_session_until: float = 0.0


def touch_conversation_session() -> None:
    global _session_until
    _session_until = time.time() + SESSION_FOLLOWUP_SEC


def in_conversation_session() -> bool:
    return time.time() < _session_until


def strip_wake_word(text: str) -> str:
    t = _JAM_WAKE.sub(" ", text)
    t = re.sub(r"\s+", " ", t).strip(" ,.")
    return t


def prepare_heard(text: str) -> str:
    return normalize_speech(strip_wake_word(text))


def mentions_wake(text: str) -> bool:
    return bool(_JAM_WAKE.search(text))


def _has(text: str, *words: str) -> bool:
    h = text.lower()
    return any(w in h for w in words)


def route_smalltalk(brain: JamBrain, heard: str) -> str | None:
    """Alexa-typische Kurzdialoge – vor Spezial-Befehlen."""
    from jam.speech import hears_how_are_you, reply_how_are_you

    h = heard.lower().strip()
    if not h:
        return None

    name = owner_name(brain.state)

    if hears_how_are_you(heard):
        return reply_how_are_you(brain.state)

    if _has(h, "wie spät", "wie spaet", "uhrzeit", "welche uhr", "what time"):
        now = datetime.now().strftime("%H:%M")
        return random.choice(
            (
                f"Es ist {now} Uhr, {name}.",
                f"{name}, die Uhr zeigt {now}.",
                f"Gerade ist es {now} Uhr.",
            )
        )

    if _has(
        h,
        "was kannst du",
        "was kannst",
        "hilfe",
        "help",
        "befehle",
        "skills",
        "was machst du",
        "was kann jam",
    ):
        return (
            f"{name}, ich bin wie Alexa – nur cooler! Sag „Jam“ und dann z. B.: "
            "geh in dein Zimmer, komm raus, "
            "verdien auf der ganzen Welt, PayPal global, "
            "Spiele starten, Feuerwerk, TikTok, YouTube, Cursor, wie geht's dir, "
            "PC volle Kontrolle, Cursor Business, PayPal, Geld-Ideen, Internet lernen, "
            "KI Web Studio, oder frag mich was. "
            "Nach meiner Antwort hast du "
            f"{SESSION_FOLLOWUP_SEC} Sekunden ohne erneutes Jam."
        )

    if _has(h, "danke", "thanks", "thx", "merci"):
        return random.choice(
            (
                f"Gern, {name}!",
                "Bitte schön!",
                "Kein Problem – Jam hilft gern!",
            )
        )

    if _has(h, "tschüss", "tschuess", "bye", "auf wiedersehen", "ciao", "bis später"):
        return random.choice(
            (
                f"Tschüss {name}! Jam ist bald wieder da.",
                "Bis später! Ruf einfach wieder Jam.",
                "Ciao! Ich horche weiter.",
            )
        )

    if _has(h, "hallo", "hey", "hi", "moin", "servus", "guten tag", "guten morgen", "guten abend"):
        hour = datetime.now().hour
        if hour < 12:
            part = "Guten Morgen"
        elif hour < 18:
            part = "Hallo"
        else:
            part = "Guten Abend"
        return random.choice(
            (
                f"{part}, {name}! Mir geht es sehr gut – was kann ich für dich tun?",
                f"{part} {name}! Jam ist da – frag mich etwas!",
                f"Hey {name}! Schön dich zu hören. Mir geht's super!",
            )
        )

    if _has(h, "wer bist du", "was bist du", "stell dich vor"):
        return (
            f"Ich bin Jam, dein lila Desktop-Monster-Buddy von {name}. "
            "Ich höre auf „Jam“ wie Alexa auf ihren Namen – und helfe dir am PC!"
        )

    if _has(h, "wiederhol", "nochmal", "repeat"):
        last = (getattr(brain.state, "last_line_spoken", "") or "").strip()
        if last:
            return f"Nochmal: {last}"
        return "Ich hab noch nichts gesagt – frag mich etwas!"

    if _has(h, "hörst du", "horchst du", "hörst du mich", "verstehst du"):
        return f"Ja {name}, ich höre dich! Jam ist wach."

    return None


def listening_ack(state: JamState) -> str:
    return random.choice(
        (
            "Ich höre zu…",
            "Ja?",
            "Jam ist da!",
            f"Hi {owner_name(state)}!",
        )
    )


def route_or_none(brain: JamBrain, heard: str) -> str | None:
    """Nur Smalltalk-Routing; None = an normale Jam-Befehle weitergeben."""
    prepared = prepare_heard(heard)
    if not prepared and not heard.strip():
        return None
    return route_smalltalk(brain, prepared or heard)
