"""
Inline keyboard builders and callback-data constants.

Callback data format: "<prefix>:<arg1>:<arg2>...".
Session-bound callbacks embed a random token; the matching handler re-verifies
that the session belongs to the user who pressed the button.
"""

from __future__ import annotations

from telegram import InlineKeyboardButton, InlineKeyboardMarkup

# --- callback data constants -------------------------------------------------
CB_MENU = "m:menu"
CB_HELP = "m:help"
CB_STATS = "m:stats"
CB_DOWNLOAD = "m:dl"
CB_FORCE_CHECK = "fj:check"
CB_SUPPORT = "m:support"

# Handler routing patterns (regex)
PATTERN_USER_CB = r"^(m:|q:|cancel:)"
PATTERN_FORCE_CHECK = r"^fj:check$"
PATTERN_ADMIN_CB = r"^ad:"
PATTERN_FORCE_ADMIN_CB = r"^fja:"

QUALITY_LABELS = {
    "360": "🎥 360p",
    "480": "🎥 480p",
    "720": "🎥 720p",
    "1080": "🎥 1080p",
    "best": "🎥 بهترین کیفیت",
    "mp3": "🎵 MP3",
}


# --- user keyboards -----------------------------------------------------------

def main_menu() -> InlineKeyboardMarkup:
    """Main user menu: stats and support."""
    return InlineKeyboardMarkup(
        [
            [
                InlineKeyboardButton(
                    "📊 آمار من",
                    callback_data=CB_STATS,
                ),
                InlineKeyboardButton(
                    "❤️ پشتیبانی",
                    callback_data=CB_HELP,
                ),
            ],
        ]
    )

def back_to_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        [[InlineKeyboardButton("🔙 منوی اصلی", callback_data=CB_MENU)]]
    )


def qualities_kb(token: str, qualities: list[str], include_mp3: bool) -> InlineKeyboardMarkup:
    """Quality-selection keyboard; only qualities reported by yt-dlp are shown."""
    available = list(qualities) + (["mp3"] if include_mp3 else [])
    rows: list[list[InlineKeyboardButton]] = []
    for index in range(0, len(available), 2):
        row = [
            InlineKeyboardButton(QUALITY_LABELS.get(q, q), callback_data=f"q:{token}:{q}")
            for q in available[index:index + 2]
        ]
        rows.append(row)
    rows.append([InlineKeyboardButton("❌ انصراف", callback_data=f"cancel:{token}")])
    return InlineKeyboardMarkup(rows)


def cancel_download_kb(token: str) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        [[InlineKeyboardButton("❌ لغو دانلود", callback_data=f"cancel:{token}")]]
    )


def force_join_user_kb(entries: list[dict]) -> InlineKeyboardMarkup:
    """Membership buttons for every required channel/group + a re-check button."""
    rows: list[list[InlineKeyboardButton]] = []
    for entry in entries:
        link = entry.get("invite_link")
        if not link and entry.get("username"):
            link = f"https://t.me/{entry['username']}"
        if not link:
            continue
        label = f"🔗 عضویت | {str(entry.get('title') or 'کانال')[:20]}"
        rows.append([InlineKeyboardButton(label, url=link)])
    rows.append([InlineKeyboardButton("✅ بررسی عضویت", callback_data=CB_FORCE_CHECK)])
    return InlineKeyboardMarkup(rows)


# --- admin keyboards ----------------------------------------------------------

def admin_panel_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        [
            [
                InlineKeyboardButton("📊 آمار", callback_data="ad:stats"),
                InlineKeyboardButton("👥 کاربران", callback_data="ad:users"),
            ],
            [InlineKeyboardButton("🚫 مدیریت کاربران", callback_data="ad:uman")],
            [InlineKeyboardButton("📢 پیام همگانی", callback_data="ad:bcast")],
            [InlineKeyboardButton("🔗 Force Join", callback_data="ad:fj")],
            [InlineKeyboardButton("⚙️ تنظیمات", callback_data="ad:settings")],
            [InlineKeyboardButton("🔙 منوی اصلی", callback_data=CB_MENU)],
        ]
    )


def admin_back_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="ad:panel")]])


def admin_cancel_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup([[InlineKeyboardButton("❌ لغو", callback_data="ad:cancel")]])


def admin_settings_kb(force_join_on: bool) -> InlineKeyboardMarkup:
    state = "✅ فعال" if force_join_on else "⛔️ غیرفعال"
    return InlineKeyboardMarkup(
        [
            [InlineKeyboardButton(f"🔗 Force Join: {state}", callback_data="ad:set:fj")],
            [InlineKeyboardButton("📦 تغییر حداکثر حجم", callback_data="ad:set:size")],
            [InlineKeyboardButton("⚡ تغییر دانلود همزمان", callback_data="ad:set:conc")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="ad:panel")],
        ]
    )


def user_card_kb(user_id: int, banned: bool) -> InlineKeyboardMarkup:
    if banned:
        action = InlineKeyboardButton("♻️ رفع مسدودی", callback_data=f"ad:unban:{user_id}")
    else:
        action = InlineKeyboardButton("🚫 مسدودسازی", callback_data=f"ad:ban:{user_id}")
    return InlineKeyboardMarkup(
        [[action], [InlineKeyboardButton("🔙 بازگشت", callback_data="ad:uman")]]
    )


def broadcast_confirm_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        [
            [
                InlineKeyboardButton("✅ ارسال", callback_data="ad:bcyes"),
                InlineKeyboardButton("❌ لغو", callback_data="ad:bcno"),
            ]
        ]
    )


# --- force join admin keyboards ----------------------------------------------

def force_join_admin_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        [
            [InlineKeyboardButton("➕ افزودن", callback_data="fja:add")],
            [InlineKeyboardButton("📋 لیست", callback_data="fja:list")],
            [InlineKeyboardButton("❌ حذف", callback_data="fja:remove")],
            [InlineKeyboardButton("🔄 فعال/غیرفعال", callback_data="fja:toggle")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="ad:panel")],
        ]
    )


def force_join_list_kb(entries: list[dict]) -> InlineKeyboardMarkup:
    rows = []
    for entry in entries:
        title = str(entry.get("title") or entry.get("username") or entry.get("chat_id") or "?")
        mark = "✅" if entry.get("is_active") else "⛔️"
        rows.append(
            [InlineKeyboardButton(f"{mark} {title[:24]}", callback_data=f"fja:info:{entry['id']}")]
        )
    rows.append([InlineKeyboardButton("🔙 بازگشت", callback_data="ad:fj")])
    return InlineKeyboardMarkup(rows)


def force_join_remove_kb(entries: list[dict]) -> InlineKeyboardMarkup:
    rows = [
        [
            InlineKeyboardButton(
                f"🗑 {str(entry.get('title') or entry.get('chat_id'))[:24]}",
                callback_data=f"fja:rm:{entry['id']}",
            )
        ]
        for entry in entries
    ]
    rows.append([InlineKeyboardButton("🔙 بازگشت", callback_data="ad:fj")])
    return InlineKeyboardMarkup(rows)


def force_join_toggle_kb(enabled: bool, entries: list[dict]) -> InlineKeyboardMarkup:
    rows = [
        [
            InlineKeyboardButton(
                f"🔗 سیستم: {'✅ فعال' if enabled else '⛔️ غیرفعال'}",
                callback_data="fja:global",
            )
        ]
    ]
    for entry in entries:
        mark = "✅" if entry.get("is_active") else "⛔️"
        title = str(entry.get("title") or entry.get("chat_id"))[:22]
        rows.append([InlineKeyboardButton(f"{mark} {title}", callback_data=f"fja:en:{entry['id']}")])
    rows.append([InlineKeyboardButton("🔙 بازگشت", callback_data="ad:fj")])
    return InlineKeyboardMarkup(rows)
