import logging

from langchain_core.tools import tool
from pydantic import BaseModel, Field

from common.starrocks_connection import get_db_connection

logger = logging.getLogger(__name__)

STORE_TABLE = "shared_source.chatbot_rsa_store_schedule_with_text_embedding"


class StoreSearchInput(BaseModel):
    location: str = Field(
        description="Tên quận/huyện/tỉnh/thành phố hoặc địa chỉ cụ thể mà khách hàng muốn tìm cửa hàng CANIFA. VD: 'Hoàng Mai', 'Cầu Giấy', 'Đà Nẵng', 'Vincom Bà Triệu'."
    )


@tool("canifa_store_search", args_schema=StoreSearchInput)
async def canifa_store_search(location: str) -> str:
    """
    Tìm kiếm cửa hàng CANIFA theo địa điểm/khu vực.
    Sử dụng khi khách hàng hỏi về cửa hàng tại một khu vực cụ thể.
    """
    logger.info(f"🏪 [Store Search] Location: {location}")
    try:
        sr = get_db_connection()

        # Clean location: bỏ prefix generic
        clean = location.lower().strip()
        for prefix in ["quận ", "huyện ", "tỉnh ", "thành phố ", "tp. ", "tp "]:
            clean = clean.replace(prefix, "")
        clean = clean.strip()

        # Tách thành tokens, deduplicate (giữ thứ tự)
        # VD: "hà đông, hà nội" → ["hà", "đông", "nội"]
        tokens = list(dict.fromkeys(
            t for t in clean.replace(',', ' ').split() if t.strip()
        ))

        if not tokens:
            return "Vui lòng cho em biết khu vực bạn muốn tìm cửa hàng CANIFA (ví dụ: Hoàng Mai, Cầu Giấy, Đà Nẵng...)."

        # Search trên concat tất cả cột địa chỉ
        text_col = "LOWER(concat_ws(' ', store_name, address, city, state))"

        def _build_sql(where_clause: str) -> str:
            return f"""
            SELECT store_name, address, city, state, phone_number,
                   schedule_name, time_open_today, time_close_today
            FROM {STORE_TABLE}
            WHERE {where_clause}
            ORDER BY state, city, store_name
            LIMIT 20
            """

        # ═══════════════════════════════════════════════
        # Step 1: AND tất cả tokens (strict match)
        # "hà đông hà nội" → tokens ["hà","đông","nội"] → AND → 5 stores ✓
        # ═══════════════════════════════════════════════
        and_conds = [f"{text_col} LIKE '%{tk}%'" for tk in tokens]
        results = await sr.execute_query_async(_build_sql(' AND '.join(and_conds)))

        # ═══════════════════════════════════════════════
        # Step 2: Fallback — Reverse LIKE
        # Dùng chính DB làm từ điển địa danh:
        # Kiểm tra tên quận/huyện/tỉnh nào trong DB XUẤT HIỆN trong input user
        # "hà đông cầu giấy" chứa "hà đông" (city) + "cầu giấy" (city) → lấy CẢ 2
        # ═══════════════════════════════════════════════
        if not results and len(tokens) >= 2:
            # Strip prefix khỏi city: "Quận Hà Đông" → "hà đông"
            city_stripped = """LOWER(TRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                city, 'Quận ', ''), 'Huyện ', ''), 'Thành phố ', ''), 'Thị xã ', ''), 'TP. ', '')))"""
            state_lower = "LOWER(TRIM(state))"

            fallback_where = f"""
                (LOCATE({city_stripped}, '{clean}') > 0 AND LENGTH({city_stripped}) > 1)
                OR
                (LOCATE({state_lower}, '{clean}') > 0 AND LENGTH({state_lower}) > 1)
            """
            results = await sr.execute_query_async(_build_sql(fallback_where))
            logger.info(f"📊 Store search: reverse-LIKE fallback for '{clean}'")

        logger.info(f"📊 Store search: {len(results)} stores found for '{location}'")

        if not results:
            return f"Không tìm thấy cửa hàng CANIFA tại khu vực '{location}'. Khách hàng có thể liên hệ hotline 1800 6061 để được hỗ trợ tìm cửa hàng gần nhất."

        # Format kết quả rõ ràng cho LLM
        lines = []
        for r in results:
            name = r.get("store_name", "")
            addr = r.get("address", "")
            city = r.get("city", "")
            state = r.get("state", "")
            phone = r.get("phone_number", "")
            schedule = r.get("schedule_name", "")
            t_open = r.get("time_open_today", "")
            t_close = r.get("time_close_today", "")

            store_info = f"🏪 {name}\n"
            store_info += f"   📍 Địa chỉ: {addr}"
            if city:
                store_info += f", {city}"
            if state:
                store_info += f", {state}"
            store_info += f"\n   📞 ĐT: {phone}"
            store_info += f"\n   🕐 Lịch: {schedule}"
            if t_open and t_close:
                store_info += f" (Hôm nay: {t_open}-{t_close})"
            lines.append(store_info)

        return f"Tìm thấy {len(results)} cửa hàng CANIFA tại khu vực '{location}':\n\n" + "\n\n".join(lines)

    except Exception as e:
        logger.error(f"❌ Error in canifa_store_search: {e}")
        return "Tôi đang gặp khó khăn khi tìm kiếm cửa hàng. Bạn có thể liên hệ hotline 1800 6061 để được hỗ trợ."


