"""
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


# ==============================================================================
# COLOR MAPPING: User synonym → DB master_color
# DB values: "Đen/ Black", "Trắng/ White", "Xanh da trời/ Blue", etc.
# ==============================================================================
COLOR_MAP: dict[str, list[str]] = {
    "Đen/ Black": ["đen", "black", "tối", "màu đen"],
    "Trắng/ White": ["trắng", "white", "màu trắng"],
    "Xanh da trời/ Blue": ["xanh da trời", "xanh dương", "blue", "xanh biển", "xanh nước biển", "màu xanh"],
    "Xám/ Gray": ["xám", "gray", "grey", "ghi", "màu xám", "xám nhạt", "xám đậm"],
    "Be/ Beige": ["be", "beige", "kem", "màu be", "nude", "da", "màu da"],
    "Hồng/ Pink- Magenta": ["hồng", "pink", "magenta", "hồng nhạt", "hồng đậm", "màu hồng", "cánh sen"],
    "Đỏ/ Red": ["đỏ", "red", "màu đỏ", "đỏ đô", "đỏ tươi"],
    "Xanh rêu/ Olive- Army": ["xanh rêu", "olive", "army", "xanh quân đội", "rêu", "xanh lá"],
    "Nâu/ Brown": ["nâu", "brown", "màu nâu", "nâu đất", "coffee", "cà phê"],
    "Cam/ Orange": ["cam", "orange", "màu cam"],
    "Vàng/ Yellow": ["vàng", "yellow", "màu vàng", "vàng nhạt", "vàng chanh"],
    "Tím/ Purple": ["tím", "purple", "violet", "màu tím"],
    "Xanh lá/ Green": ["xanh lá", "green", "xanh lá cây", "xanh ngọc"],
    "Navy/ Navy Blue": ["navy", "xanh navy", "xanh đen", "xanh than"],
}

# Auto-generate reverse lookup: synonym → DB master_color
COLOR_SYNONYM_TO_DB: dict[str, str] = {}
for db_color, synonyms in COLOR_MAP.items():
    for syn in synonyms:
        COLOR_SYNONYM_TO_DB[syn.lower()] = db_color

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


def resolve_color(raw_color: str) -> str | None:
    """
    Map user color term → DB master_color value.

    VD:
      "hồng"      → "Hồng/ Pink- Magenta"
      "xanh dương" → "Xanh da trời/ Blue"
      "đen"        → "Đen/ Black"
      "unknown"    → None
    """
    color_lower = raw_color.lower().strip()
    for synonym in _SORTED_COLOR_SYNONYMS:
        if color_lower == synonym or color_lower.startswith(synonym):
            return COLOR_SYNONYM_TO_DB[synonym]
    return None


# ==============================================================================
# AGE GROUP MAPPING: User synonym → DB age_by_product
# ==============================================================================
AGE_MAP: dict[str, list[str]] = {
    "người lớn": ["người lớn", "adult"],
    "bé trai": ["bé trai", "con trai", "nam nhí"],
    "bé gái": ["bé gái", "con gái", "nữ nhí"],
    "trẻ em": ["trẻ em", "em bé", "kids", "children", "nhí"],
}

AGE_SYNONYM_TO_DB: dict[str, str] = {}
for db_age, synonyms in AGE_MAP.items():
    for syn in synonyms:
        AGE_SYNONYM_TO_DB[syn.lower()] = db_age


def resolve_age(raw_age: str) -> str | None:
    """Map user age term → DB age_by_product value."""
    return AGE_SYNONYM_TO_DB.get(raw_age.lower().strip())

