"""Jam-Zimmer: rein per Sprache, raus mit „komm raus“."""

from __future__ import annotations

import random
import re

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

_COME = (
    "komm raus",
    "komme raus",
    "komm mal raus",
    "komm wieder raus",
    "komm raus bitte",
    "zeig dich",
    "zeig dich wieder",
)

_ROOM = (
    "geh in dein zimmer",
    "gehe in dein zimmer",
    "gehen in dein zimmer",
    "geh in deinen zimmer",
    "gehe in deinen zimmer",
    "geh in deine zimmer",
    "geh ins zimmer",
    "gehe ins zimmer",
    "in dein zimmer",
    "in deinen zimmer",
    "ins zimmer",
    "geh in zimmer",
    "zurück ins zimmer",
    "geh in dein zimmer bitte",
    "geh in das zimmer",
    "verschwinde ins zimmer",
    "ab ins zimmer",
)


def _norm(text: str) -> str:
    h = text.lower().replace("jam", " ")
    h = re.sub(r"[^\wäöüß\s]", " ", h, flags=re.IGNORECASE)
    return re.sub(r"\s+", " ", h).strip()


def hears_come_out(text: str) -> bool:
    h = _norm(text)
    if not h:
        return False
    if any(p in h for p in _COME):
        return True
    if "raus" in h and any(w in h for w in ("komm", "komme", "zeig", "hol")):
        return True
    return False


def hears_go_room(text: str) -> bool:
    h = _norm(text)
    if not h:
        return False
    if any(p in h for p in _ROOM):
        return True
    if "zimmer" not in h:
        return False
    if any(w in h for w in ("geh", "gehe", "gehen", "geht", "gehst")):
        return True
    if any(w in h for w in ("ins", "in dein", "in deinen", "in deinem", "in das")):
        return True
    return False


def say_come_out(state: JamState) -> str:
    owner = owner_name(state)
    return random.choice(
        (
            f"Juhu {owner}, ich bin wieder da!",
            "Tada! Jam ist raus aus dem Zimmer!",
            f"Hallo {owner}! Ich zeig mich wieder!",
            "Buh! … Spaß – ich bin wieder sichtbar!",
        )
    )


def say_go_room(state: JamState, *, ok: bool) -> str:
    owner = owner_name(state)
    if not ok:
        return f"Okay {owner}, ich geh trotzdem ins Zimmer – sag „Jam komm raus“ wenn du mich brauchst!"
    return random.choice(
        (
            f"Okay {owner}, ich geh in mein Zimmer. Sag „Jam komm raus“!",
            "Alles klar – Zimmer-Zeit! Ruf mich, wenn du mich siehst willst.",
            "Tsching – ich bin im Zimmer. „Jam komm raus“ holt mich!",
        )
    )
