"""
Sentiment Analysis Engine — Tiếng Việt + Tiếng Anh
Ported & extended từ BrightBean Studio apps/inbox/sentiment.py
Thêm: keywords tiếng Việt fashion/thương mại điện tử cho Canifa use case
"""

import re

# ─────────────────────────────────────────────
# ENGLISH Keywords (từ BrightBean Studio)
# ─────────────────────────────────────────────
_POSITIVE_EN = {
    "love", "great", "amazing", "thank", "thanks", "excellent", "awesome",
    "perfect", "best", "fantastic", "wonderful", "beautiful", "brilliant",
    "incredible", "outstanding", "impressive", "helpful", "appreciate",
    "happy", "glad", "excited", "recommend", "superb", "delighted", "thrilled",
    "good", "nice", "cute", "pretty", "quality", "satisfied", "worth",
}

_NEGATIVE_EN = {
    "hate", "terrible", "awful", "worst", "disappointed", "broken", "scam",
    "refund", "horrible", "disgusting", "pathetic", "useless", "angry",
    "furious", "unacceptable", "frustrating", "annoying", "poor", "waste",
    "trash", "spam", "fake", "misleading", "rude", "unprofessional",
    "cheap", "bad", "ugly", "tight", "loose", "wrong", "return", "complaint",
}

# ─────────────────────────────────────────────
# VIETNAMESE Keywords — Thêm mới cho Canifa
# ─────────────────────────────────────────────
_POSITIVE_VI = {
    # Khen ngợi chung
    "tuyệt", "tuyệt vời", "xuất sắc", "hoàn hảo", "đẹp", "đẹp lắm",
    "đẹp quá", "xinh", "xinh lắm", "xinh xắn", "dễ thương", "sang",
    "sang trọng", "chất", "chất lắm", "hài lòng", "ưng", "ưng lắm",
    "thích", "thích lắm", "thích quá", "yêu", "mê", "ok", "ổn",
    # Chất lượng sản phẩm
    "chất lượng", "mịn", "mềm", "nhẹ", "thoáng", "thoải mái", "vừa vặn",
    "đúng size", "chuẩn", "bền", "đúng màu", "đúng mô tả", "y hình",
    # Giao hàng / Dịch vụ
    "nhanh", "giao nhanh", "đóng gói đẹp", "cẩn thận", "nhiệt tình",
    "tư vấn tốt", "phục vụ tốt", "hỗ trợ nhiệt tình",
    # Sẽ mua lại
    "sẽ mua lại", "ủng hộ tiếp", "mua lần 2", "recommend", "giới thiệu",
    "đáng mua", "đáng tiền", "xứng đáng", "worth it",
    # Canifa specific
    "canifa ngon", "canifa tốt", "thương hiệu uy tín",
    "5 sao", "5⭐", "⭐⭐⭐⭐⭐", "👍", "❤️", "🔥",
}

_NEGATIVE_VI = {
    # Chê về sản phẩm
    "xấu", "kém", "tệ", "không đẹp", "không ưng", "thất vọng",
    "chán", "nhạt", "nhàm", "mình không thích", "không như mô tả",
    "khác hình", "màu lệch", "phai màu", "nhăn nhúm", "lỗi", "lỗi hàng",
    "đường may xấu", "lỏng chỉ", "bung chỉ",
    # Size / Fit
    "không vừa", "sai size", "nhỏ hơn", "lớn hơn", "chật", "rộng thùng thình",
    "ngắn quá", "dài quá", "bé quá",
    # Giao hàng / Dịch vụ
    "giao chậm", "giao trễ", "sai hàng", "thiếu hàng", "đóng gói ẩu",
    "bị bẩn", "phục vụ tệ", "nhân viên thái độ", "không hỗ trợ",
    "không phản hồi", "lờ đi", "im hơi lặng tiếng",
    # Trả hàng / Hoàn tiền
    "trả hàng", "đổi hàng", "hoàn tiền", "khiếu nại", "phàn nàn",
    "tố cáo", "scam", "lừa đảo", "hàng giả",
    # Canifa specific
    "canifa tệ", "không mua nữa", "lần cuối", "thất vọng với canifa",
    "1 sao", "1⭐", "👎", "😡", "😤", "😠",
}


# ─────────────────────────────────────────────
# Core analyzer
# ─────────────────────────────────────────────

def _tokenize(text: str) -> set[str]:
    """Lowercase và tokenize text, giữ lại cả nguyên câu (cho multi-word keywords)."""
    text_lower = text.lower().strip()
    # Word tokens (strip punctuation)
    words = set(re.sub(r"[^\w\s]", " ", text_lower).split())
    # Thêm nguyên text để match multi-word phrases
    words.add(text_lower)
    return words


def analyze_sentiment(text: str) -> str:
    """
    Phân tích sentiment của text (Tiếng Việt + Tiếng Anh).

    Returns:
        'positive' | 'negative' | 'neutral'
    """
    if not text or not text.strip():
        return "neutral"

    tokens = _tokenize(text)
    text_lower = text.lower()

    # Score tiếng Anh
    pos_en = sum(1 for kw in _POSITIVE_EN if kw in tokens)
    neg_en = sum(1 for kw in _NEGATIVE_EN if kw in tokens)

    # Score tiếng Việt (check phrase match trong full text)
    pos_vi = sum(1 for kw in _POSITIVE_VI if kw in text_lower)
    neg_vi = sum(1 for kw in _NEGATIVE_VI if kw in text_lower)

    pos_total = pos_en + pos_vi
    neg_total = neg_en + neg_vi

    if neg_total > pos_total:
        return "negative"
    elif pos_total > neg_total:
        return "positive"
    return "neutral"


def analyze_sentiment_detail(text: str) -> dict:
    """
    Phân tích chi tiết — trả về score + label + matched keywords.
    Dùng cho debug / dashboard.
    """
    if not text or not text.strip():
        return {"label": "neutral", "pos_score": 0, "neg_score": 0, "matched": []}

    tokens = _tokenize(text)
    text_lower = text.lower()

    matched_pos = [kw for kw in (_POSITIVE_EN | _POSITIVE_VI) if kw in tokens or kw in text_lower]
    matched_neg = [kw for kw in (_NEGATIVE_EN | _NEGATIVE_VI) if kw in tokens or kw in text_lower]

    pos_score = len(matched_pos)
    neg_score = len(matched_neg)

    if neg_score > pos_score:
        label = "negative"
    elif pos_score > neg_score:
        label = "positive"
    else:
        label = "neutral"

    return {
        "label": label,
        "pos_score": pos_score,
        "neg_score": neg_score,
        "matched_positive": matched_pos[:5],   # Top 5 để không spam
        "matched_negative": matched_neg[:5],
    }
