# core/ui_emojis.py
from __future__ import annotations

import re
from typing import Final


# ============================================================
# Custom Premium Emoji IDs
# ============================================================
#
# این IDها از ایموجی‌هایی که همین پروژه قبلاً استفاده می‌کرد
# متمرکز شده‌اند تا اگر بعداً خواستی یک Emoji ID را عوض کنی،
# فقط همین فایل را تغییر بدهی.
# ============================================================

CUSTOM_EMOJI: Final[dict[str, tuple[str, str]]] = {
    # General UI
    "shop": ("5402516323710279908", "🛒"),
    "wallet": ("5803143039060808890", "👝"),
    "add": ("5318974936310627698", "➕"),
    "users": ("5875180111744995604", "👥"),
    "support": ("5319164022245832659", "📞"),
    "history": ("5985774024968379294", "📊"),
    "back": ("5447183459602669338", "🔙"),
    "card": ("5305265301917549162", "💳"),
    "bolt": ("5449683594425410231", "⚡️"),

    # Products
    "stars": ("5843892082447487088", "⭐️"),
    "premium": ("5823537588186647980", "💎"),
    "ton": ("6008196202384859008", "💎"),
    "gift": ("5294466362566014067", "🎁"),
    "sparkles": ("5899764453007692085", "✨"),
    "trx": ("6032713293049633080", "🪙"),
    "reaction": ("5951704669339258951", "⭐️"),
    "giveaway": ("5951801486492045346", "🎉"),

    # Message/status emojis already used by project
    "success": ("5951861774947979620", "✅"),
    "error": ("6030430277413638534", "❌"),
    "warning": ("6030430277413638534", "⚠️"),
    "loading": ("5987803826512466184", "⏳"),
    "package": ("5990147899403539264", "📦"),
    "money": ("5990147899403539264", "💵"),
    "user": ("5431577498364158238", "👤"),
    "target": ("5987803826512466184", "🎯"),
    "chat": ("5987803826512466184", "💬"),
    "hello": ("5431577498364158238", "👋"),
    "list": ("5431577498364158238", "📜"),
    "pin": ("5985774024968379294", "📌"),
    "party": ("5951801486492045346", "🎉"),
}


# Unicode emoji -> key
_TEXT_EMOJI_KEYS: Final[dict[str, str]] = {
    "🛒": "shop",
    "👝": "wallet",
    "➕": "add",
    "👥": "users",
    "📞": "support",
    "📊": "history",
    "🔙": "back",
    "💳": "card",
    "⚡️": "bolt",
    "⚡": "bolt",
    "⭐️": "stars",
    "⭐": "stars",
    "💎": "premium",
    "🎁": "gift",
    "✨": "sparkles",
    "🪙": "trx",
    "🎉": "party",
    "✅": "success",
    "❌": "error",
    "⚠️": "warning",
    "⚠": "warning",
    "⏳": "loading",
    "📦": "package",
    "💵": "money",
    "💰": "money",
    "👤": "user",
    "🎯": "target",
    "💬": "chat",
    "👋": "hello",
    "📜": "list",
    "📌": "pin",
    "🏠": "shop",
    "🛍": "shop",
    "🛍️": "shop",
    "👇": "target",
}


_TG_EMOJI_BLOCK_RE = re.compile(
    r"(<tg-emoji\b[^>]*>.*?</tg-emoji>)",
    flags=re.IGNORECASE | re.DOTALL,
)


def emoji_id(name: str) -> str:
    """
    فقط ID ایموجی برای icon_custom_emoji_id دکمه.
    """
    try:
        return CUSTOM_EMOJI[name][0]
    except KeyError as exc:
        raise KeyError(
            f"Unknown custom emoji key: {name}"
        ) from exc


def fallback_emoji(name: str) -> str:
    try:
        return CUSTOM_EMOJI[name][1]
    except KeyError as exc:
        raise KeyError(
            f"Unknown custom emoji key: {name}"
        ) from exc


def ce(
    name: str,
    fallback: str | None = None,
) -> str:
    """
    Custom Emoji برای متن‌های HTML تلگرام.

    مثال:
        f"{ce('success')} خرید موفق بود"
    """
    emoji_document_id, default_fallback = CUSTOM_EMOJI[name]

    alt = fallback or default_fallback

    return (
        f'<tg-emoji emoji-id="{emoji_document_id}">'
        f"{alt}"
        f"</tg-emoji>"
    )


def premiumize_html(text: str) -> str:
    """
    ایموجی‌های معمولی موجود در متن HTML را به Custom Emoji
    تبدیل می‌کند.

    بلوک‌های <tg-emoji> موجود را دست نمی‌زند تا nested tag
    ساخته نشود.
    """
    if not text:
        return text

    parts = _TG_EMOJI_BLOCK_RE.split(text)

    for index, part in enumerate(parts):
        if not part:
            continue

        if part.lower().startswith("<tg-emoji"):
            continue

        # Longest sequences first (e.g. ⭐️ before ⭐)
        for raw_emoji in sorted(
            _TEXT_EMOJI_KEYS,
            key=len,
            reverse=True,
        ):
            key = _TEXT_EMOJI_KEYS[raw_emoji]

            if raw_emoji in part:
                part = part.replace(
                    raw_emoji,
                    ce(
                        key,
                        fallback=raw_emoji,
                    ),
                )

        parts[index] = part

    return "".join(parts)
