"""
Context-aware intent detection.
Not pure keyword matching – looks at overall meaning + recent conversation.
"""
import re
from typing import Optional, List, Tuple

# ---------- Investment / Deposit ----------
INVEST_KEYWORDS = [
    r"\binvest\b", r"\binvestment\b", r"\bdeposit\b", r"\bpayment\b",
    r"জমা", r"টাকা", r"ইনভেস্ট", r"ইনভেষ্ট", r"পেমেন্ট",
    r"টাকা দিতে", r"টাকা লাগবে", r"কত টাকা", r"কত টাকা লাগবে",
    r"জমা দিতে", r"টাকা জমা", r"পে করতে", r"pay", r"money",
    r"how much", r"amount", r"required", r"need to pay",
    r"টাকা দিতে হবে", r"টাকা লাগবে\?", r"invest করতে চাই",
    r"জমা দিতে চাই", r"কত খরচ", r"কত লাগবে",
]

INVEST_PATTERNS = [re.compile(p, re.IGNORECASE) for p in INVEST_KEYWORDS]


def is_investment_intent(text: str, context: List[str] = None) -> bool:
    if not text:
        return False
    full = text
    if context:
        full = " ".join(context[-5:] + [text])
    for pat in INVEST_PATTERNS:
        if pat.search(full):
            return True
    # soft semantic hints
    lower = full.lower()
    money_words = ["টাকা", "money", "pay", "deposit", "invest", "জমা", "amount"]
    question_words = ["কত", "how much", "কি", "what", "need", "লাগবে", "দিতে"]
    if any(w in lower for w in money_words) and any(w in lower for w in question_words):
        return True
    return False


# ---------- Account creation (name + age + profession) ----------
AGE_PATTERN = re.compile(
    r"(?:\b(?:বয়স|age|years?|yrs?)\s*[:=]?\s*)?(\d{1,2})\s*(?:বছর|years?|yrs?)?\b",
    re.IGNORECASE,
)

PROFESSION_KEYWORDS = [
    r"পেশা", r"profession", r"job", r"work", r"কাজ", r"ব্যবসা", r"business",
    r"student", r"ছাত্র", r"ছাত্রী", r"teacher", r"শিক্ষক", r"doctor",
    r"engineer", r"service", r"চাকরি", r"farmer", r"কৃষক", r"driver",
]

NAME_HINTS = [
    r"নাম", r"name", r"আমার নাম", r"my name", r"i am", r"আমি",
]


def extract_account_info(text: str, context: List[str] = None) -> dict:
    """Return dict with keys name / age / profession if found."""
    messages = (context or []) + [text]
    combined = "\n".join(messages)

    result = {"name": None, "age": None, "profession": None}

    # Age
    age_match = AGE_PATTERN.search(combined)
    if age_match:
        age_val = int(age_match.group(1))
        if 10 <= age_val <= 80:
            result["age"] = str(age_val)

    # Profession (simple keyword presence)
    for pat in PROFESSION_KEYWORDS:
        if re.search(pat, combined, re.IGNORECASE):
            # try to grab the word after the keyword
            m = re.search(
                rf"(?:{pat})\s*[:=]?\s*([^\n,.]{2,40})",
                combined,
                re.IGNORECASE,
            )
            if m:
                result["profession"] = m.group(1).strip()
            else:
                result["profession"] = "detected"
            break

    # Name – very heuristic
    # Look for "নাম: xxx" or "name: xxx" or a short line that looks like a name
    name_m = re.search(
        r"(?:নাম|name)\s*[:=]\s*([^\n,]{2,40})",
        combined,
        re.IGNORECASE,
    )
    if name_m:
        result["name"] = name_m.group(1).strip()
    else:
        # if recent short messages look like name + age + profession
        short_msgs = [m.strip() for m in messages[-4:] if 1 < len(m.strip()) < 40]
        if len(short_msgs) >= 2 and result["age"]:
            # first short non-age message is likely the name
            for m in short_msgs:
                if not AGE_PATTERN.search(m) and not any(
                    re.search(p, m, re.IGNORECASE) for p in PROFESSION_KEYWORDS
                ):
                    result["name"] = m
                    break

    return result


def is_account_info_complete(info: dict) -> bool:
    return bool(info.get("name") and info.get("age") and info.get("profession"))


# ---------- Phone number (Bangladesh) ----------
# Accepts common formats: 017xxxxxxxx, +88017xxxxxxxx, 88017xxxxxxxx, 17xxxxxxxx etc.
BD_PHONE_RE = re.compile(
    r"(?:\+?88)?0?1[3-9]\d{8}\b"
)


def extract_bd_phone(text: str) -> Optional[str]:
    if not text:
        return None
    # remove spaces, dashes, parentheses
    cleaned = re.sub(r"[\s\-\(\)]", "", text)
    m = BD_PHONE_RE.search(cleaned)
    if not m:
        return None
    num = m.group(0)
    # normalize to 01xxxxxxxxx
    if num.startswith("+880"):
        num = "0" + num[4:]
    elif num.startswith("880"):
        num = "0" + num[3:]
    elif num.startswith("1") and len(num) == 10:
        num = "0" + num
    if len(num) == 11 and num.startswith("01"):
        return num
    return None


# ---------- Question detection ----------
QUESTION_PATTERNS = [
    r"\?", r"কিভাবে", r"কীভাবে", r"কি ভাবে", r"how", r"when", r"where",
    r"কখন", r"কোথায়", r"কোথায়", r"বুঝতে পারছি না", r"বোঝা যাচ্ছে না",
    r"withdrawal", r"উইথড্র", r"টাকা পাব", r"টাকা কখন", r"কাজটা",
    r"এটা কি", r"এটা কী", r"help", r"সাহায্য", r"ব্যাখ্যা",
]


def is_question(text: str) -> bool:
    if not text:
        return False
    lower = text.lower()
    for p in QUESTION_PATTERNS:
        if re.search(p, lower, re.IGNORECASE):
            return True
    return False