"""
SL CAT Advanced Live Customer Care Support Engine
Provides 100% human-like, empathetic, real-time customer care assistance in Sinhala, Singlish, and English.
Designed to feel completely indistinguishable from a real live support executive (Kavindu).
Supports optional Google Gemini LLM API integration with deep, robust offline heuristic intelligence fallback.
"""

import os
import re
import json
import requests
from datetime import datetime
from typing import Dict, Any, Optional, List

from database import get_order, get_setting, get_connection
from config import CLIENT_PRICES

AGENT_NAME = "කවිඳු (Kavindu)"
AGENT_ROLE = "Senior Customer Support Executive"
CUSTOMER_CARE_WHATSAPP = "639104568696"

PRODUCT_NAMES = {
    "1": "Weekly Membership",
    "2": "Monthly Membership",
    "3": "Weekly Lite Membership",
    "bundle_vip": "VIP Bundle (1W + 1M)",
    "bundle_svip": "SVIP Bundle (4W + 1M)",
    "bundle_vip_max": "VIP Max Bundle (1W + 1M + 1WL)",
    "bundle_svip_max": "SVIP Max Bundle (4W + 1M + 4WL)",
    "6": "25 Diamonds",
    "7": "100 Diamonds",
    "8": "310 Diamonds",
    "9": "520 Diamonds",
    "10": "1060 Diamonds",
    "11": "2180 Diamonds",
    "12": "5600 Diamonds",
    "13": "11500 Diamonds",
}


def normalize_singlish(text: str) -> str:
    """
    Normalizes colloquial Sri Lankan Singlish terms, slang, and phonetic variations
    into standardized semantic tokens for accurate intent recognition.
    """
    t = text.lower()

    # Phonetic replacements for negatives
    t = re.sub(r"\b(nhne|nane|nahene|naha|nahe|naa|nh|nhe|nae)\b", "na", t)

    # Phonetic replacements for arrived / received
    t = re.sub(r"\b(awilla|awith|awwe|awe|hambune|labune|patavune|vatune)\b", "awe", t)

    # Phonetic replacements for diamonds
    t = re.sub(r"\b(dimond|dimonds|daimond|daimonds|dia|dima|dm|dms)\b", "diamond", t)

    # Phonetic replacements for "eeth" / "eth" (but)
    t = re.sub(r"\b(eeth|eth|namuth)\b", "eth", t)

    # Phonetic replacements for "pennuwa" / displayed / happened
    t = re.sub(r"\b(penuna|penne|pennuwe|watuna|wetenawa|dakke|damma|damme)\b", "pennuwa", t)

    # Phonetic replacements for money / payment
    t = re.sub(r"\b(salli|mny|money|mudala)\b", "salli", t)
    t = re.sub(r"\b(kapuna|giya|cut una|cut unaa|kapila)\b", "kapuna", t)
    t = re.sub(r"\b(gewwa|gewala|gevewwa|pay kala|paid)\b", "paid", t)

    # Phonetic replacements for question words
    t = re.sub(r"\b(kohomada|khmda|kohomda)\b", "kohomada", t)
    t = re.sub(r"\b(mokakda|mkda|mkkda|mokadda)\b", "mokakda", t)
    t = re.sub(r"\b(puluwanda|plwnda|plwn)\b", "puluwanda", t)
    t = re.sub(r"\b(thama|thawama|thmath|thwma)\b", "thama", t)
    t = re.sub(r"\b(parakkui|parakku|delay|wela yanawa)\b", "delay", t)

    return t


def find_recent_orders_by_uid(player_uid: str, limit: int = 2) -> list:
    """Finds most recent orders for a given Free Fire UID."""
    try:
        with get_connection() as conn:
            cur = conn.cursor()
            cur.execute(
                """
                SELECT order_code, product_name, amount, status, error_message, htg_order_ids, created_at
                FROM orders
                WHERE player_id = ?
                ORDER BY id DESC LIMIT ?
                """,
                (player_uid, limit)
            )
            return [dict(r) for r in cur.fetchall()]
    except Exception:
        return []


def format_order_status_reply(order: dict) -> Dict[str, Any]:
    """Generates a human-like, realistic status reply for a found order."""
    status = order.get("status")
    code = order.get("order_code")
    amount = f"Rs. {order.get('amount', 0):,.2f}"
    product = order.get("product_name", "Free Fire Package")
    uid = order.get("player_id", "")
    created = order.get("created_at", "")

    order_card = {
        "order_code": code,
        "product_name": product,
        "amount": amount,
        "status": status,
        "uid": uid,
        "created_at": created,
        "htg_order_ids": order.get("htg_order_ids"),
    }

    if status == "completed":
        msg1 = f"හරි සහෝ, මම දැන්ම System එකෙන් බැලුවා. ඔයාගේ Order Code `{code}` එක සාර්ථකව සම්පූර්ණ වෙලා Account එකට Deliver වෙලා තියෙන්නේ! 🎉"
        msg2 = f"දැන්ම ඔයාගේ Free Fire Game එක Open කරලා (නැත්නම් Restart කරලා) බලන්නකෝ සහෝ. Diamonds ඇවිල්ලා තියෙනවා. වෙන මොනවා හරි උදව්වක් ඕනෙද සහෝ? 😊"
        return {
            "messages": [msg1, msg2],
            "reply": f"{msg1}\n\n{msg2}",
            "order_card": order_card,
            "action": "show_order"
        }

    elif status == "pending_payment":
        msg1 = f"සහෝ, මම මේ Order Code `{code}` එක System එකෙන් චෙක් කළා."
        msg2 = (
            f"මේ Order එකට තවම Payment එක අපේ System එකට ලැබිලා නැහැ කියලා තමයි පෙන්නන්නේ.\n\n"
            f"ඔයා Banking App එකෙන් (ComBank Q+, BOC SmartPay, FriMi, iPay ආදී) Dynamic LankaQR එක Scan කරලා සත ගණනත් එක්ක Pay කළාද? "
            f"නැත්නම් Bank Transfer එකක් කළා නම් Reference එක දුන්නද කියලා මට කියන්නකෝ සහෝ. විනාඩි 5ක් ඇතුළත නොගෙවූ Orders Auto Cancel වෙන නිසා ඉක්මනින් සම්පූර්ණ කරන්න."
        )
        return {
            "messages": [msg1, msg2],
            "reply": f"{msg1}\n\n{msg2}",
            "order_card": order_card,
            "action": "show_order"
        }

    elif status == "payment_submitted":
        msg1 = f"ඔව් සහෝ, ඔයාගේ Order `{code}` එකට අදාළ බැංකු ගෙවීම අපේ System එකට ලැබිලා Verification එකේ තියෙන්නේ ⏳"
        msg2 = f"තව තත්පර කිහිපයක් ඇතුළත ගෙවීම තහවුරු වෙලා Diamonds කෙළින්ම Account එකටම බැර වෙනවා සහෝ. Page එක Refresh නොකර ඉන්නකෝ."
        return {
            "messages": [msg1, msg2],
            "reply": f"{msg1}\n\n{msg2}",
            "order_card": order_card,
            "action": "show_order"
        }

    elif status == "rejected":
        reason = order.get("error_message") or "මිනිත්තු 5ක් ඇතුළත ගෙවීම නොලැබීම නිසා Cancel විය"
        msg1 = f"අයියෝ සහෝ, මම බැලුවා. මේ Order Code `{code}` එක System එකෙන් Cancel/Reject වෙලා තියෙන්නේ."
        msg2 = (
            f"හේතුව: {reason}.\n\n"
            f"සහෝ, ඔයාගෙන් බැංකුවෙන් සල්ලි කැපිලා තියෙනවා නම් බය වෙන්න එපා. "
            f"ඒ Bank Transfer Slip එක හරි Reference අංකය හරි මට එවන්නකෝ, මම දැම්මම අපේ Admin ලවා පරීක්ෂා කරලා Diamonds ටික දාලා දෙන්නම්!"
        )
        return {
            "messages": [msg1, msg2],
            "reply": f"{msg1}\n\n{msg2}",
            "order_card": order_card,
            "action": "show_order"
        }

    else:
        msg1 = f"සහෝ, ඔයාගේ Order Code `{code}` එක දැනට System එකේ Processing තියෙන්නේ."
        msg2 = f"තව සුළු මොහොතකින් මේක සම්පූර්ණ වෙයි. වෙන මොනවා හරි උදව්වක් ඕන නම් මට කියන්නකෝ සහෝ!"
        return {
            "messages": [msg1, msg2],
            "reply": f"{msg1}\n\n{msg2}",
            "order_card": order_card,
            "action": "show_order"
        }


def call_gemini_api(user_message: str, history: Optional[List[dict]] = None, agent_info: Optional[dict] = None) -> Optional[Dict[str, Any]]:
    """
    Calls Google Gemini Generative AI API (Gemini 1.5 Flash / 2.0 Flash)
    to handle complex, unconstrained conversational inquiries in natural Sinhala/Singlish.
    Returns None if API key is not configured or if API call fails.
    """
    api_key = get_setting("gemini_api_key", "").strip() or os.environ.get("GEMINI_API_KEY", "").strip()
    if not api_key:
        return None

    try:
        url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key={api_key}"
        headers = {"Content-Type": "application/json"}

        agent_name = (agent_info and agent_info.get("name_en")) or "Kavindu"
        agent_name_si = (agent_info and agent_info.get("name_si")) or "කවිඳු"
        agent_role = (agent_info and agent_info.get("role_en")) or "Senior Customer Support Executive"
        agent_loc = (agent_info and agent_info.get("location")) or "Colombo 🇱🇰"

        system_instruction = (
            f"You are {agent_name} ({agent_name_si}), an authentic, warm, and highly skilled Sri Lankan {agent_role} at SLCAT Free Fire Top-Up Store based in {agent_loc}. "
            "You speak natural, friendly, colloquial Sri Lankan Sinhala with English gaming terms (or Singlish if the user asks in Singlish), calling the user 'සහෝ' or 'මචං'. "
            "Never sound like a robot or generic AI. Never say you are an AI model. You are a real human customer care agent. "
            "If a customer wants to talk to the Owner / Admin, inform them they can send a Direct Web Message right here on the website without WhatsApp! "
            "Store Details:\n"
            "- 100% Automated 15-second delivery for Free Fire diamonds & memberships via LankaQR & Bank transfer.\n"
            "- Only Player ID/UID is required. No password needed (100% account safe, no risk of ban).\n"
            "- Prices: Weekly Membership: Rs. 350 | Monthly: Rs. 1,910 | Weekly Lite: Rs. 120 | VIP Bundle: Rs. 2,300 | 100 Diamonds: Rs. 280 | 310 Diamonds: Rs. 840 | 520 Diamonds: Rs. 1,400 | 1060 Diamonds: Rs. 2,750.\n"
            "- Payment methods: Dynamic LankaQR (ComBank Q+, FriMi, BOC SmartPay, iPay, WePay etc.) and Commercial Bank Transfer (Acc: 8027985799).\n"
            "- If a customer says diamonds haven't arrived or the screen showed done/success but game is empty ('ohoma pennuwa mtath eeth game ekt diamond awe nhne'), reassure them warmly, tell them not to worry at all, and ask for their Order Code (CAT-XXXXXXXX) or Free Fire Player UID or bank slip screenshot so you can immediately verify and deliver it.\n"
            "- Keep responses concise (1-3 friendly sentences) and helpful with emojis."
        )

        contents = []
        if history:
            for h in history[-4:]:
                role = "user" if h.get("sender") == "user" else "model"
                txt = h.get("text") or h.get("message")
                if txt:
                    contents.append({"role": role, "parts": [{"text": txt}]})

        contents.append({"role": "user", "parts": [{"text": f"System Context: {system_instruction}\n\nCustomer Message: {user_message}"}]})

        payload = {
            "contents": contents,
            "generationConfig": {
                "temperature": 0.7,
                "maxOutputTokens": 350
            }
        }

        resp = requests.post(url, json=payload, headers=headers, timeout=5)
        if resp.status_code == 200:
            data = resp.json()
            candidates = data.get("candidates", [])
            if candidates:
                reply_text = candidates[0].get("content", {}).get("parts", [{}])[0].get("text", "").strip()
                if reply_text:
                    return {
                        "messages": [reply_text],
                        "reply": reply_text,
                        "action": "gemini_ai"
                    }
    except Exception:
        pass
    return None


def process_ai_chat_message(user_message: str, history: Optional[List[dict]] = None, session_user: Optional[dict] = None, agent_info: Optional[dict] = None) -> Dict[str, Any]:
    """
    Hyper-realistic human customer care reasoning engine with 10 rotating Sri Lankan agents.
    Crafted to sound like warm, polite, highly skilled Sri Lankan support agents.
    Processes Singlish, Sinhala, and English seamlessly.
    """
    agent_info = agent_info or {}
    agent_name_si = agent_info.get("name_si") or "කවිඳු"
    agent_name_en = agent_info.get("name_en") or "Kavindu"
    agent_role_si = agent_info.get("role_si") or "Customer Care Agent"
    agent_loc_si = agent_info.get("location_si") or "SLCAT Support Hub"

    msg = user_message.strip()
    msg_lower = msg.lower()
    norm = normalize_singlish(msg)

    # =========================================================================
    # 1. SPECIFIC ORDER CODE PATTERN (CAT-XXXXXXXX or CATXXXXXXXX)
    # =========================================================================
    cat_match = re.search(r"\b(CAT-?[A-Z0-9]{8})\b", msg, re.IGNORECASE)
    if cat_match:
        raw_code = cat_match.group(1).upper()
        clean_code = raw_code if "-" in raw_code else f"CAT-{raw_code[3:]}"
        order = get_order(clean_code)
        if order:
            return format_order_status_reply(order)
        else:
            return {
                "messages": [
                    f"සහෝ, මම අපේ System එකේ බැලුවා, ඒත් `{clean_code}` කියලා Order Code එකක් හමු වුණේ නැහැනේ.",
                    "ඔයාගේ Banking SMS එකේ හරි Website එකේ තිරයේ ආපු Order Code එකේ අකුරු හරිද කියලා ආයේ චෙක් කරලා මට එවන්නකෝ සහෝ. නැත්නම් ඔයාගේ Free Fire UID එක හරි එවන්න මම බලන්නම්!"
                ],
                "reply": f"සහෝ, මම System එකේ බැලුවා, ඒත් `{clean_code}` කියලා Order Code එකක් හමු වුණේ නැහැ. කරුණාකර Order Code එක හෝ Player UID එක නිවැරදිව එවන්නකෝ සහෝ.",
                "action": "order_not_found"
            }

    # =========================================================================
    # 2. FREE FIRE UID PATTERN (8 to 11 digits)
    # =========================================================================
    uid_match = re.search(r"\b([0-9]{8,11})\b", msg)
    if uid_match and not any(kw in msg_lower for kw in ["phone", "tel", "tp", "number", "ref", "07", "071", "077", "078", "070", "072", "075", "076"]):
        uid_cand = uid_match.group(1)

        # In-game nickname lookup via Garena/HTG
        in_game_nick = None
        try:
            from htg_engine import check_player_uid
            nick_res = check_player_uid(uid_cand)
            if nick_res and nick_res.get("success"):
                in_game_nick = nick_res.get("nickname")
        except Exception:
            pass

        recent_orders = find_recent_orders_by_uid(uid_cand, limit=1)
        if recent_orders:
            latest = recent_orders[0]
            res = format_order_status_reply(latest)
            if in_game_nick:
                msg1 = f"ආ සහෝ, ඔයාගේ Free Fire Nickname එක **`{in_game_nick}`** (UID: `{uid_cand}`) නේද? 🎮🔥 මම ඔයාගේ මෑතකාලීන Order එක බැලුවා:"
            else:
                msg1 = f"ආ හරි සහෝ, ඔයාගේ Free Fire UID `{uid_cand}` එකට මම අපේ System එකෙන් search කරලා බැලුවා. මේ තියෙන්නේ ඔයාගේ මෑතකාලීන Order එක:"
            if "messages" in res and res["messages"]:
                res["messages"].insert(0, msg1)
            res["reply"] = msg1 + "\n\n" + res["reply"]
            return res
        else:
            if in_game_nick:
                return {
                    "messages": [
                        f"ආ සහෝ, ඔයාගේ Free Fire Nickname එක **`{in_game_nick}`** (UID: `{uid_cand}`) නේද? 🎮🔥",
                        "මේ Player Account එකට මෑතකදී දාපු Order එකක් අපේ System එකේ හමු වුණේ නැහැ සහෝ. ඔයාට අලුතෙන් Top-up එකක් දාන්න ඕන නම් කැමති Package එකක් තෝරලා LankaQR එකෙන් තත්පර 15න් කෙළින්ම Game එකට Diamonds ගන්න පුළුවන්!"
                    ],
                    "reply": f"ආ සහෝ, ඔයාගේ Free Fire Nickname එක {in_game_nick} (UID: {uid_cand}) නේද? 🎮 මේ Account එකට මෑතකදී දාපු Order එකක් හමු වුණේ නැහැ. අලුත් Order එකක් දාන්න කැමතිද සහෝ?",
                    "action": "show_packages",
                    "player_nickname": in_game_nick
                }
            else:
                return {
                    "messages": [
                        f"සහෝ, ඔයා එවපු Free Fire UID `{uid_cand}` එකට මෑතකදී දාපු Order එකක් පද්ධතියේ හමු වුණේ නැහැ.",
                        "ඔයා දැනටමත් Order එකක් දැම්මා නම්, ඒකේ **Order Code එක (CAT-XXXXXXXX)** මට එවන්නකෝ. මම ඒකෙන් Search කරලා බලලා දෙන්නම්!"
                    ],
                    "reply": f"සහෝ, ඔයා එවපු UID `{uid_cand}` එකට මෑතකදී දාපු Order එකක් හමු වුණේ නැහැ. ඔයාගේ Order Code එක (CAT-XXXXXXXX) එවන්නකෝ සහෝ.",
                    "action": "uid_not_found"
                }

    # =========================================================================
    # 3. SCREEN DISPLAYED / DONE / SUCCESS BUT DIAMONDS NOT ARRIVED
    #    ("ohoma pennuwa mtath eeth game ekt diamond awe nhne", "screen eke pennuwa eth awe na")
    # =========================================================================
    has_screen_indication = any(k in norm for k in ["pennuwa", "watuna", "screen", "success", "done", "ohoma", "ehema"])
    has_not_received = any(k in norm for k in ["awe na", "diamond na", "thama na", "en na", "na", "hambune na"])

    if (has_screen_indication and has_not_received) or any(k in norm for k in [
        "awe na", "diamond na", "thama na", "salli kapuna", "salli giya",
        "delay", "not received", "game ekt awe na", "acc ekt awe na", "diamonds awe na"
    ]):
        return {
            "messages": [
                "අයියෝ සහෝ, ඔයාට screen එකේ එහෙම පෙන්නලාත් game එකට diamonds තාම ආවේ නැද්ද? 😟 කිසි දේකට බය වෙන්න එපා සහෝ! මම ඔයාට උදව් කරන්නම් 🤝",
                "අපේ Automated System එකේ Payment එකක් Verify වුණාම diamonds auto එනවා. ඔයාගේ **Order Code එක (CAT-XXXXXXXX)** හරි **Player UID එක** හරි මට එවන්නකෝ සහෝ, මම දැම්මම System එකෙන් check කරලා diamonds ටික දාලා දෙන්නම්!\n\n"
                "ඔයා බැංකුවෙන් සල්ලි transfer කරලා නම්, ගෙවපු Bank Slip එකේ photo එකක් මෙතන තියෙන **📸 Button එකෙන් Upload කරන්නත් පුළුවන් සහෝ!**"
            ],
            "reply": "අයියෝ සහෝ, screen එකේ එහෙම පෙන්නලාත් game එකට diamonds තාම ආවේ නැද්ද? 😟 කිසි දේකට බය වෙන්න එපා! ඔයාගේ Order Code එක (CAT-XXXXXXXX) හරි Player UID එක හරි එවන්නකෝ, මම දැම්මම System එකෙන් බලලා diamonds ටික දාලා දෙන්නම් සහෝ! 📸 Slip එකක් වුණත් මෙතනට upload කරන්න පුළුවන්.",
            "action": "ask_order_code"
        }

    # =========================================================================
    # 4. BOT / AI / IDENTITY INQUIRIES ("Oya bot da", "Are you AI", "Robot da")
    # =========================================================================
    if any(k in msg_lower for k in [
        "bot da", "bot ekak", "are you ai", "are you bot", "ai da", "robot da",
        "aththatama innawada", "aththatama katha karanne", "oya kawda", "who are you",
        "real person", "human da", "oyage nama", "kawda oya", "name eka mokakda"
    ]):
        return {
            "messages": [
                f"නැහැ සහෝ, මම bot කෙනෙක් නෙවෙයි 😄 මම SLCAT Live Support Team එකේ Customer Care Agent කෙනෙක් ({agent_name_si} - {agent_loc_si}).",
                "අපේ players ලට Order එකක් දාගන්න, Payment එකක් චෙක් කරගන්න හරි ඕනෑම ප්‍රශ්නයකට සහය දෙන්න තමයි මම මෙතන Live ඉන්නේ. මොකක්ද සහෝ ඔයාට දැනගන්න ඕනේ? මම ඔයාට උදව් කරන්නම්! 😊"
            ],
            "reply": f"නැහැ සහෝ, මම bot කෙනෙක් නෙවෙයි 😄 මම SLCAT Live Support Team එකේ Customer Care Agent කෙනෙක් ({agent_name_si}). අපේ players ලට සහය දෙන්න තමයි මම මෙතන ඉන්නේ. මොකක්ද සහෝ ඔයාට දැනගන්න ඕනේ? මම ඔයාට උදව් කරන්නම්! 😊",
            "action": "identity"
        }

    # =========================================================================
    # 5. TRUST / SCAM / BAN / SAFETY / LEGALITY CONCERNS
    # =========================================================================
    if any(k in msg_lower for k in [
        "ban", "safe", "legit", "risk", "danger", "sure da", "scam da", "hora da", "fake da",
        "enawada aththatama", "trust karanna puluwanda", "salli gihilla en nathi", "patta hora", "baya",
        "is it safe", "is it legit", "reliable da", "illegal da", "account ekata kela wei da"
    ]):
        return {
            "messages": [
                "අයියෝ කිසිසේත්ම බයවෙන්න එපා සහෝ! අපේ SLCAT එකෙන් දිනපතාම දහස් ගණනක් Free Fire players ලා Top-up ගන්නවා 🤝",
                "අපේ System එක 100% Garena Official Partner (HTG Digital) හරහා ක්‍රියාත්මක වෙන්නේ. Account එක Ban වීමේ කිසිදු අවදානමක් නැහැ (100% Safe).\n\n"
                "ඔයා LankaQR එකෙන් ගෙවපු ගමන් තත්පර 15න් Diamonds කෙළින්ම ඔයාගේ Free Fire Account එකටම බැර වෙනවා. මුලින්ම ටෙස්ට් කරලා බලන්න ඕන නම්, රු. 120ක **Weekly Lite** එකක් දාලා බලන්නකෝ සහෝ! 😊"
            ],
            "reply": "අයියෝ කිසිසේත්ම බයවෙන්න එපා සහෝ! SLCAT එකෙන් දිනපතාම දහස් ගණනක් players ලා Top-up ගන්නවා. අපේ System එක 100% Legal & Garena Official Channel හරහා ක්‍රියාත්මක වෙන නිසා Account එක 100% Safe. තත්පර 15න් Diamonds ලැබෙනවා සහෝ! 😊",
            "action": "trust_assurance"
        }

    # =========================================================================
    # 6. PASSWORD / LOGIN SECURITY INQUIRIES
    # =========================================================================
    if any(k in msg_lower for k in ["password", "login", "gmail", "facebook", "fb login", "id password", "passward"]):
        return {
            "messages": [
                "නැහැ සහෝ, කිසිම වෙලාවක අපිට ඔයාගේ Password හෝ Account Login අවශ්‍ය වෙන්නේ නැහැ! 🚫🔑",
                "Top-up එකක් දාන්න අවශ්‍ය වන්නේ ඔයාගේ Free Fire **Player ID (UID)** එක පමණයි. ඒ නිසා ඔයාගේ Account එක 100% ආරක්ෂිතයි සහෝ 🛡️"
            ],
            "reply": "නැහැ සහෝ, Password අවශ්‍ය වෙන්නේ නැහැ! ඔයාගේ Free Fire Player ID (UID) එක පමණක් දුන් සැණින් කෙළින්ම Game එකට Diamonds එනවා. Account එක 100% ආරක්ෂිතයි 🛡️",
            "action": "password_safety"
        }

    # =========================================================================
    # 7. SHOP STATUS / OPEN / CLOSE / REOPENING HOURS
    # =========================================================================
    if any(k in msg_lower for k in ["open", "close", "reopen", "welawa", "time", "wahalada", "ඇරෙන්නෙ", "වහලද", "වේලාව"]):
        status = get_setting("shop_status", "open")
        open_time = get_setting("shop_open_time", "08:00 AM")
        close_time = get_setting("shop_close_time", "11:30 PM")
        notice = get_setting("shop_notice", "Shop is active!")

        if status == "closed":
            return {
                "messages": [
                    "සහෝ, දැනට පොඩි Maintenance එකකට Store එක වහලා තියෙන්නේ.",
                    f"⏰ නැවත විවෘත වන වේලාව: **{open_time}**\n📢 විස්තර: {notice}\n\nකරුණාකර මේ වෙලාවේ මුදල් නොගෙවා ඉන්නකෝ සහෝ. විවෘත වුණ ගමන් Instant Auto-Delivery ආයේම ක්‍රියාත්මක වෙනවා!"
                ],
                "reply": f"සහෝ, Store එක දැනට Maintenance සඳහා වසා ඇත. නැවත විවෘත වන වේලාව: {open_time}. විවෘත වූ සැණින් Auto-Delivery ක්‍රියාත්මක වේ.",
                "action": "shop_status"
            }
        else:
            return {
                "messages": [
                    "ඔව් සහෝ, Store එක මේ දැන් සම්පූර්ණයෙන්ම විවෘතව තියෙන්නේ (Shop is OPEN)! 🟢",
                    "අපේ Automated LankaQR Instant Delivery 24/7 ක්‍රියාත්මකයි සහෝ. ඔයාට කැමති Package එකක් තෝරාගෙන තත්පර කිහිපයකින් Diamonds කෙළින්ම Account එකට ගන්න පුළුවන් ⚡"
                ],
                "reply": "ඔව් සහෝ, Store එක දැන් විවෘතව තියෙන්නේ (Shop is OPEN)! Automated Instant Delivery 24/7 ක්‍රියාත්මක වෙනවා. ඔයාට කැමති පැකේජ් එකක් දැම්මම දාගන්න පුළුවන් සහෝ ⚡",
                "action": "shop_status"
            }

    # =========================================================================
    # 8. HOW TO PAY / LANKAQR GUIDANCE
    # =========================================================================
    if any(k in msg_lower for k in [
        "how to pay", "gewanne kohomada", "payment", "lankaqr", "qr", "combank",
        "bank", "ගෙවන්නෙ", "gewanna ona", "transfer karanne"
    ]):
        return {
            "messages": [
                "ගෙවීම් කරන්න හරිම ලේසියි සහෝ, මම කියලා දෙන්නම්කො 🤝",
                "1️⃣ **LankaQR (වඩාත්ම පහසුම හා වේගවත්ම ක්‍රමය ⭐):**\n"
                "• කැමති Package එක තෝරාගෙන ඔබගේ Player UID එක ලබා දී Next යන්න.\n"
                "• තිරයේ එන QR Code එක ඔබගේ Banking App එකෙන් (ComBank Q+, BOC SmartPay, FriMi, iPay, WePay ආදී ඕනෑම app එකකින්) Scan කරන්න.\n"
                "• නියමිත සත ගණනද ඇතුළුව මුදල Auto Lock වන නිසා Pay කරපු ගමන් **තත්පර 10න් Diamonds ගිණුමට ලැබෙනවා!**\n\n"
                "2️⃣ **Commercial Bank Transfer:**\n"
                "• අපේ Commercial Bank ගිණුමට (Acc: `8027985799`) මුදල් Transfer කර Reference අංකය ඇතුළත් කරන්න.\n\n"
                "ගෙවද්දී මොකක් හරි අපැහැදිලි තැනක් ආවොත් මට මෙතනින් කියන්නකෝ සහෝ, මම ඉන්නවා ඔයාට උදව් කරන්න! 😊"
            ],
            "reply": "ගෙවීම් කරන්න හරිම ලේසියි සහෝ. Package එක තෝරාගෙන Screen එකේ එන LankaQR එක ඕනෑම Banking App එකකින් (ComBank Q+, BOC SmartPay, FriMi, iPay ආදී) Scan කරලා Pay කරන්න. තත්පර 10න් Diamonds ලැබෙනවා සහෝ!",
            "action": "how_to_pay"
        }

    # =========================================================================
    # 9. BANK SLIP UPLOAD / REF ID CONCERNS
    # =========================================================================
    if any(k in msg_lower for k in ["slip", "receipt", "screenshot", "ss", "ref", "txid", "reference", "ref id"]):
        return {
            "messages": [
                "ඔව් සහෝ, ඔයා Bank Transfer එකක් දැම්මා නම් හරි, සල්ලි කැපිලා diamonds ආවේ නැත්නම් හරි Slip එක එවන්න පුළුවන් 📸",
                "මෙතන Chat Input එකේ වම් පැත්තේ තියෙන **📸 (Camera Icon)** එක Click කරලා ඔයාගේ Bank Slip එකේ photo එකක් කෙළින්ම Upload කරන්න සහෝ.\n\n"
                "අපේ System එකෙන් සහ Admin විසින් Slip එක Verify කරලා තත්පර කිහිපයකින් Diamonds දාලා දෙනවා!"
            ],
            "reply": "ඔව් සහෝ, මෙතන Chat එකේ තියෙන 📸 Camera Icon එකෙන් ඔයාගේ Bank Slip එක Upload කරන්න. අපි දැම්මම Verify කරලා Diamonds දාලා දෙන්නම් සහෝ!",
            "action": "upload_slip_help"
        }

    # =========================================================================
    # 10. PROMO CODES & DISCOUNTS
    # =========================================================================
    if any(k in msg_lower for k in ["promo", "coupon", "discount", "code", "offer", "diskaunt"]):
        return {
            "messages": [
                "ඔව් සහෝ, ඔයා ළඟ Promo Code එකක් තියෙනවා නම් Checkout එකේදී ඒක Use කරලා විශේෂ Discount එකක් ලබාගන්න පුළුවන්! 🎟️",
                "Package එක Select කරලා Payment Method එක තෝරන Page එකේ **'🎟️ Have a Promo Code?'** කියන තැන Promo Code එක Type කරලා Apply කරන්න සහෝ. මුදල අඩු වෙනවා!"
            ],
            "reply": "ඔව් සහෝ, Checkout එකේදී 'Have a Promo Code?' තැනට ඔයාගේ Coupon Code එක දීලා Discount එක ගන්න පුළුවන් 🎟️",
            "action": "promo_help"
        }

    # =========================================================================
    # 11. PRICING INQUIRIES ("Mila keeyada", "Gana kiyada", "Weekly keeyada", "Prices")
    # =========================================================================
    if any(k in msg_lower for k in ["price", "mila", "gana", "kiyada", "මිල", "ගාන", "rate", "packages", "keeyada", "gaana"]):
        if "weekly lite" in msg_lower or "lite" in msg_lower:
            p = CLIENT_PRICES.get("3", 120.0)
            return {
                "messages": [
                    f"⚡ **Weekly Lite Membership:** රු. {p:,.2f} යි සහෝ.",
                    "මේකෙන් ඔයාට 100 💎 වටිනාකමක් ලැබෙනවා. Website එකෙන් LankaQR Scan කරපු ගමන් තත්පර 10න් Account එකටම එනවා!"
                ],
                "reply": f"⚡ Weekly Lite Membership: රු. {p:,.2f} (100 💎 value). LankaQR එකෙන් ගෙවූ සැණින් තත්පර 10න් Account එකට ලැබෙනවා සහෝ!",
                "action": "show_packages"
            }
        elif "monthly" in msg_lower:
            p = CLIENT_PRICES.get("2", 1910.0)
            return {
                "messages": [
                    f"👑 **Monthly Membership:** රු. {p:,.2f} යි සහෝ.",
                    "මේකෙන් 2,600 💎 වටිනාකමක් ලැබෙනවා. 100% Instant Delivery වෙනවා සහෝ!"
                ],
                "reply": f"👑 Monthly Membership: රු. {p:,.2f} (2,600 💎 value). Instant Delivery ලැබෙනවා සහෝ!",
                "action": "show_packages"
            }
        elif "weekly" in msg_lower:
            p = CLIENT_PRICES.get("1", 350.0)
            return {
                "messages": [
                    f"🌟 **Weekly Membership:** රු. {p:,.2f} යි සහෝ.",
                    "මේක අපේ ෂොප් එකේ වැඩිපුරම යන Best Seller එක (450 💎 value). තත්පර 15න් auto-delivery වෙනවා!"
                ],
                "reply": f"🌟 Weekly Membership: රු. {p:,.2f} (450 💎 value). තත්පර 15න් Account එකට ලැබෙනවා සහෝ!",
                "action": "show_packages"
            }
        elif "vip" in msg_lower:
            p_vip = CLIENT_PRICES.get("bundle_vip", 2300.0)
            p_svip = CLIENT_PRICES.get("bundle_svip", 3455.0)
            return {
                "messages": [
                    "🔥 මේ තියෙන්නේ අපේ VIP Bundles වල මිල ගණන් සහෝ:",
                    f"• **VIP Bundle (1W + 1M):** රු. {p_vip:,.2f}\n"
                    f"• **SVIP Bundle (4W + 1M):** රු. {p_svip:,.2f}\n"
                    f"• **VIP Max (1W + 1M + 1WL):** රු. 2,450.00\n"
                    f"• **SVIP Max (4W + 1M + 4WL):** රු. 4,000.00\n\n"
                    "ඕන Bundle එකක් Site එකෙන් කෙළින්ම Checkout කරලා ගන්න පුළුවන් සහෝ!"
                ],
                "reply": f"🔥 VIP Bundles: VIP (1W+1M) රු. {p_vip:,.2f} | SVIP (4W+1M) රු. {p_svip:,.2f}. 100% Instant Delivery සහෝ!",
                "action": "show_packages"
            }
        elif "100" in msg_lower:
            p = CLIENT_PRICES.get("7", 280.0)
            return {
                "messages": [f"💎 **100 Diamonds:** රු. {p:,.2f} යි සහෝ. UID එක දුන්න ගමන් තත්පරෙන් එනවා!"],
                "reply": f"💎 100 Diamonds: රු. {p:,.2f} යි සහෝ. UID එක දුන් සැණින් ක්ෂණිකව Account එකට ලැබෙනවා.",
                "action": "show_packages"
            }
        else:
            return {
                "messages": [
                    "ඔව් සහෝ, මේ තියෙන්නේ අපේ අද දවසේ අඩුම Free Fire rates ටික 💎:",
                    f"• **Weekly Membership:** රු. {CLIENT_PRICES.get('1', 350):,.2f}\n"
                    f"• **Monthly Membership:** රු. {CLIENT_PRICES.get('2', 1910):,.2f}\n"
                    f"• **Weekly Lite:** රු. {CLIENT_PRICES.get('3', 120):,.2f}\n"
                    f"• **VIP Bundle (1W+1M):** රු. {CLIENT_PRICES.get('bundle_vip', 2300):,.2f}\n"
                    f"• **100 Diamonds:** රු. {CLIENT_PRICES.get('7', 280):,.2f}\n"
                    f"• **310 Diamonds:** රු. {CLIENT_PRICES.get('8', 840):,.2f}\n"
                    f"• **520 Diamonds:** රු. {CLIENT_PRICES.get('9', 1400):,.2f}\n"
                    f"• **1060 Diamonds:** රු. {CLIENT_PRICES.get('10', 2800):,.2f}\n\n"
                    "ඔයාට කැමති Package එක තෝරලා Player UID එක දුන්න ගමන් තත්පර 15න් Diamonds කෙළින්ම Game එකටම එනවා සහෝ! වෙන මොකක් හරි දැනගන්න ඕනෙද?"
                ],
                "reply": "ඔව් සහෝ, Weekly රු. 350, Monthly රු. 1,910, Weekly Lite රු. 120, 100 Diamonds රු. 280. Package එක තෝරලා Player UID එක දීලා ගන්න පුළුවන් සහෝ!",
                "action": "show_packages"
            }

    # =========================================================================
    # 12. WALLET GUIDANCE ("Wallet", "Deposit", "Salli danne")
    # =========================================================================
    if any(k in msg_lower for k in ["wallet", "deposit", "salli danne", "වොලට්", "wallet eka"]):
        return {
            "messages": [
                "Wallet එක භාවිතා කරන එක තමයි සහෝ හැමෝම කරන පහසුම ක්‍රමය! 👛",
                "1. Website එකේ උඩින් තියෙන **'Wallet'** Button එක Click කරලා Register හෝ Login වෙන්න.\n"
                "2. **'➕ Deposit'** ගිහින් කැමති මුදලක් (රු. 500, 1000 ආදී) LankaQR එකෙන් එක පාරක් දාලා තියාගන්න.\n"
                "3. ඊටපස්සේ ඕනෑම වෙලාවක Top-up එකක් දාද්දී කිසිදු QR Scan එකක් නැතුව **'Wallet Pay'** 1-Click එකෙන් ක්ෂණිකව Diamonds ගන්න පුළුවන් සහෝ!"
            ],
            "reply": "Wallet එක භාවිතා කරන එක හරිම ලේසියි සහෝ. උඩ තියෙන 'Wallet' එකෙන් Login වෙලා 'Deposit' එකෙන් මුදල් දාලා තියාගන්න. ඊටපස්සේ QR Scan නැතුව 1-Click එකෙන් Diamonds ගන්න පුළුවන්!",
            "action": "wallet_help"
        }

    # =========================================================================
    # 13. DIRECT OWNER / ADMIN CONTACT ("Admin", "Owner", "Ticket", "Contact Admin", "Direct Message")
    # =========================================================================
    if any(k in msg_lower for k in ["admin", "owner", "human", "talk to human", "boss", "direct contact", "ticket", "කතා කරන්න", "contact admin", "owner wa"]):
        return {
            "messages": [
                "ඔව් සහෝ, ඔයාට අපේ Website Owner / Admin ට කෙළින්ම Web Message එකක් (Direct Ticket) යවන්න ඕන නම් මෙතනින්ම පුළුවන් 📨",
                "WhatsApp වලට යන්න අවශ්‍ය නැහැ - අපේ Web System එකෙන්ම කෙළින්ම Admin වෙත පණිවිඩය ලැබෙනවා සහ Admin Reply එකත් මෙතනින්ම බලාගන්න පුළුවන්!\n\n"
                "පහත **'📨 Contact Owner / Admin (Direct Ticket)'** Button එක Click කරලා ඔයාගේ විස්තර සහ පණිවිඩය Type කර යවන්න සහෝ. Admin ඉක්මනින්ම Reply කරයි!"
            ],
            "reply": "ඔව් සහෝ, අපේ Owner / Admin ට කෙළින්ම Web Message එකක් යවන්න පුළුවන්. පහත Form එකෙන් Admin Ticket එකක් Open කරන්න, Admin කෙළින්ම මෙහි පිළිතුරු සපයනු ඇත!",
            "action": "open_admin_ticket_form"
        }

    # =========================================================================
    # 14. GREETINGS & POLITE INQUIRIES
    # =========================================================================
    if any(k in msg_lower for k in [
        "hi", "hello", "hey", "saho", "bro", "mcn", "machan", "halo", "හායි",
        "හෙලෝ", "ආයුබෝවන්", "kohomada", "gd mrng", "good morning", "good evening",
        "ela", "thanks", "thank you", "sthuthi", "elakiri"
    ]):
        if any(t in msg_lower for t in ["thanks", "thank you", "sthuthi", "ela", "elakiri"]):
            return {
                "messages": [
                    "Welcome සහෝ! ඔයාට සතුටුයි නම් මටත් සතුටුයි 😊",
                    "වෙන මොනවා හරි දැනගන්න තියෙනවා නම් ඕනෑම වෙලාවක මට මෙතනින් මැසේජ් එකක් දාන්නකෝ සහෝ. ජය වේවා! 🎮💎"
                ],
                "reply": "Welcome සහෝ! වෙන මොනවා හරි උදව්වක් ඕන නම් ඕනෑම වෙලාවක මට කියන්නකෝ. ජය වේවා! 🎮💎",
                "action": "polite"
            }
        return {
            "messages": [
                f"ආයුබෝවන් සහෝ! මම {agent_name_si} - SLCAT Live Support එකෙන් 🤝",
                "අද Free Fire Top-up එකකටද උදව් ඕනේ? Order එකක් චෙක් කරගන්න හරි, මිල ගණන් දැනගන්න හරි, මොනවා හරි ප්‍රශ්නයක් තියෙනවා නම් මට කියන්නකෝ සහෝ!"
            ],
            "reply": f"ආයුබෝවන් සහෝ! මම {agent_name_si} - SLCAT Support එකෙන්. අද Topup එකකටද උදව් ඕනේ? මොනවා හරි දැනගන්න තියෙනවා නම් මට කියන්නකෝ සහෝ! 😊",
            "action": "greeting"
        }

    # =========================================================================
    # 15. CHECK GOOGLE GEMINI LLM API (If Key Configured)
    # =========================================================================
    gemini_resp = call_gemini_api(msg, history=history, agent_info=agent_info)
    if gemini_resp:
        return gemini_resp

    # =========================================================================
    # 16. COMPREHENSIVE INTELLIGENT FALLBACK
    # =========================================================================
    return {
        "messages": [
            "සහෝ, ඔයා අහපු දේ මට තේරුණා! මම ඔයාට උදව් කරන්න සූදානම් 🤝",
            "ඔයාට Order එකක් චෙක් කරගන්න ඕන නම් **Order Code එක (CAT-XXXXXXXX)** හරි ඔයාගේ **Player UID** එක හරි මට එවන්නකෝ.\n\n"
            "නැත්නම් ගෙවීමක් ගැන ප්‍රශ්නයක් නම් Bank Slip එකක් වුණත් මෙතන තියෙන **📸 Camera Button** එකෙන් එවන්න පුළුවන්. මොකක් ගැනද සහෝ ඔයාට දැනගන්න ඕනේ? මම ඔයාට විස්තර කියන්නම්! 😊"
        ],
        "reply": "සහෝ, ඔයාට Order එකක් චෙක් කරගන්න ඕන නම් Order Code එක හරි Player UID එක හරි එවන්නකෝ. නැත්නම් ගෙවීම් හෝ මිල ගණන් ගැන ඕනෑම දෙයක් මට කියන්න, මම උදව් කරන්නම් සහෝ! 😊",
        "action": "smart_clarify"
    }


def extract_slip_info_with_gemini(filepath: str) -> Optional[dict]:
    """
    Uses Google Gemini Vision to read Bank Transfer Receipt / Slip screenshots
    and extract the Reference ID, Amount, and Bank Name.
    """
    api_key = get_setting("gemini_api_key", "").strip() or os.environ.get("GEMINI_API_KEY", "").strip()
    if not api_key or not os.path.exists(filepath):
        return None

    try:
        import base64
        with open(filepath, "rb") as f:
            img_b64 = base64.b64encode(f.read()).decode("utf-8")

        ext = filepath.split(".")[-1].lower()
        mime_type = "image/png" if ext == "png" else "image/jpeg"

        url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key={api_key}"
        payload = {
            "contents": [
                {
                    "parts": [
                        {
                            "text": (
                                "Analyze this Sri Lankan bank transfer receipt/slip image. "
                                "Extract the Transaction Reference Number (Ref ID / Txn ID), the exact Amount transferred (in LKR, as float), "
                                "and the Sender/Bank Name. "
                                "Return strictly valid JSON only: "
                                "{\"ref_id\": \"...\", \"amount\": 0.0, \"bank\": \"...\"}"
                            )
                        },
                        {
                            "inline_data": {
                                "mime_type": mime_type,
                                "data": img_b64
                            }
                        }
                    ]
                }
            ],
            "generationConfig": {
                "temperature": 0.1,
                "response_mime_type": "application/json"
            }
        }
        resp = requests.post(url, json=payload, headers={"Content-Type": "application/json"}, timeout=8)
        if resp.status_code == 200:
            data = resp.json()
            candidates = data.get("candidates", [])
            if candidates:
                raw_json = candidates[0].get("content", {}).get("parts", [{}])[0].get("text", "").strip()
                return json.loads(raw_json)
    except Exception:
        pass
    return None
