import logging
from datetime import datetime

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

from common.starrocks_connection import get_db_connection

logger = logging.getLogger(__name__)


class PromotionInput(BaseModel):
    check_date: str | None = Field(
        ...,
        description="Ngày cần kiểm tra khuyến mãi (định dạng YYYY-MM-DD). Nếu muốn kiểm tra ngày hiện tại thì truyền null."
    )
    model_config = {"extra": "forbid"}


@tool("canifa_get_promotions", args_schema=PromotionInput)
async def canifa_get_promotions(check_date: str = None) -> str:
    """
    Tra cứu danh sách các chương trình khuyến mãi (CTKM) đang diễn ra theo ngày.
    Sử dụng tool này khi khách hàng hỏi về:
    - "Hôm nay có khuyến mãi gì không?"
    - "Đang có chương trình gì hot?"
    - "Ngày mai có giảm giá không?"
    - "Danh sách mã giảm giá hiện tại."

    Trả về: Tên chương trình, mô tả chi tiết, thời gian áp dụng.
    """
    target_date = check_date
    if not target_date:
        target_date = datetime.now().strftime("%Y-%m-%d")

    logger.info(f"🎁 [Promotion Search] Checking for date: {target_date}")

    try:
        sql = f"""
        SELECT
            name,
            description,
            description_full,
            from_date,
            to_date,
            applied_channel
        FROM shared_source.chatbot_rsa_salerule_with_text_embedding
        WHERE '{target_date}' >= DATE(from_date)
          AND '{target_date}' <= DATE(to_date)
        ORDER BY
            CASE applied_channel
                WHEN 'only_online' THEN 0
                WHEN 'both' THEN 1
                WHEN 'unknown' THEN 2
                WHEN 'only_offline' THEN 3
                ELSE 4
            END,
            to_date ASC
        LIMIT 20
        """

        sr = get_db_connection()
        results = await sr.execute_query_async(sql)

        if not results:
            return f"Hiện tại (ngày {target_date}) không có chương trình khuyến mãi nào đang diễn ra trên hệ thống."

        # Map channel values to Vietnamese labels
        channel_labels = {
            "only_online": "Online (Web/App)",
            "both": "Online + Cửa hàng",
            "only_offline": "Chỉ tại cửa hàng",
            "unknown": "Chưa phân loại kênh",
        }

        lines = [f"Tìm thấy {len(results)} chương trình khuyến mãi đang diễn ra (ngày {target_date}):\n"]
        for i, res in enumerate(results, 1):
            name = res.get("name", "CTKM")
            desc = res.get("description", "")
            desc_full = res.get("description_full", "")
            f_date = res.get("from_date", "")
            t_date = res.get("to_date", "")
            channel = res.get("applied_channel", "unknown")
            channel_label = channel_labels.get(channel, channel)

            # Use description_full if available and longer, else description
            content = desc_full if desc_full and len(str(desc_full)) > len(str(desc)) else desc

            lines.append(
                f"[CTKM {i}]\n"
                f"Tên: {name}\n"
                f"Kênh áp dụng: {channel_label}\n"
                f"Nội dung: {content}\n"
                f"Thời gian: {f_date} đến {t_date}\n"
            )

        lines.append(
            "LƯU Ý QUAN TRỌNG VỀ KÊNH ÁP DỤNG:\n"
            "- Mặc định: ƯU TIÊN trình bày các CTKM 'Online (Web/App)' và 'Online + Cửa hàng' TRƯỚC.\n"
            "- Chỉ trình bày CTKM 'Chỉ tại cửa hàng' khi khách hỏi CỤ THỂ về ưu đãi tại cửa hàng/offline.\n"
            "- Trình bày NỘI DUNG ưu đãi chi tiết cho khách. "
            "Nếu nội dung chỉ ghi địa điểm áp dụng mà KHÔNG ghi cụ thể giảm bao nhiêu %, "
            "hãy trình bày tên chương trình + thời gian + nội dung có sẵn, "
            "rồi hướng dẫn khách liên hệ hotline 1800 6061 hoặc vào canifa.com để xem chi tiết ưu đãi."
        )

        return "\n".join(lines)

    except Exception as e:
        logger.error(f"❌ Error in canifa_get_promotions: {e}")
        return "Xin lỗi, tôi không thể lấy danh sách khuyến mãi lúc này."

