import time
import httpx
import logging

logger = logging.getLogger(__name__)

CANIFA_STOCK_API = "https://canifa.com/v1/middleware/stock_get_stock_list_parent"
_STOCK_TIMEOUT = 2.0  # seconds

async def fetch_stock_batch(base_codes: list[str]) -> dict[str, list[dict]]:
    """
    Gọi API Canifa để lấy thông tin tồn kho cho một danh sách SKU.
    """
    if not base_codes:
        return {}

    sku_string = ",".join(base_codes)
    url = f"{CANIFA_STOCK_API}?skus={sku_string}"
    t0 = time.time()

    try:
        async with httpx.AsyncClient(timeout=_STOCK_TIMEOUT) as client:
            resp = await client.get(url)
            resp.raise_for_status()
            data = resp.json()

        elapsed = round((time.time() - t0) * 1000)
        stock_map: dict[str, list[dict]] = {}
        results = data.get("result", [])
        
        if isinstance(results, list):
            for item in results:
                sku_full = item.get("sku", "")
                qty = item.get("qty", 0) or 0
                if not sku_full:
                    continue
                
                # SKU thường có định dạng BASE-COLOR-SIZE
                parts = sku_full.rsplit("-", 1)
                if len(parts) == 2:
                    color_code = parts[0]
                    size = parts[1]
                    status = "còn hàng" if qty > 0 else "hết hàng"
                    stock_map.setdefault(color_code, []).append({
                        "size": size, "qty": qty, "status": status
                    })

        logger.info(f"📦 [StockAPI] {len(base_codes)} SKUs -> {len(stock_map)} colors in {elapsed}ms")
        return stock_map

    except Exception as e:
        logger.warning(f"⚠️ [StockAPI] Error or Timeout: {e}")
        return {}

async def enrich_with_stock(products: list[dict]) -> list[dict]:
    """
    Lọc danh sách sản phẩm, chỉ giữ lại những món còn hàng.
    """
    if not products:
        return []

    # Lấy danh sách base code duy nhất (ví dụ: 8AT23S001)
    base_codes = list({p.get("internal_ref_code", "") for p in products if p.get("internal_ref_code")})
    if not base_codes:
        return products

    stock_map = await fetch_stock_batch(base_codes)
    if not stock_map:
        return products # Nếu API lỗi thì cứ trả về hết để AI tư vấn

    in_stock = []
    for p in products:
        # product_color_code là mã màu cụ thể (ví dụ: 8AT23S001-SB001)
        color_code = p.get("product_color_code", "")
        if color_code in stock_map:
            sizes_detail = stock_map[color_code]
            total_qty = sum(s["qty"] for s in sizes_detail)
            if total_qty > 0:
                p["_stock_detail"] = sizes_detail
                p["_total_qty"] = total_qty
                in_stock.append(p)
    
    # Nếu lọc xong mà trắng tay thì trả về 5 thằng đầu tiên để AI còn có cái mà nói
    return in_stock if in_stock else products[:5]
