"""
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 Polo": ["áo polo", "áo cổ bẻ"],
    "Áo phông": ["áo phông", "áo thun", "áo thun ngắn tay", "áo cổ v", "áo cổ tym"],
    "Áo nỉ có mũ": ["áo nỉ có mũ"],
    "Áo nỉ": ["áo nỉ"],
    "Áo mặc nhà": ["áo mặc 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 len": ["áo len"],
    "Áo kiểu": ["áo kiểu"],
    "Á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 nỉ có mũ": ["áo khoác nỉ có mũ"],
    "Áo khoác lông vũ": ["áo khoác 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 khoác dạ": ["áo khoác dạ"],
    "Áo khoác dáng ngắn": ["áo khoác dáng ngắn"],
    "Áo khoác chống nắng": ["áo khoác 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 khoác": ["áo khoác"],
    "Áo giữ nhiệt": ["áo giữ nhiệt"],
    "Áo bra active": ["áo bra active", "áo bra", "bra"],
    "Áo Body": ["áo body", "áo croptop", "croptop", "baby tee", "áo lửng", "áo dáng ngắn"],
    "Á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"],
    "Tất": ["tất", "vớ"],
    "Túi xách": ["túi xách"],
    "Quần giả váy": ["quần giả váy", "quần váy"],
    "Quần soóc": ["quần soóc", "quần đùi", "quần short", "quần lửng", "quần ngố"],
    "Quần nỉ": ["quần nỉ", "quần jogger", "quần ống bo chun"],
    "Quần mặc nhà": ["quần mặc nhà"],
    "Quần lót đùi": ["quần lót đùi", "quần sịp đùi", "quần boxer"],
    "Quần lót tam giác": ["quần lót tam giác", "quần sịp tam giác", "quần brief"],
    "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ì", "quần lót nữ", "quần lót nam", "quần lót trẻ em", "quần sơ lít"],
    "Quần leggings mặc nhà": ["quần leggings mặc nhà"],
    "Quần leggings": ["quần leggings"],
    "Quần Khaki": ["quần khaki", "quần âu", "quần vải", "quần tây"],
    "Quần jean": ["quần jean", "quần bò", "quần jeans", "denim", "jeans", "bò"],
    "Quần giữ nhiệt": ["quần giữ nhiệt"],
    "Quần dài": ["quần dài", "quần suông", "quần ống rộng"],
    "Quần culottes": ["quần culottes"],
    "Quần Body": ["quần body"],
    "Pyjama": ["pyjama"],
    "Mũ": ["mũ", "nón", "phụ kiện Canifa", "phụ kiện"],
    "Khăn tắm": ["khăn tắm", "phụ kiện Canifa", "phụ kiện"],
    "Khăn mặt": ["khăn mặt", "phụ kiện Canifa", "phụ kiện"],
    "Khăn lau đầu": ["khăn lau đầu", "phụ kiện Canifa", "phụ kiện"],
    "Khăn": ["khăn", "phụ kiện Canifa", "phụ kiện"],
    "Găng tay chống nắng": ["găng tay chống nắng", "găng tay", "phụ kiện Canifa", "phụ kiện"],
    "Chăn cá nhân": ["chăn cá nhân", "chăn", "phụ kiện Canifa", "phụ kiện"],
    "Chân váy": ["chân váy", "váy maxi", "váy midi", "chân váy dài"],
    "Cardigan": ["cardigan"],
    "Bộ thể thao": ["bộ thể thao"],
    "Bộ quần áo": ["bộ quần áo", "đồ bộ"],
    "Bộ mặc nhà": ["bộ mặc nhà", "đồ ngủ", "đồ mặc nhà"],
    "Blazer": ["blazer"],
    "Tất": ["tất", "vớ", "bao chân", "vớ chân", "tất chân"],
}

# ==============================================================================
# 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.

    VD:
      "áo cổ bẻ khaki"   → "Áo Polo khaki"
      "áo thun disney"   → "Áo phông disney"
      "quần bò ống rộng" → "Quần jean ống rộng"
      "áo polo khaki"    → "Áo Polo khaki"  (giữ nguyên nếu đã đúng)
    """
    name_lower = raw_name.lower().strip()
    for synonym in _SORTED_SYNONYMS:
        if name_lower.startswith(synonym):
            db_value = SYNONYM_TO_DB[synonym]
            remainder = name_lower[len(synonym):].strip()
            return f"{db_value} {remainder}".strip() if remainder else db_value
    return raw_name


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