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
from agent.prompt_utils import read_tool_prompt

logger = logging.getLogger(__name__)


class PromotionInput(BaseModel):
    check_date: str | None = Field(
        default=None,
        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.
    """
    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} (StarRocks)")

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

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

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

canifa_get_promotions.__doc__ = read_tool_prompt("promotion_canifa_tool") or canifa_get_promotions.__doc__
