"""
Product Line Mapping
Key = DB product_line_vn (chính xác)
Value = list các từ khách hàng hay dùng (synonym)
"""

# DB value → [các từ khách hàng hay gọi]
PRODUCT_LINE_MAP: dict[str, list[str]] = {
    "Áo Sơ mi": ["áo sơ mi", "áo công sở", "áo đi làm", "sơ mi", "sơmi", "áo sơmi"],
    "Áo Polo": ["áo polo", "áo cổ bẻ", "polo"],
    "Áo phông": ["áo phông", "áo thun", "áo thun ngắn tay", "áo cổ v", "áo cổ tym", "áo cộc tay"],
    "Áo nỉ có mũ": ["áo nỉ có mũ", "áo hoodie", "hoodie"],
    "Áo nỉ": ["áo nỉ", "áo sweater", "sweater"],
    "Áo mặc nhà": ["áo mặc nhà", "áo ngủ", "áo ở nhà"],
    "Áo lót": ["áo lót", "áo ngực", "áo quây", "áo lót nữ", "áo lót nam", "áo lót trẻ em"],
    "Áo len gilet": ["áo len gilet", "áo gile len"],
    "Áo len": ["áo len", "áo len dài tay"],
    "Áo kiểu": ["áo kiểu", "áo điệu", "áo nữ tính"],
    "Áo khoác sợi": ["áo khoác sợi"],
    "Áo khoác nỉ không mũ": ["áo khoác nỉ không mũ", "áo khoác sweater"],
    "Áo khoác nỉ có mũ": ["áo khoác nỉ có mũ", "áo khoác hoodie", "áo khoác nỉ"],
    "Áo khoác lông vũ": ["áo khoác lông vũ", "áo phao lông vũ", "áo lông vũ"],
    "Áo khoác gió": ["áo khoác gió", "áo gió", "áo khoác mỏng"],
    "Áo khoác gilet chần bông": ["áo khoác gilet chần bông", "áo khoác gilet trần bông", "áo gilet chần bông", "áo gilet trần bông"],
    "Áo khoác gilet": ["áo khoác gilet", "áo gile", "gile"],
    "Áo khoác dạ": ["áo khoác dạ", "áo dạ"],
    "Áo khoác dáng ngắn": ["áo khoác dáng ngắn", "áo khoác croptop"],
    "Áo khoác chống nắng": ["áo khoác chống nắng", "áo chống nắng"],
    "Áo khoác chần bông": ["áo khoác chần bông", "áo khoác trần bông", "áo chần bông", "áo trần bông", "áo phao"],
    "Áo khoác": ["áo khoác", "áo ấm", "áo rét"],
    "Áo giữ nhiệt": ["áo giữ nhiệt", "áo tản nhiệt", "áo heattech"],
    "Áo bra active": ["áo bra active", "áo bra", "bra", "áo tập", "áo thể thao"],
    "Áo Body": ["áo body", "áo croptop", "croptop", "baby tee", "áo lửng", "áo dáng ngắn", "áo ôm"],
    "Áo ba lỗ": ["áo ba lỗ", "áo sát nách", "tanktop", "tank top", "áo dây", "áo 2 dây", "áo hai dây"],
    "Váy liền": ["váy liền", "đầm", "váy công sở", "đầm công sở", "váy liền thân", "đầm suông", "váy dài"],
    "Chân váy": ["chân váy", "váy maxi", "váy midi", "chân váy dài", "chân váy chữ a", "chân váy công sở", "váy ngắn"],
    "Quần giả váy": ["quần giả váy", "quần váy", "skort"],
    "Quần soóc": ["quần soóc", "quần đùi", "quần short", "quần lửng", "quần ngố", "short", "quần đùi nam", "quần đùi nữ"],
    "Quần nỉ": ["quần nỉ", "quần jogger", "quần ống bo chun", "jogger", "quần thể thao"],
    "Quần mặc nhà": ["quần mặc nhà", "quần ngủ", "quần đùi mặc nhà"],
    "Quần lót đùi": ["quần lót đùi", "quần sịp đùi", "quần boxer", "boxer", "sịp đùi", "quần xì đùi"],
    "Quần lót tam giác": ["quần lót tam giác", "quần sịp tam giác", "quần brief", "brief", "sịp tam giác", "quần xì tam giác"],
    "Quần lót": ["quần lót", "quần chip", "quần sịp", "quần trong", "quần nhỏ", "quần xơ lít", "quần xì", "sịp", "chip", "đồ lót"],
    "Quần leggings mặc nhà": ["quần leggings mặc nhà", "quần legging mặc nhà"],
    "Quần leggings": ["quần leggings", "leggings", "quần legging", "legging", "quần thun ôm"],
    "Quần Khaki": ["quần khaki", "quần âu", "quần vải", "quần tây", "quần công sở", "quần đi làm", "quần âu nam", "quần âu nữ", "quần kaki"],
    "Quần jean": ["quần jean", "quần bò", "quần jeans", "denim", "jeans", "bò", "jean", "quần dzin"],
    "Quần giữ nhiệt": ["quần giữ nhiệt", "quần heattech"],
    "Quần dài": ["quần dài", "quần suông", "quần ống rộng", "quần ống suông", "quần lưng thun"],
    "Quần culottes": ["quần culottes", "culottes", "quần lửng ống rộng"],
    "Quần Body": ["quần body", "quần ôm"],
    "Pyjama": ["pyjama", "pajama", "đồ pijama"],
    "Mũ": ["mũ", "nón", "phụ kiện Canifa", "phụ kiện"],
    "Khăn tắm": ["khăn tắm", "khăn to", "phụ kiện"],
    "Khăn mặt": ["khăn mặt", "khăn nhỏ", "phụ kiện"],
    "Khăn lau đầu": ["khăn lau đầu", "phụ kiện"],
    "Khăn": ["khăn", "khăn len", "khăn quàng cổ", "phụ kiện"],
    "Găng tay chống nắng": ["găng tay chống nắng", "găng tay", "bao tay"],
    "Chăn cá nhân": ["chăn cá nhân", "chăn", "mền"],
    "Cardigan": ["cardigan", "áo khoác len", "áo cardigan"],
    "Bộ thể thao": ["bộ thể thao", "đồ tập", "đồ thể thao"],
    "Bộ quần áo": ["bộ quần áo", "đồ bộ", "set đồ"],
    "Bộ mặc nhà": ["bộ mặc nhà", "đồ ngủ", "đồ mặc nhà", "đồ ở nhà", "bộ lanh"],
    "Blazer": ["blazer", "áo vest", "vest"],
    "Tất": ["tất", "vớ", "bao chân", "vớ chân", "tất chân"],
    "Quần tất": ["quần tất", "quần vớ", "tất quần"],
    "Mũ thể thao": ["mũ thể thao", "mũ snapback", "mũ lưỡi trai", "cap"],
    "Khẩu trang": ["khẩu trang", "mask", "mặt nạ vải"],
    "Túi xách": ["túi xách", "túi"],
}

# ==============================================================================
# AUTO-GENERATE reverse lookup: synonym → DB value
# "áo thun" → "Áo phông", "quần bò" → "Quần jean", ...
# ==============================================================================
SYNONYM_TO_DB: dict[str, str] = {}
for db_value, synonyms in PRODUCT_LINE_MAP.items():
    for syn in synonyms:
        SYNONYM_TO_DB[syn.lower()] = db_value

# ==============================================================================
# RELATED LINES: hỏi "áo bra" → tìm cả "Áo bra active" + "Áo lót" và ngược lại
# ==============================================================================
RELATED_LINES: dict[str, list[str]] = {
    "Áo bra active": ["Áo lót"],
    "Áo lót": ["Áo bra active"],
    # Quần lót (chung) → mở rộng tìm cả Quần lót đùi (Trunk) + Quần lót tam giác (Brief)
    "Quần lót": ["Quần lót đùi", "Quần lót tam giác"],
    "Quần lót đùi": ["Quần lót", "Quần lót tam giác"],
    "Quần lót tam giác": ["Quần lót", "Quần lót đùi"],
}


def get_related_lines(product_line: str) -> list[str]:
    """VD: get_related_lines("Áo bra active") → ["Áo bra active", "Áo lót"]"""
    return [product_line] + RELATED_LINES.get(product_line, [])

# Pre-sort synonyms by length DESC for longest-match-first
_SORTED_SYNONYMS = sorted(SYNONYM_TO_DB.keys(), key=len, reverse=True)


def resolve_product_name(raw_name: str) -> str:
    """
    Resolve synonym trong product_name → tên DB thật.
    Dùng longest-match-first để tránh match sai. Cập nhật thay thế ở bất kỳ vị trí nào trong chuỗi.

    VD:
      "tìm áo cổ bẻ khaki"   → "tìm áo polo khaki"
      "áo thun disney"   → "áo phông disney"
      "quần bò ống rộng" → "quần jean ống rộng"
    """
    result = raw_name.lower().strip()
    
    # Custom rule cho sơ mi cộc tay -> sơ mi ngắn tay
    if "sơ mi" in result and "cộc tay" in result:
        result = result.replace("cộc tay", "ngắn tay")
        
    for synonym in _SORTED_SYNONYMS:
        if synonym in result:
            db_value = SYNONYM_TO_DB[synonym]
            # Thay thế tất cả các lần xuất hiện của synonym bằng db_value (để thường)
            result = result.replace(synonym, db_value.lower())
    return result


def resolve_product_line(raw_value: str) -> list[str]:
    """
    Lookup keyword → DB product_line_vn.
    Hỗ trợ '/' separator (VD: "Quần/ Váy").
    Không tìm thấy → giữ nguyên (prefix match ở SQL).
    """
    parts = [p.strip() for p in raw_value.split("/") if p.strip()]
    resolved = []
    for part in parts:
        mapped = SYNONYM_TO_DB.get(part.lower())
        if mapped:
            resolved.append(mapped)
        else:
            resolved.append(part)
    return resolved
