"""
migrate_002_gender_rules.py
────────────────────────────────────────────────────────────
Migration:
  1. Thêm cột gender_target vào chatbot_fashion_rules
  2. Update existing rules → gender_target = 'all'
  3. TRUNCATE + seed lại ~150 rules đầy đủ 5 demographic

Run:
    python backend/database/migrate/migrate_002_gender_rules.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)

SCHEMA = "dashboard_canifa"
TABLE  = f"{SCHEMA}.chatbot_fashion_rules"

# ──────────────────────────────────────────────────────────────────────────────
# 150 rules — 5 demographic × 4-5 dịp × top→bottom/outer
# gender_target: 'nu' | 'nam' | 'unisex' | 'be_gai' | 'be_trai' | 'all'
# ──────────────────────────────────────────────────────────────────────────────
RULES = [
    # ══════════════════════════════════════════════════════════════════
    # 👩 NỮ
    # ══════════════════════════════════════════════════════════════════

    # di_lam
    ("nu", "Blouse",    "di_lam", "bottom",    "Quần âu",     "Blouse + Quần âu: bộ đôi công sở thanh lịch cho nữ"),
    ("nu", "Blouse",    "di_lam", "bottom",    "Chân váy",    "Blouse + Chân váy: feminine style cho văn phòng"),
    ("nu", "Blouse",    "di_lam", "outerwear", "Blazer",      "Blazer phủ ngoài Blouse: smart casual, chuyên nghiệp"),
    ("nu", "Blouse",    "di_lam", "outerwear", "Cardigan",    "Cardigan nhẹ nhàng kết hợp Blouse: tinh tế công sở"),
    ("nu", "Áo Sơ mi",  "di_lam", "bottom",    "Quần âu",     "Sơ mi + Quần âu: classic combo di làm"),
    ("nu", "Áo Sơ mi",  "di_lam", "bottom",    "Chân váy",    "Sơ mi + Chân váy bút chì: modern minimal"),
    ("nu", "Áo Sơ mi",  "di_lam", "outerwear", "Blazer",      "Blazer kết hợp sơ mi: professional look"),
    ("nu", "Áo kiểu",   "di_lam", "bottom",    "Quần âu",     "Áo kiểu + Quần âu: feminine công sở"),
    ("nu", "Áo kiểu",   "di_lam", "bottom",    "Chân váy",    "Áo kiểu + Chân váy: nữ tính, thanh lịch"),
    ("nu", "Áo Polo",   "di_lam", "bottom",    "Quần âu",     "Áo Polo nữ + Quần âu: smart casual"),
    ("nu", "Áo Polo",   "di_lam", "bottom",    "Chân váy",    "Áo Polo + Chân váy: business casual"),
    ("nu", "Quần âu",   "di_lam", "top",       "Blouse",      "Quần âu + Blouse: combo chuẩn công sở nữ"),
    ("nu", "Quần âu",   "di_lam", "top",       "Áo Sơ mi",    "Quần âu + Sơ mi: clean look văn phòng"),
    ("nu", "Chân váy",  "di_lam", "top",       "Blouse",      "Chân váy + Blouse: feminine office style"),
    ("nu", "Chân váy",  "di_lam", "top",       "Áo Sơ mi",    "Chân váy + Sơ mi: versatile, thanh lịch"),
    ("nu", "Chân váy",  "di_lam", "outerwear", "Blazer",      "Chân váy + Blazer: power look cho nữ"),

    # di_choi
    ("nu", "Áo phông",  "di_choi", "bottom",    "Quần jean",      "Áo phông + Quần jean: combo quốc dân"),
    ("nu", "Áo phông",  "di_choi", "bottom",    "Quần soóc",      "Áo phông + Quần soóc: năng động, trẻ trung"),
    ("nu", "Áo phông",  "di_choi", "bottom",    "Chân váy",       "Áo phông + Chân váy: cô gái cute"),
    ("nu", "Áo phông",  "di_choi", "outerwear", "Áo khoác gió",   "Áo khoác gió nhẹ: mix casual hoàn hảo"),
    ("nu", "Áo kiểu",   "di_choi", "bottom",    "Quần jean",      "Áo kiểu + Quần jean: trendy dạo phố"),
    ("nu", "Áo kiểu",   "di_choi", "bottom",    "Quần soóc",      "Áo kiểu + Quần soóc: hot girl combo"),
    ("nu", "Áo kiểu",   "di_choi", "bottom",    "Chân váy",       "Áo kiểu + Chân váy: chic, quyến rũ"),
    ("nu", "Áo nỉ",     "di_choi", "bottom",    "Quần jean",      "Áo nỉ + Quần jean: casual chill mùa lạnh"),
    ("nu", "Quần jean", "di_choi", "top",        "Áo phông",       "Quần jean + Áo phông: timeless classic"),
    ("nu", "Quần jean", "di_choi", "top",        "Áo kiểu",        "Quần jean + Áo kiểu: balance cô gái"),
    ("nu", "Quần soóc", "di_choi", "top",        "Áo phông",       "Quần soóc + Áo phông: hè năng động"),
    ("nu", "Chân váy",  "di_choi", "top",        "Áo phông",       "Chân váy + Áo phông: casual feminine"),
    ("nu", "Váy liền",  "di_choi", "outerwear",  "Áo khoác gió",   "Váy liền + Áo khoác gió: airy, thời trang"),

    # du_lich
    ("nu", "Áo hai dây", "du_lich", "bottom",    "Chân váy",      "Áo 2 dây + Chân váy: resort look tuyệt vời"),
    ("nu", "Áo hai dây", "du_lich", "bottom",    "Quần soóc",     "Áo 2 dây + Quần soóc: biển mùa hè"),
    ("nu", "Áo phông",   "du_lich", "bottom",    "Chân váy",      "Áo phông + Chân váy: du lịch thoải mái"),
    ("nu", "Áo phông",   "du_lich", "bottom",    "Quần soóc",     "Áo phông + Quần soóc: dạo biển năng động"),
    ("nu", "Áo phông",   "du_lich", "outerwear", "Áo khoác gió",  "Áo khoác gió: bảo vệ khỏi nắng và gió biển"),
    ("nu", "Váy liền",   "du_lich", "outerwear", "Áo khoác gió",  "Váy liền + Áo khoác: thanh lịch du lịch"),
    ("nu", "Chân váy",   "du_lich", "top",       "Áo hai dây",    "Chân váy + Áo 2 dây: resort combo chuẩn"),
    ("nu", "Chân váy",   "du_lich", "top",       "Áo phông",      "Chân váy + Áo phông: du lịch thư giãn"),

    # mac_nha
    ("nu", "Áo phông",   "mac_nha", "bottom",    "Quần mặc nhà",    "Áo phông + Quần mặc nhà: thoải mái tại nhà"),
    ("nu", "Áo phông",   "mac_nha", "bottom",    "Quần đùi cotton", "Áo phông + Quần đùi: chill ngày hè"),
    ("nu", "Áo hai dây", "mac_nha", "bottom",    "Quần mặc nhà",    "Áo 2 dây + Quần mặc nhà: nhẹ nhàng, mát mẻ"),
    ("nu", "Áo hai dây", "mac_nha", "bottom",    "Quần đùi cotton", "Áo 2 dây + Quần đùi: summer lounge"),
    ("nu", "Quần mặc nhà", "mac_nha", "top",     "Áo phông",        "Quần mặc nhà + Áo phông: bộ nhà cơ bản"),

    # ══════════════════════════════════════════════════════════════════
    # 👨 NAM
    # ══════════════════════════════════════════════════════════════════

    # di_lam
    ("nam", "Áo Sơ mi",  "di_lam", "bottom",    "Quần khaki",  "Sơ mi + Quần khaki: smart casual văn phòng nam"),
    ("nam", "Áo Sơ mi",  "di_lam", "bottom",    "Quần âu",     "Sơ mi + Quần âu: formal business look"),
    ("nam", "Áo Sơ mi",  "di_lam", "outerwear", "Blazer",      "Sơ mi + Blazer: chuyên nghiệp tuyệt đối"),
    ("nam", "Áo Polo",   "di_lam", "bottom",    "Quần khaki",  "Áo Polo + Quần khaki: business casual nam"),
    ("nam", "Áo Polo",   "di_lam", "bottom",    "Quần âu",     "Áo Polo + Quần âu: lịch sự thoải mái"),
    ("nam", "Áo Polo",   "di_lam", "outerwear", "Blazer",      "Áo Polo + Blazer: elevated casual"),
    ("nam", "Quần khaki", "di_lam", "top",       "Áo Sơ mi",   "Quần khaki + Sơ mi: chuẩn công sở nam"),
    ("nam", "Quần khaki", "di_lam", "top",       "Áo Polo",    "Quần khaki + Áo Polo: smart casual dễ mặc"),
    ("nam", "Quần khaki", "di_lam", "outerwear", "Cardigan",   "Quần khaki + Cardigan: prep style"),
    ("nam", "Quần âu",   "di_lam", "top",        "Áo Sơ mi",   "Quần âu + Sơ mi: business professional"),
    ("nam", "Quần âu",   "di_lam", "top",        "Áo Polo",    "Quần âu + Áo Polo: formal casual balance"),

    # di_choi
    ("nam", "Áo phông",       "di_choi", "bottom",    "Quần jean",     "Áo phông + Quần jean: quốc dân streetwear"),
    ("nam", "Áo phông",       "di_choi", "bottom",    "Quần soóc",     "Áo phông + Quần soóc: hè năng động"),
    ("nam", "Áo phông",       "di_choi", "outerwear", "Áo khoác gió",  "Áo khoác gió: street style chill"),
    ("nam", "Áo nỉ",          "di_choi", "bottom",    "Quần jean",     "Áo nỉ + Quần jean: casual mùa lạnh"),
    ("nam", "Áo nỉ có mũ",   "di_choi", "bottom",    "Quần jean",     "Hoodie + Quần jean: streetwear cơ bản"),
    ("nam", "Áo nỉ có mũ",   "di_choi", "bottom",    "Quần soóc",     "Hoodie + Quần soóc: athleisure look"),
    ("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", "top",       "Áo nỉ có mũ",   "Quần jean + Hoodie: street icon"),
    ("nam", "Quần soóc",      "di_choi", "top",       "Áo phông",      "Quần soóc + Áo phông: chill ngày hè"),

    # du_lich
    ("nam", "Áo Polo",    "du_lich", "bottom",    "Quần khaki", "Áo Polo + Quần khaki: du lịch lịch sự"),
    ("nam", "Áo Polo",    "du_lich", "bottom",    "Quần soóc",  "Áo Polo + Quần soóc: resort casual"),
    ("nam", "Áo phông",   "du_lich", "bottom",    "Quần khaki", "Áo phông + Quần khaki: utility travel"),
    ("nam", "Áo phông",   "du_lich", "bottom",    "Quần soóc",  "Áo phông + Quần soóc: biển hè"),
    ("nam", "Áo phông",   "du_lich", "outerwear", "Áo khoác gió", "Áo khoác gió: chống nắng du lịch"),
    ("nam", "Quần khaki", "du_lich", "top",        "Áo phông",   "Quần khaki + Áo phông: adventure ready"),
    ("nam", "Quần khaki", "du_lich", "top",        "Áo Polo",    "Quần khaki + Áo Polo: smart traveler"),

    # the_thao
    ("nam", "Áo phông", "the_thao", "bottom", "Quần thể thao", "Áo phông + Quần thể thao: gym basic"),
    ("nam", "Áo phông", "the_thao", "bottom", "Quần soóc",     "Áo phông + Quần soóc: running outfit"),

    # ══════════════════════════════════════════════════════════════════
    # 🔁 UNISEX (Adults)
    # ══════════════════════════════════════════════════════════════════

    # hang_ngay
    ("unisex", "Áo phông",  "hang_ngay", "bottom", "Quần jean",  "Áo phông + Quần jean: universal everyday"),
    ("unisex", "Áo phông",  "hang_ngay", "bottom", "Quần dài",   "Áo phông + Quần dài: casual versatile"),
    ("unisex", "Áo Sơ mi",  "hang_ngay", "bottom", "Quần jean",  "Sơ mi oversize + Quần jean: essential look"),
    ("unisex", "Áo Sơ mi",  "hang_ngay", "bottom", "Quần dài",   "Sơ mi + Quần dài: clean minimal"),
    ("unisex", "Quần jean",  "hang_ngay", "top",    "Áo phông",  "Quần jean + Áo phông: always works"),
    ("unisex", "Quần jean",  "hang_ngay", "top",    "Áo Sơ mi",  "Quần jean + Sơ mi: casual elevated"),

    # the_thao
    ("unisex", "Áo phông",  "the_thao", "bottom", "Quần thể thao", "Áo phông + Quần thể thao: workout ready"),
    ("unisex", "Áo phông",  "the_thao", "bottom", "Quần leggings", "Áo phông + Leggings: athleisure"),
    ("unisex", "Quần thể thao", "the_thao", "top", "Áo phông",     "Quần thể thao + Áo phông: sport set"),

    # di_choi
    ("unisex", "Áo nỉ có mũ", "di_choi", "bottom",    "Quần jean",    "Hoodie + Quần jean: street essential"),
    ("unisex", "Áo phông",    "di_choi", "bottom",    "Quần jean",    "Áo phông + Quần jean: effortless casual"),
    ("unisex", "Áo phông",    "di_choi", "outerwear", "Áo khoác gió", "Áo khoác gió + Áo phông: streetwear layer"),

    # ══════════════════════════════════════════════════════════════════
    # 👧 BÉ GÁI
    # ══════════════════════════════════════════════════════════════════

    # hang_ngay
    ("be_gai", "Áo phông",  "hang_ngay", "bottom", "Quần leggings", "Áo phông bé gái + Leggings: thoải mái năng động"),
    ("be_gai", "Áo phông",  "hang_ngay", "bottom", "Quần nỉ",       "Áo phông + Quần nỉ: ấm áp ngày lạnh"),
    ("be_gai", "Áo kiểu",   "hang_ngay", "bottom", "Quần leggings", "Áo kiểu cute + Leggings: dễ thương hàng ngày"),
    ("be_gai", "Quần leggings", "hang_ngay", "top", "Áo phông",     "Leggings + Áo phông: bộ hàng ngày tiện lợi"),

    # di_choi
    ("be_gai", "Áo kiểu",  "di_choi", "bottom",    "Chân váy",    "Áo kiểu + Chân váy: bé gái xinh xắn đi chơi"),
    ("be_gai", "Áo phông", "di_choi", "bottom",    "Chân váy",    "Áo phông + Chân váy: cute girl style"),
    ("be_gai", "Áo phông", "di_choi", "bottom",    "Quần soóc",   "Áo phông + Quần soóc: vui chơi ngoài trời"),
    ("be_gai", "Chân váy", "di_choi", "top",       "Áo phông",    "Chân váy + Áo phông: adorable combination"),
    ("be_gai", "Chân váy", "di_choi", "top",       "Áo kiểu",     "Chân váy + Áo kiểu: đặc biệt ngày đi chơi"),
    ("be_gai", "Váy liền", "di_choi", "outerwear", "Áo khoác gió","Váy liền + Áo khoác: complete cute look"),

    # du_lich
    ("be_gai", "Áo phông", "du_lich", "bottom",    "Chân váy",     "Áo phông + Chân váy: du lịch dễ thương"),
    ("be_gai", "Áo phông", "du_lich", "bottom",    "Quần soóc",    "Áo phông + Quần soóc: biển hè cho bé"),
    ("be_gai", "Váy liền", "du_lich", "outerwear", "Áo khoác gió", "Váy liền + Áo khoác: resort look cho bé gái"),

    # ══════════════════════════════════════════════════════════════════
    # 👦 BÉ TRAI
    # ══════════════════════════════════════════════════════════════════

    # hang_ngay
    ("be_trai", "Áo phông",  "hang_ngay", "bottom", "Quần soóc",  "Áo phông bé trai + Quần soóc: năng động hàng ngày"),
    ("be_trai", "Áo phông",  "hang_ngay", "bottom", "Quần nỉ",    "Áo phông + Quần nỉ: ấm trong ngày lạnh"),
    ("be_trai", "Áo nỉ",     "hang_ngay", "bottom", "Quần dài",   "Áo nỉ + Quần dài: casual ngày thường"),
    ("be_trai", "Quần soóc", "hang_ngay", "top",    "Áo phông",   "Quần soóc + Áo phông: bộ hàng ngày năng động"),

    # the_thao
    ("be_trai", "Áo phông",  "the_thao", "bottom", "Quần thể thao",  "Áo phông + Quần thể thao: tập luyện cho bé"),
    ("be_trai", "Áo phông",  "the_thao", "bottom", "Quần leggings",  "Áo phông + Leggings co giãn: vận động tối đa"),
    ("be_trai", "Áo phông",  "the_thao", "bottom", "Quần soóc",      "Áo phông + Quần soóc: chạy nhảy tự do"),

    # du_lich
    ("be_trai", "Áo phông",  "du_lich",  "bottom",    "Quần dài",     "Áo phông + Quần dài: du lịch thoải mái"),
    ("be_trai", "Áo nỉ",     "du_lich",  "bottom",    "Quần dài",     "Áo nỉ + Quần dài: dã ngoại an toàn"),
    ("be_trai", "Áo phông",  "du_lich",  "outerwear", "Áo khoác gió", "Áo khoác gió chống nắng: du lịch cho bé trai"),

    # ══════════════════════════════════════════════════════════════════
    # ⚪ ALL — Rules không phân biệt giới tính (outer common, dịp phụ)
    # ══════════════════════════════════════════════════════════════════
    ("all", "Áo phông",      "mac_nha",  "bottom",    "Quần mặc nhà",   "Universal: Áo phông + Quần mặc nhà"),
    ("all", "Áo phông",      "mac_nha",  "bottom",    "Quần đùi cotton","Universal: Áo phông + Quần đùi chill"),
    ("all", "Áo khoác gió",  "du_lich",  "outerwear", "Áo phông",       "Áo khoác gió phủ ngoài: du lịch mọi giới"),
    ("all", "Áo khoác gió",  "di_choi",  "outerwear", "Áo phông",       "Áo khoác gió + Áo phông: street layer"),
    ("all", "Cardigan",       "di_lam",   "outerwear", "Áo Sơ mi",       "Cardigan + Áo Sơ mi: layering công sở"),
    ("all", "Cardigan",       "hang_ngay","outerwear", "Áo phông",        "Cardigan + Áo phông: casual layer"),
    ("all", "Áo khoác nỉ có mũ", "di_choi", "outerwear", "Áo phông",    "Hoodie mặc ngoài: layering streetwear"),
]


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

        # 1. Add column if not exists
        cur.execute(f"""
            ALTER TABLE {TABLE}
            ADD COLUMN IF NOT EXISTS gender_target VARCHAR(20) DEFAULT 'all'
        """)
        logger.info("[migrate002] ✅ Column gender_target added/exists")

        # 2. Update existing rows to 'all'
        cur.execute(f"UPDATE {TABLE} SET gender_target = 'all' WHERE gender_target IS NULL OR gender_target = ''")
        logger.info("[migrate002] ✅ Existing rows updated to gender_target='all'")

        # 3. Insert new gender-specific rules (ON CONFLICT DO NOTHING)
        inserted = 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

        conn.commit()
        cur.close()
        total = len(RULES)
        logger.info("[migrate002] ✅ Inserted %d/%d new gender rules", inserted, total)
        print(f"[OK] Migration 002 done: +{inserted} new rules ({total} total in batch)")

    except Exception as e:
        if conn:
            conn.rollback()
        logger.error("[migrate002] Error: %s", e)
        print(f"[ERROR] {e}")
    finally:
        if conn:
            conn.close()


if __name__ == "__main__":
    run()
