"""
CANIFA Stock Check Tool - Kiểm tra tồn kho qua API Canifa.
"""

import json
import logging

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

from agent.prompt_utils import read_tool_prompt

logger = logging.getLogger(__name__)

# API Canifa stock
CANIFA_STOCK_API = "https://canifa.com/v1/middleware/stock_get_stock_list_parent"

# Singleton httpx client — tái sử dụng TCP connection pool
_stock_client: httpx.AsyncClient | None = None

def _get_stock_client(timeout: float = 5.0) -> httpx.AsyncClient:
    global _stock_client
    if _stock_client is None:
        _stock_client = httpx.AsyncClient(timeout=timeout)
    return _stock_client


class StockCheckInput(BaseModel):
    model_config = {"extra": "forbid"}

    skus: str = Field(
        description=(
            "Mã sản phẩm cần kiểm tra tồn kho. "
            "Chấp nhận base code (VD: '6TS25S018') hoặc product_color_code (VD: '5TS25S023-SY322'). "
            "⚠️ TUYỆT ĐỐI KHÔNG tự bịa/ghép suffix — truyền ĐÚNG mã khách đưa."
        )
    )


async def fetch_stock_from_canifa(skus: list[str], timeout: float = 5.0) -> dict:
    """
    Gọi API Canifa để lấy thông tin tồn kho.

    Args:
        skus: List of product_color_code (e.g., ['5TS25S023-SY322'])
        timeout: Request timeout in seconds

    Returns:
        Raw API response as dict
    """         
    if not skus:
        return {}

    # API chấp nhận nhiều SKU cách nhau bằng dấu phẩy
    sku_string = ",".join(skus)
    url = f"{CANIFA_STOCK_API}?skus={sku_string}"

    try:
        resp = await _get_stock_client(timeout).get(url)
        resp.raise_for_status()
        data = resp.json()

        logger.info(f"📦 Stock API response: {len(data.get('result', []))} variants")
        return data

    except httpx.TimeoutException:
        logger.warning(f"⏰ Stock API timeout ({timeout}s)")
        return {"code": 500, "error": "timeout"}
    except Exception as e:
        logger.error(f"❌ Stock API error: {e}")
        return {"code": 500, "error": str(e)}


@tool("check_is_stock", args_schema=StockCheckInput)
async def check_is_stock(skus: str) -> str:
    """
    Kiểm tra tồn kho sản phẩm CANIFA.
    Trả về thông tin còn hàng theo từng size.
    """
    if not skus:
        return json.dumps({"error": "Thiếu mã sản phẩm để kiểm tra tồn kho"})

    # Parse SKUs
    sku_list = [s.strip() for s in skus.split(",") if s.strip()]

    if not sku_list:
        return json.dumps({"error": "Không có mã sản phẩm hợp lệ"})

    # Fetch stock from Canifa API - return raw response
    stock_data = await fetch_stock_from_canifa(sku_list)

    return json.dumps(stock_data, ensure_ascii=False)


# Load dynamic docstring from file
dynamic_prompt = read_tool_prompt("check_is_stock")
if dynamic_prompt:
    check_is_stock.__doc__ = dynamic_prompt
    check_is_stock.description = dynamic_prompt
