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.
    """
    logger.info(f"🏪 [Store Search] Location: {location} (StarRocks)")
    try:
        sr = get_db_connection()

        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()

        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."

        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
            """

        and_conds = [f"{text_col} LIKE '%{tk}%'" for tk in tokens]
        results = await sr.execute_query_async(_build_sql(' AND '.join(and_conds)))

        if not results:
            return f"Không tìm thấy cửa hàng CANIFA tại khu vực '{location}'."

        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   📍 Địa chỉ: {addr}, {city}, {state}\n   📞 ĐT: {phone}\n   🕐 Lịch: {schedule} ({t_open}-{t_close})"
            lines.append(store_info)

        return f"Tìm thấy {len(results)} cửa hàng CANIFA tại '{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."
