"""
migrate_003_full_coverage.py
────────────────────────────────────────────────────────────
Seed toàn bộ anchor categories còn thiếu rules:
  - Bottom items as anchor (Quần jean, Quần soóc, Chân váy, ...)
  - Outerwear as anchor (Áo nỉ, Áo khoác, Áo len, ...)
  - Kids sets & home wear (Bộ mặc nhà, Áo mặc nhà, ...)

Run:
    cd backend
    .venv\Scripts\python.exe database/migrate/migrate_003_full_coverage.py
"""

import logging
import os
import sys

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

backend_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
if backend_dir not in sys.path:
    sys.path.insert(0, backend_dir)

TABLE = "dashboard_canifa.chatbot_fashion_rules"

# ──────────────────────────────────────────────────────────────────────────────
# RULES — (gender_target, anchor_category, occasion_tag, match_role, target_category, ai_reason)
# ──────────────────────────────────────────────────────────────────────────────
RULES = [

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần jean
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần jean", "di_choi",  "top",      "Áo phông",  "Quần jean + Áo phông: combo quốc dân nữ"),
    ("nu",     "Quần jean", "di_choi",  "top",      "Áo kiểu",   "Quần jean + Áo kiểu: trendy dạo phố"),
    ("nu",     "Quần jean", "di_choi",  "outerwear","Áo khoác gió","Quần jean + Áo khoác gió: street layer"),
    ("nu",     "Quần jean", "hang_ngay","top",      "Áo phông",  "Quần jean + Áo phông: casual everyday"),
    ("nu",     "Quần jean", "du_lich",  "top",      "Áo phông",  "Quần jean + Áo phông: du lịch thoải mái"),
    ("nam",    "Quần jean", "di_choi",  "top",      "Áo phông",  "Quần jean + Áo phông: timeless nam"),
    ("nam",    "Quần jean", "di_choi",  "top",      "Áo nỉ",     "Quần jean + Áo nỉ: cold weather casual"),
    ("nam",    "Quần jean", "di_choi",  "outerwear","Áo khoác gió","Quần jean + Áo khoác gió: street layer"),
    ("nam",    "Quần jean", "hang_ngay","top",      "Áo phông",  "Quần jean + Áo phông: everyday easy"),
    ("unisex", "Quần jean", "hang_ngay","top",      "Áo phông",  "Quần jean + Áo phông: universal"),
    ("unisex", "Quần jean", "hang_ngay","top",      "Áo Sơ mi",  "Quần jean + Sơ mi oversize: effortless"),
    ("unisex", "Quần jean", "di_choi",  "top",      "Áo nỉ có mũ","Quần jean + Hoodie: street essential"),
    ("be_gai", "Quần jean", "hang_ngay","top",      "Áo phông",  "Quần jean + Áo phông bé gái"),
    ("be_trai","Quần jean", "hang_ngay","top",      "Áo phông",  "Quần jean + Áo phông bé trai"),
    ("be_trai","Quần jean", "du_lich",  "top",      "Áo phông",  "Quần jean du lịch bé trai"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần soóc
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần soóc", "di_choi",  "top",      "Áo phông",  "Quần soóc + Áo phông: hè năng động nữ"),
    ("nu",     "Quần soóc", "di_choi",  "top",      "Áo kiểu",   "Quần soóc + Áo kiểu: hot girl combo"),
    ("nu",     "Quần soóc", "du_lich",  "top",      "Áo hai dây","Quần soóc + Áo 2 dây: biển mùa hè"),
    ("nu",     "Quần soóc", "du_lich",  "top",      "Áo phông",  "Quần soóc + Áo phông: resort casual"),
    ("nam",    "Quần soóc", "di_choi",  "top",      "Áo phông",  "Quần soóc + Áo phông: chill hè nam"),
    ("nam",    "Quần soóc", "du_lich",  "top",      "Áo phông",  "Quần soóc + Áo phông: beach ready"),
    ("nam",    "Quần soóc", "du_lich",  "top",      "Áo Polo",   "Quần soóc + Áo Polo: resort lịch sự"),
    ("be_trai","Quần soóc", "hang_ngay","top",      "Áo phông",  "Quần soóc + Áo phông: bé trai hàng ngày"),
    ("be_gai", "Quần soóc", "di_choi",  "top",      "Áo phông",  "Quần soóc + Áo phông bé gái đi chơi"),
    ("unisex", "Quần soóc", "the_thao", "top",      "Áo phông",  "Quần soóc + Áo phông: workout"),

    # ══════════════════════════════════════════════════════════════════
    # 👗 BOTTOM AS ANCHOR — Chân váy
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Chân váy", "di_lam",  "top",      "Blouse",    "Chân váy + Blouse: feminine office"),
    ("nu",    "Chân váy", "di_lam",  "top",      "Áo Sơ mi",  "Chân váy + Sơ mi: clean professional"),
    ("nu",    "Chân váy", "di_lam",  "outerwear","Blazer",    "Chân váy + Blazer: power look"),
    ("nu",    "Chân váy", "di_choi", "top",      "Áo phông",  "Chân váy + Áo phông: casual feminine"),
    ("nu",    "Chân váy", "di_choi", "top",      "Áo kiểu",   "Chân váy + Áo kiểu: chic dạo phố"),
    ("nu",    "Chân váy", "du_lich", "top",      "Áo phông",  "Chân váy + Áo phông: vacation style"),
    ("be_gai","Chân váy", "di_choi", "top",      "Áo phông",  "Chân váy + Áo phông: bé gái dễ thương"),
    ("be_gai","Chân váy", "di_choi", "top",      "Áo kiểu",   "Chân váy + Áo kiểu: bé gái xinh đẹp"),

    # ══════════════════════════════════════════════════════════════════
    # 👗 STANDALONE/OTR ANCHOR — Váy liền
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Váy liền", "di_choi",  "outerwear","Áo khoác gió","Váy liền + Áo khoác: airy street style"),
    ("nu",    "Váy liền", "du_lich",  "outerwear","Áo khoác gió","Váy liền + Áo khoác: resort complete"),
    ("nu",    "Váy liền", "di_lam",   "outerwear","Blazer",    "Váy liền + Blazer: professional smart"),
    ("nu",    "Váy liền", "di_lam",   "outerwear","Cardigan",  "Váy liền + Cardigan: feminine office"),
    ("be_gai","Váy liền", "di_choi",  "outerwear","Áo khoác gió","Váy liền + Áo khoác: bé gái đi chơi"),
    ("be_gai","Váy liền", "du_lich",  "outerwear","Áo khoác gió","Váy liền lanh + khoác: du lịch bé gái"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần mặc nhà / Quần đùi cotton
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần mặc nhà",   "mac_nha", "top", "Áo phông",   "Quần mặc nhà + Áo phông: bộ nhà nữ"),
    ("nu",     "Quần mặc nhà",   "mac_nha", "top", "Áo hai dây", "Quần mặc nhà + Áo 2 dây: lounge nhẹ"),
    ("nu",     "Quần mặc nhà",   "mac_nha", "top", "Áo mặc nhà", "Quần mặc nhà + Áo mặc nhà: bộ đủ bộ"),
    ("nam",    "Quần mặc nhà",   "mac_nha", "top", "Áo phông",   "Quần mặc nhà + Áo phông: bộ nhà nam"),
    ("be_trai","Quần mặc nhà",   "mac_nha", "top", "Áo phông",   "Quần mặc nhà + Áo phông bé trai"),
    ("be_gai", "Quần mặc nhà",   "mac_nha", "top", "Áo phông",   "Quần mặc nhà + Áo phông bé gái"),
    ("all",    "Quần đùi cotton","mac_nha", "top", "Áo phông",   "Quần đùi + Áo phông: chill home basic"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần leggings
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần leggings", "the_thao", "top",  "Áo phông",  "Leggings + Áo phông: workout nữ"),
    ("nu",     "Quần leggings", "hang_ngay","top",  "Áo phông",  "Leggings + Áo phông: athleisure"),
    ("be_gai", "Quần leggings", "hang_ngay","top",  "Áo phông",  "Leggings + Áo phông bé gái"),
    ("be_gai", "Quần leggings", "hang_ngay","top",  "Áo kiểu",   "Leggings + Áo kiểu bé gái cute"),
    ("unisex", "Quần leggings", "the_thao", "top",  "Áo phông",  "Leggings + Áo phông: universal sport"),
    ("be_trai","Quần leggings", "the_thao", "top",  "Áo phông",  "Leggings + Áo phông: bé trai vận động"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần dài (casual)
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần dài", "hang_ngay", "top",  "Áo phông",  "Quần dài + Áo phông: everyday comfort"),
    ("nu",     "Quần dài", "du_lich",   "top",  "Áo phông",  "Quần dài + Áo phông: travel comfort"),
    ("nam",    "Quần dài", "hang_ngay", "top",  "Áo phông",  "Quần dài + Áo phông: easy casual"),
    ("be_trai","Quần dài", "du_lich",   "top",  "Áo phông",  "Quần dài + Áo phông: dã ngoại bé trai"),
    ("unisex", "Quần dài", "hang_ngay", "top",  "Áo phông",  "Quần dài + Áo phông: universal"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần thể thao
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Quần thể thao", "the_thao", "top", "Áo phông",  "Quần thể thao + Áo phông: gym nữ"),
    ("nam",    "Quần thể thao", "the_thao", "top", "Áo phông",  "Quần thể thao + Áo phông: gym nam"),
    ("be_trai","Quần thể thao", "the_thao", "top", "Áo phông",  "Quần thể thao + Áo phông: bé trai"),
    ("be_gai", "Quần thể thao", "the_thao", "top", "Áo phông",  "Quần thể thao + Áo phông: bé gái"),
    ("unisex", "Quần thể thao", "the_thao", "top", "Áo phông",  "Quần thể thao + Áo phông: sport"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần âu & Quần khaki
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Quần âu", "di_lam",   "top", "Blouse",    "Quần âu + Blouse: professional nữ"),
    ("nu",    "Quần âu", "di_lam",   "top", "Áo Sơ mi",  "Quần âu + Sơ mi: classic office nữ"),
    ("nu",    "Quần âu", "di_lam",   "top", "Áo kiểu",   "Quần âu + Áo kiểu: feminine office"),
    ("nam",   "Quần âu", "di_lam",   "top", "Áo Sơ mi",  "Quần âu + Sơ mi: business classic"),
    ("nam",   "Quần âu", "di_lam",   "top", "Áo Polo",   "Quần âu + Áo Polo: neat casual"),
    ("nam",   "Quần khaki","di_lam",  "top", "Áo Sơ mi",  "Quần khaki + Sơ mi: smart casual"),
    ("nam",   "Quần khaki","di_lam",  "top", "Áo Polo",   "Quần khaki + Áo Polo: business casual"),
    ("nam",   "Quần khaki","du_lich", "top", "Áo phông",  "Quần khaki + Áo phông: adventure ready"),
    ("be_trai","Quần khaki","hang_ngay","top","Áo phông",  "Quần khaki + Áo phông bé trai"),
    ("be_trai","Quần khaki","du_lich",  "top","Áo phông",  "Quần khaki + Áo phông: dã ngoại"),

    # ══════════════════════════════════════════════════════════════════
    # 👖 BOTTOM AS ANCHOR — Quần nỉ
    # ══════════════════════════════════════════════════════════════════
    ("be_trai","Quần nỉ", "hang_ngay","top", "Áo phông",   "Quần nỉ + Áo phông: ấm ngày lạnh bé trai"),
    ("be_trai","Quần nỉ", "hang_ngay","top", "Áo nỉ",      "Quần nỉ + Áo nỉ: bộ nỉ bé trai"),
    ("be_gai", "Quần nỉ", "hang_ngay","top", "Áo phông",   "Quần nỉ + Áo phông: bé gái ấm áp"),
    ("be_gai", "Quần nỉ", "hang_ngay","top", "Áo kiểu",    "Quần nỉ + Áo kiểu: comfortable cute"),
    ("unisex", "Quần nỉ", "hang_ngay","top", "Áo phông",   "Quần nỉ + Áo phông: cozy basics"),
    ("nu",     "Quần nỉ", "mac_nha",  "top", "Áo phông",   "Quần nỉ + Áo phông: home warmth"),
    ("nam",    "Quần nỉ", "mac_nha",  "top", "Áo phông",   "Quần nỉ + Áo phông nam: home comfort"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo nỉ (sweater/sweatshirt)
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Áo nỉ", "di_choi",  "bottom","Quần jean",  "Áo nỉ + Quần jean: casual mùa lạnh nữ"),
    ("nu",     "Áo nỉ", "hang_ngay","bottom","Quần jean",  "Áo nỉ + Quần jean: everyday nữ"),
    ("nu",     "Áo nỉ", "mac_nha",  "bottom","Quần mặc nhà","Áo nỉ + Quần mặc nhà: cozy home nữ"),
    ("be_gai", "Áo nỉ", "hang_ngay","bottom","Quần leggings","Áo nỉ + Leggings: bé gái ấm áp"),
    ("be_gai", "Áo nỉ", "hang_ngay","bottom","Quần nỉ",    "Áo nỉ + Quần nỉ: bộ nỉ bé gái"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo nỉ có mũ (hoodie)
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Áo nỉ có mũ", "di_choi",  "bottom","Quần jean",  "Hoodie + Quần jean: nữ street style"),
    ("nu",     "Áo nỉ có mũ", "hang_ngay","bottom","Quần jean",  "Hoodie + Quần jean nữ hàng ngày"),
    ("nam",    "Áo nỉ có mũ", "di_choi",  "bottom","Quần jean",  "Hoodie + Quần jean: nam street classic"),
    ("be_trai","Áo nỉ có mũ", "hang_ngay","bottom","Quần nỉ",    "Hoodie + Quần nỉ: ấm ngày lạnh bé trai"),
    ("be_trai","Áo nỉ có mũ", "hang_ngay","bottom","Quần dài",   "Hoodie + Quần dài: bé trai casual"),
    ("be_trai","Áo nỉ có mũ", "di_choi",  "bottom","Quần jean",  "Hoodie + Quần jean: bé trai đi chơi"),
    ("unisex", "Áo nỉ có mũ", "di_choi",  "bottom","Quần jean",  "Hoodie + Quần jean: unisex street"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo khoác dáng ngắn
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Áo khoác dáng ngắn", "di_choi",  "bottom","Quần jean",  "Khoác ngắn + Quần jean: trendy nữ"),
    ("nu",     "Áo khoác dáng ngắn", "di_choi",  "top",   "Áo phông",   "Khoác ngắn phủ Áo phông nữ"),
    ("nu",     "Áo khoác dáng ngắn", "du_lich",  "bottom","Quần jean",  "Khoác ngắn + Quần jean du lịch"),
    ("nam",    "Áo khoác dáng ngắn", "di_choi",  "bottom","Quần jean",  "Khoác ngắn + Quần jean nam"),
    ("nam",    "Áo khoác dáng ngắn", "di_choi",  "top",   "Áo phông",   "Khoác ngắn phủ Áo phông nam"),
    ("unisex", "Áo khoác dáng ngắn", "di_choi",  "bottom","Quần jean",  "Khoác ngắn + Quần jean: unisex"),
    ("unisex", "Áo khoác dáng ngắn", "di_choi",  "top",   "Áo phông",   "Khoác ngắn + Áo phông: layer"),
    ("be_gai", "Áo khoác dáng ngắn", "di_choi",  "bottom","Chân váy",   "Khoác ngắn + Chân váy: bé gái cute"),
    ("be_gai", "Áo khoác dáng ngắn", "hang_ngay","bottom","Quần leggings","Khoác ngắn + Leggings bé gái"),
    ("be_trai","Áo khoác dáng ngắn", "hang_ngay","bottom","Quần jean",  "Khoác ngắn + Quần jean bé trai"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo khoác chống nắng
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo khoác chống nắng", "du_lich",  "top",   "Áo phông",  "Khoác chống nắng + Áo phông nữ"),
    ("nu",    "Áo khoác chống nắng", "du_lich",  "bottom","Quần soóc", "Khoác chống nắng + Quần soóc biển"),
    ("nam",   "Áo khoác chống nắng", "du_lich",  "top",   "Áo phông",  "Khoác chống nắng + Áo phông nam"),
    ("unisex","Áo khoác chống nắng", "du_lich",  "top",   "Áo phông",  "Khoác chống nắng: universal travel"),
    ("unisex","Áo khoác chống nắng", "the_thao", "top",   "Áo phông",  "Khoác chống nắng: sport outdoor"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo len
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo len", "hang_ngay","bottom","Quần jean",  "Áo len + Quần jean: cozy casual nữ"),
    ("nu",    "Áo len", "di_lam",   "bottom","Quần âu",    "Áo len + Quần âu: knit office style"),
    ("nu",    "Áo len", "di_choi",  "bottom","Quần jean",  "Áo len + Quần jean: autumn casual"),
    ("nam",   "Áo len", "hang_ngay","bottom","Quần jean",  "Áo len + Quần jean nam: relaxed weekend"),
    ("nam",   "Áo len", "di_lam",   "bottom","Quần khaki", "Áo len + Quần khaki: smart casual"),
    ("be_gai","Áo len", "hang_ngay","bottom","Quần leggings","Áo len + Leggings: bé gái ấm áp"),
    ("be_gai","Áo len", "hang_ngay","bottom","Quần nỉ",    "Áo len + Quần nỉ: cozy bé gái"),

    # ══════════════════════════════════════════════════════════════════
    # 🧥 OUTERWEAR AS ANCHOR — Áo len gilet (vest)
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Áo len gilet", "di_lam",   "top",   "Áo Sơ mi",  "Gilet len + Sơ mi: layering công sở"),
    ("nu",     "Áo len gilet", "hang_ngay","top",   "Áo phông",  "Gilet len + Áo phông: casual layer"),
    ("nam",    "Áo len gilet", "di_lam",   "top",   "Áo Sơ mi",  "Gilet len + Sơ mi: preppy style nam"),
    ("be_trai","Áo len gilet", "hang_ngay","top",   "Áo phông",  "Gilet len + Áo phông: bé trai ấm"),
    ("be_trai","Áo len gilet", "hang_ngay","bottom","Quần nỉ",   "Gilet len + Quần nỉ: bé trai đông"),

    # ══════════════════════════════════════════════════════════════════
    # 🏠 HOME WEAR AS ANCHOR — Áo mặc nhà
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo mặc nhà", "mac_nha", "bottom","Quần mặc nhà",   "Áo mặc nhà + Quần mặc nhà: bộ nhà nữ"),
    ("nu",    "Áo mặc nhà", "mac_nha", "bottom","Quần đùi cotton","Áo mặc nhà + Quần đùi: hè thoải mái"),
    ("be_gai","Áo mặc nhà", "mac_nha", "bottom","Quần mặc nhà",   "Áo mặc nhà + Quần mặc nhà bé gái"),
    ("be_gai","Áo mặc nhà", "mac_nha", "bottom","Quần nỉ",        "Áo mặc nhà + Quần nỉ: bé gái ấm"),

    # ══════════════════════════════════════════════════════════════════
    # 🏠 SET AS ANCHOR — Bộ mặc nhà (home set — outerwear only)
    # ══════════════════════════════════════════════════════════════════
    ("nu",     "Bộ mặc nhà", "mac_nha", "outerwear","Cardigan",    "Bộ mặc nhà + Cardigan: ấm nhà mùa lạnh nữ"),
    ("nam",    "Bộ mặc nhà", "mac_nha", "outerwear","Áo nỉ có mũ","Bộ mặc nhà + Hoodie: Nam thêm ấm"),
    ("be_trai","Bộ mặc nhà", "mac_nha", "outerwear","Áo nỉ",      "Bộ mặc nhà + Áo nỉ: bé trai ấm"),
    ("be_gai", "Bộ mặc nhà", "mac_nha", "outerwear","Cardigan",   "Bộ mặc nhà + Cardigan: bé gái ấm"),

    # ══════════════════════════════════════════════════════════════════
    # 🎽 SET AS ANCHOR — Bộ thể thao (sport set)
    # ══════════════════════════════════════════════════════════════════
    ("unisex","Bộ thể thao", "the_thao", "outerwear","Áo khoác gió","Bộ thể thao + Áo khoác gió: warm-up layer"),
    ("nu",    "Bộ thể thao", "the_thao", "outerwear","Áo khoác gió","Bộ thể thao nữ + Khoác gió"),
    ("nam",   "Bộ thể thao", "the_thao", "outerwear","Áo khoác gió","Bộ thể thao nam + Khoác gió"),

    # ══════════════════════════════════════════════════════════════════
    # 👶 SET AS ANCHOR — Bộ quần áo (kid sets)
    # ══════════════════════════════════════════════════════════════════
    ("be_trai","Bộ quần áo", "hang_ngay","outerwear","Áo khoác gió","Bộ quần áo bé trai + Khoác nhẹ"),
    ("be_gai", "Bộ quần áo", "di_choi",  "outerwear","Áo khoác gió","Bộ quần áo bé gái + Khoác đi chơi"),
    ("nu",     "Bộ quần áo", "hang_ngay","outerwear","Cardigan",   "Bộ quần áo nữ + Cardigan: layered"),
    ("nam",    "Bộ quần áo", "hang_ngay","outerwear","Áo nỉ có mũ","Bộ quần áo nam + Hoodie: casual set"),

    # ══════════════════════════════════════════════════════════════════
    # 👕 OUTERWEAR specific — Áo Polo for be_gai
    # ══════════════════════════════════════════════════════════════════
    ("be_gai","Áo Polo", "hang_ngay","bottom","Quần leggings","Áo Polo bé gái + Leggings: sporty cute"),
    ("be_gai","Áo Polo", "hang_ngay","bottom","Quần soóc",    "Áo Polo bé gái + Quần soóc: năng động"),
    ("be_gai","Áo Polo", "di_choi",  "bottom","Chân váy",     "Áo Polo bé gái + Chân váy: cute mix"),

    # ══════════════════════════════════════════════════════════════════
    # Quần body (underwear body suit — for office use)
    # ══════════════════════════════════════════════════════════════════
    ("nu",  "Quần body",  "di_lam",   "top",   "Áo Sơ mi",  "Quần body + Sơ mi: tucked-in office"),
    ("nu",  "Quần body",  "di_lam",   "top",   "Blazer",     "Quần body + Blazer: power base layer"),
    ("nam", "Quần body",  "mac_nha",  "top",   "Áo phông",   "Quần body nam + Áo phông: thermal base"),

    # ══════════════════════════════════════════════════════════════════
    # Blazer (already seeded for di_lam, add di_choi + du_lich)
    # ══════════════════════════════════════════════════════════════════
    ("nu",  "Blazer", "di_choi", "bottom","Quần jean",  "Blazer + Quần jean: effortless chic"),
    ("nu",  "Blazer", "di_choi", "top",   "Áo phông",   "Blazer + Áo phông underneath: smart casual"),
    ("nu",  "Blazer", "du_lich", "bottom","Quần âu",    "Blazer du lịch: travel business chic"),
    ("nam", "Blazer", "di_choi", "bottom","Quần jean",  "Blazer + Quần jean nam: casual smart"),
    ("nam", "Blazer", "di_choi", "top",   "Áo phông",   "Blazer + Áo phông nam: dressed down"),

    # ══════════════════════════════════════════════════════════════════
    # Cardigan (already seeded, add more coverage)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Cardigan", "di_choi",  "bottom","Quần jean",  "Cardigan + Quần jean nữ: soft casual"),
    ("nu",    "Cardigan", "mac_nha",  "bottom","Quần mặc nhà","Cardigan + Quần mặc nhà: cozy home"),
    ("be_gai","Cardigan", "hang_ngay","bottom","Quần leggings","Cardigan bé gái + Leggings: soft look"),

    # ══════════════════════════════════════════════════════════════════
    # Áo giữ nhiệt (thermal)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo giữ nhiệt", "mac_nha",  "bottom","Quần leggings","Áo giữ nhiệt + Leggings: warm layer nữ"),
    ("nam",   "Áo giữ nhiệt", "mac_nha",  "bottom","Quần nỉ",      "Áo giữ nhiệt + Quần nỉ: thermal home"),
    ("all",   "Áo giữ nhiệt", "hang_ngay","outerwear","Áo nỉ có mũ","Áo giữ nhiệt base + Hoodie phủ"),

    # ══════════════════════════════════════════════════════════════════
    # Áo ba lỗ (tank top)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo ba lỗ", "the_thao", "bottom","Quần leggings","Áo ba lỗ + Leggings: gym look nữ"),
    ("nu",    "Áo ba lỗ", "the_thao", "bottom","Quần thể thao","Áo ba lỗ + Quần thể thao nữ"),
    ("nam",   "Áo ba lỗ", "the_thao", "bottom","Quần thể thao","Áo ba lỗ + Quần thể thao: gym nam"),
    ("be_trai","Áo ba lỗ","the_thao", "bottom","Quần soóc",   "Áo ba lỗ + Quần soóc: bé trai vận động"),

    # ══════════════════════════════════════════════════════════════════
    # Áo hai dây (nữ / bé gái — thêm các dịp còn thiếu)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo hai dây", "the_thao", "bottom","Quần leggings","Áo 2 dây + Leggings: activewear nữ"),
    ("nu",    "Áo hai dây", "hang_ngay","bottom","Quần jean",   "Áo 2 dây + Quần jean: chill hàng ngày"),
    ("be_gai","Áo hai dây", "du_lich",  "bottom","Quần soóc",   "Áo 2 dây bé gái + Quần soóc: biển"),

    # ══════════════════════════════════════════════════════════════════
    # Áo khoác lông vũ (down jacket)
    # ══════════════════════════════════════════════════════════════════
    ("nam",   "Áo khoác lông vũ","hang_ngay","top",   "Áo phông",  "Lông vũ + Áo phông: winter thermal"),
    ("nam",   "Áo khoác lông vũ","hang_ngay","bottom","Quần jean",  "Lông vũ + Quần jean: cold day comfort"),
    ("nu",    "Áo khoác lông vũ","hang_ngay","bottom","Quần jean",  "Lông vũ nữ + Quần jean: winter casual"),
    ("be_trai","Áo khoác lông vũ","hang_ngay","top",  "Áo phông",  "Lông vũ bé trai + Áo phông bên trong"),
    ("be_gai","Áo khoác lông vũ","di_choi",  "bottom","Chân váy",  "Lông vũ bé gái + Chân váy đi chơi"),

    # ══════════════════════════════════════════════════════════════════
    # Áo khoác chần bông (puffer jacket)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo khoác chần bông","hang_ngay","bottom","Quần jean","Chần bông + Quần jean: winter style nữ"),
    ("nu",    "Áo khoác chần bông","di_choi",  "bottom","Quần jean","Chần bông + Quần jean: đi chơi mùa đông"),
    ("be_gai","Áo khoác chần bông","hang_ngay","bottom","Quần nỉ",  "Gilet chần bông + Quần nỉ bé gái"),
    ("be_trai","Áo khoác chần bông","hang_ngay","bottom","Quần nỉ", "Gilet chần bông + Quần nỉ bé trai"),

    # ══════════════════════════════════════════════════════════════════
    # Áo khoác nỉ không mũ  (zip-up sweatshirt, no hood)
    # ══════════════════════════════════════════════════════════════════
    ("nam",   "Áo khoác nỉ không mũ","di_choi","bottom","Quần jean", "Khoác nỉ + Quần jean nam"),
    ("nam",   "Áo khoác nỉ không mũ","hang_ngay","top", "Áo phông", "Khoác nỉ phủ Áo phông: smart casual"),
    ("nu",    "Áo khoác nỉ không mũ","hang_ngay","bottom","Quần jean","Khoác nỉ nữ + Quần jean: casual"),
    ("unisex","Áo khoác nỉ không mũ","di_choi","bottom","Quần jean", "Khoác nỉ Unisex + Quần jean"),

    # ══════════════════════════════════════════════════════════════════
    # Áo khoác gió (windbreaker — already seeded as outerwear, now as anchor)
    # ══════════════════════════════════════════════════════════════════
    ("nu",    "Áo khoác gió","di_choi","bottom","Quần jean",  "Áo khoác gió + Quần jean nữ"),
    ("nu",    "Áo khoác gió","di_choi","top",   "Áo phông",   "Áo khoác gió phủ Áo phông nữ"),
    ("nam",   "Áo khoác gió","di_choi","bottom","Quần jean",  "Áo khoác gió + Quần jean nam"),
    ("nam",   "Áo khoác gió","du_lich","bottom","Quần khaki", "Áo khoác gió + Quần khaki: travel ready"),
    ("unisex","Áo khoác gió","du_lich","top",   "Áo phông",   "Áo khoác gió + Áo phông: travel layer"),
    ("be_trai","Áo khoác gió","du_lich","bottom","Quần dài",  "Áo khoác gió bé trai du lịch"),
    ("be_gai","Áo khoác gió","du_lich","bottom","Chân váy",   "Áo khoác gió bé gái + Chân váy"),
]


def run():
    from common.pool_wrapper import get_pooled_connection_compat
    conn = None
    try:
        conn = get_pooled_connection_compat()
        cur = conn.cursor()

        inserted = 0
        skipped = 0
        for gender, anchor, occ, role, target, reason in RULES:
            cur.execute(f"""
                INSERT INTO {TABLE} (gender_target, anchor_category, occasion_tag, match_role, target_category, ai_reason)
                VALUES (%s, %s, %s, %s, %s, %s)
                ON CONFLICT DO NOTHING
            """, (gender, anchor, occ, role, target, reason))
            if cur.rowcount > 0:
                inserted += 1
            else:
                skipped += 1

        conn.commit()
        cur.close()
        logger.info("[migrate003] Done: inserted=%d, skipped=%d, total=%d", inserted, skipped, len(RULES))
        print(f"[OK] migrate_003 done: +{inserted} rules seeded ({skipped} already existed, {len(RULES)} total)")
    except Exception as e:
        if conn:
            conn.rollback()
        logger.error("[migrate003] Error: %s", e)
        print(f"[ERROR] {e}")
    finally:
        if conn:
            conn.close()


if __name__ == "__main__":
    run()
