"""Inline panel with toggle buttons, counters, and organized navigation — inspired by digianti."""
from __future__ import annotations

from telegram import ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.constants import ParseMode
from telegram.error import BadRequest, Forbidden
from telegram.ext import ContextTypes

from bot import db
from bot.helpers import is_chat_admin
from bot.config import OWNER_ID


def _back(btn="back-main"):
    return [InlineKeyboardButton("🏛 برگشت", callback_data=btn)]


# ═══════════════════════════════════════════════
#  MAIN PANEL
# ═══════════════════════════════════════════════
def panel_keyboard():
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("📋 لیست‌ها", callback_data="lists"),
         InlineKeyboardButton("🔒 قفل‌ها", callback_data="locks")],
        [InlineKeyboardButton("⚙️ تنظیمات پیشرفته", callback_data="locks2"),
         InlineKeyboardButton("• راهنما", callback_data="help")],
        [InlineKeyboardButton("• بستن", callback_data="close")],
    ])


async def panel_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    msg = update.message or (update.callback_query.message if update.callback_query else None)
    if not msg:
        return
    text = "• لطفاً بخش مورد نظر خود را انتخاب کنید:"
    if update.callback_query:
        await update.callback_query.edit_message_text(text, reply_markup=panel_keyboard())
    else:
        await msg.reply_text(text, reply_markup=panel_keyboard())


# ═══════════════════════════════════════════════
#  LISTS PANEL
# ═══════════════════════════════════════════════
def lists_keyboard():
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("⛔️ لیست بن", callback_data="l-b"),
         InlineKeyboardButton("🤐 لیست سکوت", callback_data="l-s")],
        [InlineKeyboardButton("📝 لیست فیلتر", callback_data="l-f"),
         InlineKeyboardButton("🔮 لیست ویژه", callback_data="l-v")],
        [InlineKeyboardButton("👨‍✈️ لیست مدیران", callback_data="l-m")],
        _back(),
    ])


def _clean_confirm(list_type: str):
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("🗑 پاکسازی لیست", callback_data=f"rem-{list_type}")],
        _back("lists"),
    ])


async def lists_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    q = update.callback_query
    data = q.data
    chat_id = q.message.chat.id

    if data in ("lists", "back-l"):
        await q.edit_message_text("• لطفاً بخش مورد نظر خود را انتخاب کنید:", reply_markup=lists_keyboard())
        return True

    # List viewers
    list_map = {
        "l-b": ("ban", "⛔️ لیست بن"),
        "l-s": ("silent", "🤐 لیست سکوت"),
        "l-f": ("filter", "📝 لیست فیلتر"),
        "l-v": ("vip", "🔮 لیست ویژه"),
        "l-m": ("promote", "👨‍✈️ لیست مدیران"),
    }
    if data in list_map:
        key, title = list_map[data]
        items = await _get_list_items(chat_id, key)
        if items:
            text = f"{title}:\n\n{items}"
            await q.edit_message_text(text, reply_markup=_clean_confirm(key),
                                      parse_mode=ParseMode.HTML)
        else:
            await q.answer("لیست مورد نظر خالی می‌باشد!", show_alert=True)
        return True

    # Clean confirm
    if data.startswith("rem-"):
        key = data[4:]
        count = await _clean_list(chat_id, key)
        await q.edit_message_text(f"✅ لیست با موفقیت پاک شد! ({count} مورد حذف شد)",
                                  reply_markup=InlineKeyboardMarkup([_back("lists")]))
        return True

    return False


async def _get_list_items(chat_id: int, key: str) -> str:
    lines = []
    if key == "ban":
        rows = await db.blocklist_list(chat_id)
        for i, r in enumerate(rows, 1):
            uid = r["user_id"]
            lines.append(f"{i}. <a href='tg://user?id={uid}'>{uid}</a>")
    elif key == "silent":
        ids = await db.silent_list(chat_id)
        for i, uid in enumerate(ids, 1):
            lines.append(f"{i}. <a href='tg://user?id={uid}'>{uid}</a>")
    elif key == "filter":
        rows = await db.get_all_filters(chat_id)
        for i, r in enumerate(rows, 1):
            lines.append(f"{i}. {r['keyword']}")
    elif key == "vip":
        ids = await db.vip_list(chat_id)
        for i, uid in enumerate(ids, 1):
            lines.append(f"{i}. <a href='tg://user?id={uid}'>{uid}</a>")
    elif key == "promote":
        from bot.handlers.admin import _get_admin_ids
        ids = await _get_admin_ids(chat_id)
        for i, uid in enumerate(ids, 1):
            lines.append(f"{i}. <a href='tg://user?id={uid}'>{uid}</a>")
    return "\n".join(lines) if lines else ""


async def _clean_list(chat_id: int, key: str) -> int:
    if key == "ban":
        rows = await db.blocklist_list(chat_id)
        for r in rows:
            await db.blocklist_remove(chat_id, r["user_id"])
        return len(rows)
    elif key == "silent":
        ids = await db.silent_list(chat_id)
        await db.silent_clear(chat_id)
        return len(ids)
    elif key == "filter":
        await db.remove_all_filters(chat_id)
        return 1
    elif key == "vip":
        return await db.vip_clear(chat_id)
    elif key == "promote":
        from bot.handlers.admin import _clear_admin_ids
        return await _clear_admin_ids(chat_id)
    return 0


# ═══════════════════════════════════════════════
#  LOCKS PANEL (with toggle ✅/❌)
# ═══════════════════════════════════════════════
LOCKS_PAGE1 = {
    "link": "🔗 لینک", "hyper": "🌐 هایپرلینک",
    "tag": "🏷 تگ", "hashtag": "# هشتگ",
    "english": "🌐 انگلیسی", "persian": "فارسی",
    "text": "📝 متن", "tgservice": "🔔 سرویس تلگرام",
    "forward": "↪️ فوروارد", "location": "📍 لوکیشن",
    "contact": "📞 مخاطب", "addbot": "🤖 اد ربات",
    "bot": "🤖 ربات", "emoji": "😀 ایموجی",
}
LOCKS_PAGE2 = {
    "photo": "🖼 عکس", "video": "🎬 ویدیو",
    "audio": "🎵 آهنگ", "document": "📄 فایل",
    "gif": "🎞 گیف", "sticker": "📦 استیکر",
    "game": "🎮 بازی", "voice": "🎤 ویس",
    "videonote": "📹 ویدیو نوت", "sticker_animation": "✨ استیکر متحرک",
}


def _locks_keyboard(locks: dict, page: int = 1):
    lock_map = LOCKS_PAGE1 if page == 1 else LOCKS_PAGE2
    rows = []
    keys = list(lock_map.items())
    for i in range(0, len(keys), 2):
        row = []
        for k, label in keys[i:i+2]:
            status = "✅" if locks.get(k) == "on" else "❌"
            row.append(InlineKeyboardButton(f"{status} {label}", callback_data=f"lk-{k}"))
        rows.append(row)

    nav = []
    if page == 1:
        nav.append(InlineKeyboardButton("صفحه بعدی", callback_data="locks-p2"))
    else:
        nav.append(InlineKeyboardButton("صفحه قبلی", callback_data="locks-p1"))
    nav.append(InlineKeyboardButton("🏛 برگشت", callback_data="back-main"))
    rows.append(nav)
    return InlineKeyboardMarkup(rows)


async def locks_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    q = update.callback_query
    data = q.data
    chat_id = q.message.chat.id

    if data in ("locks", "back-locks"):
        locks = await _get_locks_dict(chat_id)
        await q.edit_message_text("• قفل‌ها را تاگل کنید:", reply_markup=_locks_keyboard(locks, 1))
        return True

    if data == "locks-p1":
        locks = await _get_locks_dict(chat_id)
        await q.edit_message_text("• قفل‌ها را تاگل کنید:", reply_markup=_locks_keyboard(locks, 1))
        return True

    if data == "locks-p2":
        locks = await _get_locks_dict(chat_id)
        await q.edit_message_text("• قفل‌های رسانه:", reply_markup=_locks_keyboard(locks, 2))
        return True

    if data.startswith("lk-"):
        lock_type = data[3:]
        locks = await _get_locks_dict(chat_id)
        if locks.get(lock_type) == "on":
            await db.remove_lock(chat_id, lock_type)
            locks[lock_type] = "off"
        else:
            await db.add_lock(chat_id, lock_type)
            locks[lock_type] = "on"
        page = 1 if lock_type in LOCKS_PAGE1 else 2
        await q.edit_message_text("• قفل‌ها را تاگل کنید:", reply_markup=_locks_keyboard(locks, page))
        return True

    return False


async def _get_locks_dict(chat_id: int) -> dict:
    lock_list = await db.get_locks(chat_id)
    return {lt: "on" for lt in lock_list}


# ═══════════════════════════════════════════════
#  ADVANCED SETTINGS
# ═══════════════════════════════════════════════
def advanced_keyboard():
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("🔮 ادد اجباری", callback_data="adde"),
         InlineKeyboardButton("📮 عضویت اجباری", callback_data="adj")],
        [InlineKeyboardButton("⚠️ تنظیمات اخطار", callback_data="setw"),
         InlineKeyboardButton("💬 خوشامد گویی", callback_data="wel")],
        [InlineKeyboardButton("🔥 سختگیرانه", callback_data="hard"),
         InlineKeyboardButton("⚙ دسترسی‌ها", callback_data="can")],
        [InlineKeyboardButton("🔏 پیام رگباری", callback_data="flood"),
         InlineKeyboardButton("✅ قفل گروه", callback_data="lockgp")],
        [InlineKeyboardButton("📚 ضدتبچی", callback_data="antit")],
        _back(),
    ])


async def advanced_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    q = update.callback_query
    data = q.data
    chat_id = q.message.chat.id

    if data in ("locks2", "back-adv"):
        await q.edit_message_text("• تنظیمات پیشرفته:", reply_markup=advanced_keyboard())
        return True

    # ── Warn Settings ──
    if data.startswith("setw"):
        parts = data.split("-")
        if len(parts) > 1:
            d = parts[1]
            settings = await db.get_all_settings(chat_id)
            warn_count = int(settings.get("warn_count", 3))
            warn_mode = settings.get("warn_mode", "ban")

            if d in ("ban", "silent"):
                await db.set_setting(chat_id, "warn_mode", d)
                warn_mode = d
            elif d == "w-1":
                warn_count = min(10, warn_count + 1)
                await db.set_setting(chat_id, "warn_count", warn_count)
            elif d == "w--1":
                warn_count = max(1, warn_count - 1)
                await db.set_setting(chat_id, "warn_count", warn_count)

            s = "سکوت ✅" if warn_mode == "silent" else "سکوت"
            b = "بن ✅" if warn_mode == "ban" else "بن"
            kb = InlineKeyboardMarkup([
                [InlineKeyboardButton("➖", callback_data="setw-w--1"),
                 InlineKeyboardButton(str(warn_count), callback_data="setw-null"),
                 InlineKeyboardButton("➕", callback_data="setw-w-1")],
                [InlineKeyboardButton(s, callback_data="setw-silent"),
                 InlineKeyboardButton(b, callback_data="setw-ban")],
                _back("locks2"),
            ])
            await q.edit_message_text("• تنظیمات اخطار:", reply_markup=kb)
        else:
            settings = await db.get_all_settings(chat_id)
            warn_count = int(settings.get("warn_count", 3))
            warn_mode = settings.get("warn_mode", "ban")
            s = "سکوت ✅" if warn_mode == "silent" else "سکوت"
            b = "بن ✅" if warn_mode == "ban" else "بن"
            kb = InlineKeyboardMarkup([
                [InlineKeyboardButton("➖", callback_data="setw-w--1"),
                 InlineKeyboardButton(str(warn_count), callback_data="setw-null"),
                 InlineKeyboardButton("➕", callback_data="setw-w-1")],
                [InlineKeyboardButton(s, callback_data="setw-silent"),
                 InlineKeyboardButton(b, callback_data="setw-ban")],
                _back("locks2"),
            ])
            await q.edit_message_text("• تنظیمات اخطار:", reply_markup=kb)
        return True

    # ── Flood Settings ──
    if data.startswith("flood"):
        parts = data.split("-")
        if len(parts) > 1:
            d = parts[1]
            settings = await db.get_all_settings(chat_id)
            flood_limit = int(settings.get("flood_limit", 5))
            flood_time = int(settings.get("flood_time", 10))
            flood_mode = settings.get("flood_mode", "mute")
            antiflood = settings.get("antiflood", False)

            if d == "on":
                await db.set_setting(chat_id, "antiflood", True)
                antiflood = True
            elif d == "off":
                await db.set_setting(chat_id, "antiflood", False)
                antiflood = False
            elif d in ("mute", "ban"):
                await db.set_setting(chat_id, "flood_mode", d)
                flood_mode = d
            elif d.startswith("t-"):
                delta = int(d[2:])
                new_time = flood_time + delta
                if 2 <= new_time <= 10:
                    await db.set_setting(chat_id, "flood_time", new_time)
                    flood_time = new_time
            elif d.startswith("d-"):
                delta = int(d[2:])
                new_limit = flood_limit + delta
                if 2 <= new_limit <= 10:
                    await db.set_setting(chat_id, "flood_limit", new_limit)
                    flood_limit = new_limit

            status = "فعال ✅" if antiflood else "فعال"
            status_off = "غیرفعال ✅" if not antiflood else "غیرفعال"
            mute_s = "سکوت ✅" if flood_mode == "mute" else "سکوت"
            ban_s = "بن ✅" if flood_mode == "ban" else "بن"

            if antiflood:
                kb = InlineKeyboardMarkup([
                    [InlineKeyboardButton(status, callback_data="flood-on"),
                     InlineKeyboardButton(status_off, callback_data="flood-off")],
                    [InlineKeyboardButton(mute_s, callback_data="flood-mute"),
                     InlineKeyboardButton(ban_s, callback_data="flood-ban")],
                    [InlineKeyboardButton("⏰ زمان رگبار", callback_data="flood-null")],
                    [InlineKeyboardButton("➖", callback_data="flood-t--1"),
                     InlineKeyboardButton(str(flood_time), callback_data="flood-null"),
                     InlineKeyboardButton("➕", callback_data="flood-t-1")],
                    [InlineKeyboardButton("🌀 تعداد رگبار", callback_data="flood-null")],
                    [InlineKeyboardButton("➖", callback_data="flood-d--1"),
                     InlineKeyboardButton(str(flood_limit), callback_data="flood-null"),
                     InlineKeyboardButton("➕", callback_data="flood-d-1")],
                    _back("locks2"),
                ])
            else:
                kb = InlineKeyboardMarkup([
                    [InlineKeyboardButton(status, callback_data="flood-on"),
                     InlineKeyboardButton(status_off, callback_data="flood-off")],
                    _back("locks2"),
                ])
            await q.edit_message_text("• تنظیمات پیام رگباری:", reply_markup=kb)
        else:
            await q.edit_message_text("• تنظیمات پیام رگباری:", reply_markup=InlineKeyboardMarkup([_back("locks2")]))
        return True

    # ── Welcome ──
    if data.startswith("wel"):
        parts = data.split("-")
        settings = await db.get_all_settings(chat_id)
        welcome_on = settings.get("welcome_enabled", True)

        if len(parts) > 1:
            d = parts[1]
            if d == "on":
                await db.set_setting(chat_id, "welcome_enabled", True)
                welcome_on = True
            elif d == "off":
                await db.set_setting(chat_id, "welcome_enabled", False)
                welcome_on = False

        status = "فعال ✅" if welcome_on else "فعال"
        status_off = "غیرفعال ✅" if not welcome_on else "غیرفعال"
        kb = InlineKeyboardMarkup([
            [InlineKeyboardButton(status, callback_data="wel-on"),
             InlineKeyboardButton(status_off, callback_data="wel-off")],
            [InlineKeyboardButton("💈 تنظیم پیام", callback_data="setwel")],
            [InlineKeyboardButton("🚫 حذف پیام", callback_data="remwel")],
            _back("locks2"),
        ])
        await q.edit_message_text("• بخش خوشامد گویی:", reply_markup=kb)
        return True

    # ── Hard mode ──
    if data.startswith("hard"):
        parts = data.split("-")
        settings = await db.get_all_settings(chat_id)
        hard_on = settings.get("hard_mode", False)

        if len(parts) > 1:
            d = parts[1]
            if d == "on":
                await db.set_setting(chat_id, "hard_mode", True)
                hard_on = True
            elif d == "off":
                await db.set_setting(chat_id, "hard_mode", False)
                hard_on = False

        status = "فعال ✅" if hard_on else "فعال"
        status_off = "غیرفعال ✅" if not hard_on else "غیرفعال"
        kb = InlineKeyboardMarkup([
            [InlineKeyboardButton(status, callback_data="hard-on"),
             InlineKeyboardButton(status_off, callback_data="hard-off")],
            _back("locks2"),
        ])
        text = ("🔥 حالت سختگیرانه\n\n"
                "با فعال‌سازی این حالت، اگر کاربران لینک یا فوروارد بفرستند "
                "بصورت همیشگی سکوت می‌شوند.")
        await q.edit_message_text(text, reply_markup=kb)
        return True

    # ── Group Lock ──
    if data.startswith("lockgp"):
        settings = await db.get_all_settings(chat_id)
        muteall = settings.get("muteall", False)
        parts = data.split("-")

        if len(parts) > 1:
            d = parts[1]
            if d == "on":
                await db.set_setting(chat_id, "muteall", True)
                muteall = True
            elif d == "off":
                await db.set_setting(chat_id, "muteall", False)
                muteall = False

        status = "فعال ✅" if muteall else "فعال"
        status_off = "غیرفعال ✅" if not muteall else "غیرفعال"
        kb = InlineKeyboardMarkup([
            [InlineKeyboardButton(status, callback_data="lockgp-on"),
             InlineKeyboardButton(status_off, callback_data="lockgp-off")],
            _back("locks2"),
        ])
        text = "✅ قفل گروه\n\nبا فعال‌سازی، تمام کاربران قادر به ارسال پیام نخواهند بود."
        await q.edit_message_text(text, reply_markup=kb)
        return True

    # ── Chat Permissions ──
    if data.startswith("can"):
        try:
            member = await context.bot.get_chat_member(chat_id, context.bot.id)
            if member.status not in ("administrator", "creator"):
                await q.answer("ربات ادمین نیست!", show_alert=True)
                return True
        except Exception:
            pass

        chat = await context.bot.get_chat(chat_id)
        perms = chat.permissions
        can_map = [
            ("ارسال پیام", "send_messages", perms.can_send_messages if perms else True),
            ("ارسال رسانه", "send_media_messages", perms.can_send_media_messages if perms else True),
            ("ارسال نظرسنجی", "send_polls", perms.can_send_polls if perms else True),
            ("ارسال باقی پیام‌ها", "send_other_messages", perms.can_send_other_messages if perms else True),
            ("لینک پیش‌نمایش", "can_add_web_page_previews", perms.can_add_web_page_previews if perms else True),
            ("دعوت عضو", "can_invite_users", perms.can_invite_users if perms else True),
        ]

        parts = data.split("_")
        if len(parts) > 1:
            perm_key = "_".join(parts[1:])
            for label, key, val in can_map:
                if key == perm_key:
                    new_perms = ChatPermissions(
                        can_send_messages=perms.can_send_messages if perms else True,
                        can_send_media_messages=perms.can_send_media_messages if perms else True,
                        can_send_polls=perms.can_send_polls if perms else True,
                        can_send_other_messages=perms.can_send_other_messages if perms else True,
                        can_add_web_page_previews=perms.can_add_web_page_previews if perms else True,
                        can_invite_users=perms.can_invite_users if perms else True,
                    )
                    setattr(new_perms, key, not val)
                    await context.bot.set_chat_permissions(chat_id, new_perms)
                    perms = new_perms
                    break

        rows = []
        for label, key, val in can_map:
            icon = "باز" if val else "بسته"
            rows.append([InlineKeyboardButton(f"{label} : {icon}", callback_data=f"can_{key}")])
        rows.append(_back("locks2"))
        await q.edit_message_text("• دسترسی‌های گروه:", reply_markup=InlineKeyboardMarkup(rows))
        return True

    return False


# ═══════════════════════════════════════════════
#  HELP PANEL
# ═══════════════════════════════════════════════
def help_keyboard():
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("راهنمای قفلی", callback_data="h-l"),
         InlineKeyboardButton("راهنمای مدیریت", callback_data="h-m")],
        [InlineKeyboardButton("راهنمای سرگرمی", callback_data="h-s"),
         InlineKeyboardButton("راهنمای پاکسازی", callback_data="h-p")],
        [InlineKeyboardButton("دستورات انگلیسی", callback_data="d-e"),
         InlineKeyboardButton("راهنمای اد اجباری", callback_data="h-j")],
        [InlineKeyboardButton("راهنمای کنترلی", callback_data="h-k"),
         InlineKeyboardButton("راهنمای خوشامد", callback_data="h-kh")],
        _back(),
    ])


HELP_TEXTS = {
    "h-l": ("🔒 راهنمای قفل‌ها\n\n"
            "قفل‌های اصلی:\n"
            "قفل لینک | قفل فوروارد | قفل تگ | قفل هشتگ\n"
            "قفل فارسی | قفل انگلیسی | قفل ربات | قفل ایموجی\n\n"
            "قفل رسانه:\n"
            "قفل عکس | قفل فیلم | قفل ویس | قفل گیف\n"
            "قفل آهنگ | قفل فایل | قفل استیکر | قفل بازی\n\n"
            "قفل رگبار:\n"
            "قفل رگبار | بازکردن رگبار\n"
            "تعداد رگبار 3-10 | تنظیم رگبار سکوت/بن"),
    "h-m": ("📍 راهنمای مدیریت\n\n"
            "مدیریت مدیران:\n"
            "پیکربندی | پاکسازی لیست مدیران\n"
            "تنظیم مدیر | حذف مدیر | لیست مدیران\n\n"
            "کاربران ویژه:\n"
            "تنظیم ویژه | حذف ویژه\n"
            "لیست ویژه | پاکسازی لیست ویژه\n\n"
            "ادمین کردن:\n"
            "افزودن ادمین | حذف ادمین | لیست ادمین‌ها"),
    "h-s": ("📍 راهنمای سرگرمی\n\n"
            "تبدیل استیکر:\n"
            "عکس به استیکر | استیکر به عکس\n\n"
            "کاربردی:\n"
            "تقویم | شعر | فال | نرخ ارز\n\n"
            "هواشناسی:\n"
            "هواشناسی تهران\n\n"
            "تنظیم لقب:\n"
            "تنظیم لقب | حذف لقب | پاکسازی لیست لقب\n\n"
            "ترجمه:\n"
            "ترجمه فارسی | ترجمه انگلیسی"),
    "h-p": ("📍 راهنمای پاکسازی\n\n"
            "پاکسازی پیام‌ها:\n"
            "حذف 100 | حذف 10000\n\n"
            "پاکسازی لیست‌ها:\n"
            "پاکسازی لیست مدیران\n"
            "پاکسازی لیست ویژه\n"
            "پاکسازی لیست اخطار\n"
            "پاکسازی لیست بن\n"
            "پاکسازی لیست سکوت\n"
            "پاکسازی لیست لقب\n"
            "پاکسازی لیست فیلتر"),
    "h-k": ("📍 راهنمای کنترلی\n\n"
            "بن:\n"
            "بن | حذف بن | لیست بن | پاکسازی لیست بن\n\n"
            "سکوت:\n"
            "سکوت | حذف سکوت | لیست سکوت | پاکسازی لیست سکوت\n"
            "سکوت دقیقه\n\n"
            "اخطار:\n"
            "اخطار | حذف اخطار | لیست اخطار | پاکسازی لیست اخطار\n"
            "تنظیم اخطار سکوت/بن | تعداد اخطار | وضعیت اخطار"),
    "h-kh": ("📍 راهنمای خوشامد\n\n"
             "فعال/غیرفعال:\n"
             "خوشامد روشن | خوشامد خاموش\n\n"
             "تنظیم متن:\n"
             "تنظیم خوشامد [متن]\n"
             "حذف خوشامد\n\n"
             "متغیرها:\n"
             "mention | firstname | lastname\n"
             "username | groupname | grouprules\n"
             "grouplink | userid | time | date\n\n"
             "حذف خودکار:\n"
             "تنظیم زمان خوشامد 30"),
}


async def help_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> bool:
    q = update.callback_query
    data = q.data

    if data in ("help", "back-h"):
        await q.edit_message_text("• لطفاً بخش مورد نظر را انتخاب کنید:", reply_markup=help_keyboard())
        return True

    if data in HELP_TEXTS:
        text = HELP_TEXTS[data]
        await q.edit_message_text(text, reply_markup=InlineKeyboardMarkup([_back("help")]),
                                  parse_mode=ParseMode.HTML)
        return True

    return False


# ═══════════════════════════════════════════════
#  MAIN CALLBACK ROUTER
# ═══════════════════════════════════════════════
async def panel_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    q = update.callback_query
    if not q or not q.data:
        return

    data = q.data
    chat_id = q.message.chat.id
    user_id = q.from_user.id

    # Check admin
    if not await is_chat_admin(context.bot, chat_id, user_id) and user_id != OWNER_ID:
        await q.answer("فقط ادمین‌ها می‌توانند از پنل استفاده کنند!", show_alert=True)
        return

    if data == "close":
        try:
            await q.message.delete()
        except (BadRequest, Forbidden):
            pass
        return

    if data == "back-main":
        await q.edit_message_text("• لطفاً بخش مورد نظر را انتخاب کنید:", reply_markup=panel_keyboard())
        return

    # Route to sub-handlers
    if await lists_callback(update, context):
        return
    if await locks_callback(update, context):
        return
    if await advanced_callback(update, context):
        return
    if await help_callback(update, context):
        return


def register(app) -> None:
    from telegram.ext import CallbackQueryHandler
    app.add_handler(CallbackQueryHandler(panel_callback, pattern=r"^(lists|locks|locks2|help|close|back-|lk-|l-|rem-|setw|flood|wel|hard|lockgp|can|h-|d-e|locks-p)"))
