# 5. Enrichment (Stock + Outfit)

Sau khi tìm được sản phẩm qua Cascading, Engine bồi thêm 2 bước **trước khi** gửi cho Stylist.

## Bước 1: Check Stock (Canifa API)

Gọi Canifa Stock API realtime để kiểm tra tồn kho:

```python
# Pseudo-code
for product in results:
    stock = canifa_stock_api.check(product.sku)
    if stock.available:
        product.stock_status = "in_stock"
        product.available_sizes = stock.sizes  # ["S", "M", "L"]
    else:
        product.stock_status = "out_of_stock"
        results.remove(product)  # Vứt sản phẩm hết hàng
```

**Tại sao quan trọng:** Không có gì tệ hơn việc AI tư vấn sản phẩm mà khách mua không được. Mất niềm tin vĩnh viễn.

| Trường hợp | Xử lý |
|---|---|
| SP hết hàng hoàn toàn | Vứt khỏi kết quả |
| SP hết size nhưng còn size khác | Giữ lại, thêm note "còn size M, L" |
| API timeout (> 2s) | Skip check, giữ SP nhưng thêm disclaimer |

## Bước 2: Outfit Context (SQLite ai_matches)

Query bảng `ai_matches` trong SQLite để lấy gợi ý phối đồ:

```python
# Pseudo-code
for product in results:
    matches = sqlite.query("""
        SELECT match_product_name, match_sku, style_note
        FROM ai_matches
        WHERE source_sku = ?
        LIMIT 2
    """, product.sku)
    product.outfit_suggestions = matches
```

**Ví dụ output:**

```json
{
  "sku": "6AK24W001",
  "product_name": "Áo khoác dạ nam",
  "price": 890000,
  "stock": "in_stock",
  "available_sizes": ["M", "L", "XL"],
  "outfit_suggestions": [
    { "match": "Quần khaki slim fit", "note": "Phối đi làm thanh lịch" },
    { "match": "Khăn len cashmere", "note": "Phối đi du lịch mùa đông" }
  ]
}
```

Stylist Agent sẽ dùng `outfit_suggestions` để gợi ý combo thay vì chỉ tư vấn 1 sản phẩm đơn lẻ → tăng AOV (Average Order Value).

File tham chiếu: `product_search_engine.py` — hàm `_enrich_results()`
