"""Katman 1 — Regex/keyword rule matcher. ~1-5ms, LLM yok.

reply None → context bağımlı (orchestrator/LLM'e devret). Marker → orchestrator işler.
"""
import re
from dataclasses import dataclass

from app.utils.text import normalize_tr

RULES: dict[str, dict] = {
    "greeting": {
        "patterns": [r"^(merhaba|selam|iyi gunler|hello|hi|hey)\b", r"^(gunaydin|iyi aksamlar)\b"],
        "reply": "Merhaba! Size nasıl yardımcı olabilirim?",
    },
    "thanks": {
        "patterns": [r"^(tesekkurler|tesekkur ederim|sagol|sag ol|thanks|thank you)\b"],
        "reply": "Rica ederim! Başka bir konuda yardımcı olabilir miyim?",
    },
    "bye": {
        "patterns": [r"^(gorusuruz|hoscakal|hosca kal|bye|bb)\b"],
        "reply": "İyi günler! Tekrar bekleriz.",
    },
    "catalog": {
        "patterns": [r"^(katalog|urun listesi|urunler)\b"],
        "reply": "__CATALOG__",
    },
    "who_are_you": {
        "patterns": [r"^(sen kimsin|kimsin sen|bot musun|gercek misin)\??$"],
        "reply": "__INTRO__",
    },
    "cart_clear": {
        "patterns": [r"^(sepeti bosalt|sepetimi temizle|sepeti temizle)\??$"],
        "reply": "__CART_CLEAR__",
    },
    "contact_request": {
        "patterns": [r"(insanla konus|operatore|musteri temsilci|canli destek|gercek biri)"],
        "reply": "__ESCALATE__",
    },
    "affirmation": {
        "patterns": [r"^(evet|tamam|olur|ok|okey|dogru|harika)\b"],
        "reply": None,  # context bağımlı
    },
}


@dataclass
class RuleMatch:
    intent: str
    reply: str | None


class RuleMatcher:
    def __init__(self) -> None:
        self._compiled: dict[str, list[re.Pattern]] = {
            intent: [re.compile(p) for p in cfg["patterns"]]
            for intent, cfg in RULES.items()
        }

    def match(self, message: str) -> RuleMatch | None:
        norm = normalize_tr(message)
        if not norm:
            return None
        for intent, patterns in self._compiled.items():
            if any(p.search(norm) for p in patterns):
                return RuleMatch(intent=intent, reply=RULES[intent]["reply"])
        return None
