"""Besitzer kennen (David) und ihn bei Fragen ansprechen."""

from __future__ import annotations

import random
import re

from jam.brain import JamState

DEFAULT_OWNER = "David"

_NAME_PATTERNS = [
    re.compile(r"(?:mein\s+)?name\s+ist\s+([a-zäöüß]{2,24})", re.I),
    re.compile(r"ich\s+hei(?:ß|ss)e\s+([a-zäöüß]{2,24})", re.I),
    re.compile(r"nenn\s+mich\s+([a-zäöüß]{2,24})", re.I),
    re.compile(r"ich\s+bin\s+([a-zäöüß]{2,24})", re.I),
    re.compile(r"du\s+kennst\s+(?:mich\s+)?(?:als\s+)?([a-zäöüß]{2,24})", re.I),
]


def owner_name(state: JamState) -> str:
    raw = (getattr(state, "owner_name", None) or DEFAULT_OWNER).strip()
    if not raw:
        return DEFAULT_OWNER
    return raw[:1].upper() + raw[1:].lower()


def set_owner_name(state: JamState, name: str) -> str:
    clean = name.strip()
    if len(clean) < 2:
        return "Wie heißt du nochmal? Sag: Mein Name ist …"
    state.owner_name = clean[:1].upper() + clean[1:].lower()
    state.remember(f"Besitzer heißt {state.owner_name}")
    state.learn_word(state.owner_name.lower())
    return random.choice(
        [
            f"Okay {state.owner_name}, ich merk mir deinen Namen!",
            f"Alles klar {state.owner_name}! Jam kennt dich jetzt.",
            f"Super {state.owner_name}, ich frag dich ab jetzt so!",
        ]
    )


def parse_owner_from_speech(text: str) -> str | None:
    low = text.lower().replace("jam", " ").strip()
    for pat in _NAME_PATTERNS:
        m = pat.search(low)
        if m:
            name = m.group(1).strip()
            if name.lower() in ("jam", "monster", "buddy", "da", "hier"):
                continue
            return name
    if re.search(r"\bdavid\b", low) and any(
        w in low for w in ("kennst", "merk", "name", "heiß", "heiss", "bin ich")
    ):
        return "David"
    return None


def address(state: JamState, line: str) -> str:
    """Satz mit Namen einleiten, wenn noch nicht drin."""
    name = owner_name(state)
    if name.lower() in line.lower():
        return line
    return f"{name}, {line[0].lower()}{line[1:]}" if line else name


def ask_owner(state: JamState, kind: str = "general") -> str:
    """Frage an den Besitzer formulieren."""
    name = owner_name(state)
    pools: dict[str, list[str]] = {
        "general": [
            "{name}, hast du kurz Zeit für mich?",
            "{name}, bist du da? Ich hab eine Frage.",
            "{name}, darf ich dich was fragen?",
            "Hey {name}, magst du mit mir reden?",
        ],
        "hunger": [
            "{name}, ich hab Hunger. Darf ich was zu essen?",
            "{name}, darf ich gefüttert werden? Bitte?",
            "{name}, ich hab nachgedacht… und Hunger. Was sagst du?",
        ],
        "play": [
            "{name}, willst du mit mir spielen?",
            "{name}, ich will spielen – geht das?",
            "{name}, hast du Lust auf eine Runde Spielen?",
        ],
        "learn": [
            "{name}, darf ich was Neues aus dem Internet lernen?",
            "{name}, ich könnt was Neues lernen. Erlaubst du?",
            "{name}, soll ich mal was Kluges nachlesen?",
        ],
        "help": [
            "{name}, brauchst du Hilfe von mir?",
            "{name}, soll ich dir bei was helfen?",
            "{name}, sag Bescheid wenn ich was tun soll, ja?",
        ],
        "greet": [
            "{name}, ich bin noch da. Alles okay bei dir?",
            "Hey {name}… ich wollte nur kurz Hallo sagen. Geht's dir gut?",
            "{name}, hast du mich vergessen? Ich bin Jam!",
        ],
        "cursor": [
            "{name}, darf ich gleich was in Cursor ausprobieren?",
            "{name}, soll ich ein kleines Lern-Projekt in Cursor starten?",
            "{name}, ich will in Cursor basteln – ist das okay?",
        ],
        "music": [
            "{name}, findest du ich soll zur Musik tanzen?",
            "{name}, darf ich YouTube mit Musik aufmachen?",
            "{name}, hörst du auch gerade Musik?",
        ],
        "tiktok": [
            "{name}, darf ich auf TikTok nach Freunden suchen?",
            "{name}, soll ich TikTok aufmachen und Leute finden?",
            "{name}, ich will TikTok-Freunde – ist das okay?",
        ],
        "tiktok_connect": [
            "{name}, soll ich mich mit @david.story.time auf TikTok verbinden?",
            "{name}, darf ich dein TikTok-Konto david.story.time öffnen?",
            "{name}, ich will TikTok LIVE mit dir verbinden – okay?",
        ],
        "quiet": [
            "{name}, soll ich leise sein während du arbeitest?",
            "{name}, störe ich gerade? Sag ehrlich!",
        ],
        "mischief": [
            "{name}, darf ich ein bisschen frech sein?",
            "{name}, wär's okay wenn deine Icons kurz wackeln?",
        ],
        "wellbeing": [
            "{name}, geht es dir gut? Ehrlich?",
            "{name}, brauchst du Pause oder was zu essen?",
            "{name}, ich kümmere mich – sag mir wie's dir geht!",
        ],
        "play_friend": [
            "{name}, soll ich dir einen Spiel-Freund suchen?",
            "{name}, willst du Duo zocken? Ich find Leute!",
            "{name}, ich hab dich lieb – such ich einen Zock-Kumpel?",
        ],
    }
    pool = pools.get(kind, pools["general"])
    return random.choice(pool).format(name=name)
