"""Interactive category-based help system with Persian-only commands."""
from __future__ import annotations

from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.constants import ParseMode
from telegram.ext import CallbackQueryHandler, CommandHandler, ContextTypes

from bot.constants import E, HELP_TEXT
from bot.persian_router import register_mixed
from bot.sticker_panel import get_panel_header, SEPARATOR

CATEGORIES: dict[str, tuple[str, list[str]]] = {
    "admin": (
        "مدیریت اعضا",
        [
            "بن کن [دلیل]", "بن موقت 1h [دلیل]", "حذف بن / رفع بن",
            "ساکت کن / سکوت کن", "سکوت موقت 1h", "حذف سکوت / رفع سکوت",
            "اخراج کن / کیک", "اخطار بده [دلیل]", "اخطارها", "پاکسازی اخطار",
            "حذف کن (روی پیام)", "پاکسازی [تعداد]", "سنجاق کن", "حذف سنجاق",
        ],
    ),
    "locks": (
        "قفل‌ها",
        [
            "قفل کن [نوع]", "باز کن [نوع]", "قفل‌ها / لیست قفل",
            "انواع قفل", "رفع همه قفل", "قفل گروه", "پنل قفل",
        ],
    ),
    "protection": (
        "امنیت",
        [
            "تنظیم رگبار [عدد]", "ضد لینک", "کلمه ممنوع [کلمه]",
            "لیست سیاه", "ضد ریپ", "ضد ربات", "کپچا فعال/غیرفعال",
            "جوین اجباری [لینک]", "حذف خودکار [ثانیه]",
        ],
    ),
    "tag": (
        "تگ و گزارش",
        [
            "تگ کن [متن]", "تگ بدون ادمین [متن]", "ادمین‌ها",
            "گزارش [دلیل] (روی پیام)", "همگانی [متن]",
        ],
    ),
    "groups": (
        "تنظیمات گروه",
        [
            "تنظیم خوشامد [متن]", "تنظیم خداحافظی [متن]", "استیکر خوشامد",
            "تنظیم قوانین [متن]", "قوانین", "ذخیره کن [نام] (ریپلای)",
            "یادداشت‌ها", "فیلتر [کلمه] (ریپلای)", "تنظیمات",
        ],
    ),
    "fun": (
        "سرگرمی",
        [
            "فال / فال حافظ", "تقویم / تقویم شمسی", "معنی [کلمه]",
            "عکس به استیکر", "استیکر به عکس", "بگو [متن]", "تاس",
            "سکه / شیر یا خط", "شانس / شانس امروز", "عدد تصادفی",
            "انتخاب کن [گزینه‌ها]", "رمز [طول]", "کیوآر [متن]",
        ],
    ),
    "ai": (
        "هوش مصنوعی",
        [
            "هوش مصنوعی [سوال]", "سوال [سوال]", "بپرس [سوال]",
            "شخصیت / تنظیم چت", "ترجمه [متن]",
        ],
    ),
    "stats": (
        "آمار",
        [
            "اطلاعات [ریپلای]", "اطلاعات گروه", "آیدی", "آمار / فعال‌ترین",
            "پینگ / چه خبر", "وضعیت ربات / سلامت", "لینک پیام (ریپلای)",
        ],
    ),
}

# Flat lookup used by start.py help callback
HELP_SECTIONS = {k: v[0] for k, v in CATEGORIES.items()}

CAT_KEYS = list(CATEGORIES.keys())


def _build_keyboard(cat_keys: list[str], prefix: str = "help_cat") -> InlineKeyboardMarkup:
    rows = []
    for i in range(0, len(cat_keys), 2):
        row = []
        row.append(InlineKeyboardButton(
            CATEGORIES[cat_keys[i]][0], callback_data=f"{prefix}:{cat_keys[i]}"
        ))
        if i + 1 < len(cat_keys):
            row.append(InlineKeyboardButton(
                CATEGORIES[cat_keys[i + 1]][0], callback_data=f"{prefix}:{cat_keys[i + 1]}"
            ))
        rows.append(row)
    rows.append([InlineKeyboardButton(f"{E['done']} راهنمای کامل", callback_data="help_full")])
    return InlineKeyboardMarkup(rows)


async def help_interactive_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    text = get_panel_header("📘", "راهنمای ربات", "دسته مورد نظرت رو انتخاب کن")
    await update.message.reply_text(text, parse_mode=ParseMode.HTML, reply_markup=_build_keyboard(CAT_KEYS))


async def help_callback(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    q = update.callback_query
    await q.answer()
    if not q.data or not q.data.startswith("help_"):
        return
    parts = q.data.split(":", 1)
    action = parts[0]
    if action == "help_cat" and len(parts) > 1:
        cat_key = parts[1]
        cat = CATEGORIES.get(cat_key)
        if not cat:
            return
        title, cmds = cat
        text = get_panel_header("📘", title, "")
        text += "\n".join(f"• {c}" for c in cmds)
        text += f"\n\n<b>نکته:</b> نیازی به / نیست! فقط به فارسی بگو."
        keyboard = [
            [InlineKeyboardButton(f"{E['back']} بازگشت به دسته‌بندی", callback_data="help_back")],
        ]
        await q.edit_message_text(text, parse_mode=ParseMode.HTML, reply_markup=InlineKeyboardMarkup(keyboard))
    elif action == "help_back":
        text = get_panel_header("📘", "راهنمای ربات", "دسته مورد نظرت رو انتخاب کن")
        await q.edit_message_text(text, parse_mode=ParseMode.HTML, reply_markup=_build_keyboard(CAT_KEYS))
    elif action == "help_full":
        await q.edit_message_text(HELP_TEXT, parse_mode=ParseMode.HTML, disable_web_page_preview=True)
        keyboard = InlineKeyboardMarkup([
            [InlineKeyboardButton(f"{E['back']} بازگشت به دسته‌بندی", callback_data="help_back")],
        ])
        await q.message.reply_text("برای بازگشت کلیک کن:", reply_markup=keyboard)


def register(app) -> None:
    register_mixed(
        app,
        {"help2": help_interactive_cmd},
        {
            "راهنما": help_interactive_cmd,
            "راهنمایی": help_interactive_cmd,
            "کمک": help_interactive_cmd,
            "چجوری": help_interactive_cmd,
            "چطور": help_interactive_cmd,
            "آموزش": help_interactive_cmd,
        },
    )
    app.add_handler(CallbackQueryHandler(help_callback, pattern=r"^help_"))
