"""
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ố", "short"],
    "Quần nỉ": ["quần nỉ", "quần jogger", "quần ống bo chun", "jogger"],
    "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", "boxer", "sịp đù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 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", "sịp", "chip", "đồ lót"],
    "Quần leggings mặc nhà": ["quần leggings mặc nhà"],
    "Quần leggings": ["quần leggings", "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ò", "jean"],
    "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
