"""Inline keyboard builders (Persian, callback-data safe)."""

from __future__ import annotations

from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup

from app.database.models import (
    MediaAsset,
    Post,
    PostDestination,
    PublishChannel,
    RequiredChannel,
    ScheduledJob,
)

BACK = "menu:home"
CANCEL = "flow:cancel"


def _rows(buttons: list[tuple[str, str]], columns: int = 2) -> list[list[InlineKeyboardButton]]:
    rows: list[list[InlineKeyboardButton]] = []
    row: list[InlineKeyboardButton] = []
    for text, data in buttons:
        row.append(InlineKeyboardButton(text=text, callback_data=data))
        if len(row) == columns:
            rows.append(row)
            row = []
    if row:
        rows.append(row)
    return rows


def main_menu(*, is_primary: bool = False) -> InlineKeyboardMarkup:
    rows = _rows(
        [
            ("🎬 مدیریت فیلم‌ها", "menu:media"),
            ("📝 مدیریت پست‌ها", "post:list:all:0"),
            ("➕ ساخت پست جدید", "menu:newpost"),
            ("⚡ عملیات گروهی", "bulk:start"),
            ("📝 تنظیم کپشن عمومی", "menu:caption"),
            ("🖼️ تنظیم عکس عمومی", "menu:cover"),
            ("📢 کانال‌های انتشار", "menu:channels"),
            ("🔒 عضویت اجباری", "menu:membership"),
            ("⏱️ حذف خودکار", "menu:autodelete"),
            ("🔗 مدیریت لینک‌ها", "menu:links"),
            ("📅 زمان‌بندی انتشار", "menu:schedule"),
            ("📊 آمار و گزارش‌ها", "menu:stats"),
            ("👥 مدیریت مدیران", "menu:admins"),
            ("👤 کاربران و مسدودسازی", "menu:users"),
            ("⚙️ تنظیمات عمومی", "menu:settings"),
            ("🧾 گزارش خطاها", "menu:errors"),
            ("❌ لغو عملیات جاری", CANCEL),
        ]
    )
    if is_primary:
        rows.append([InlineKeyboardButton(text="👑 شما مدیر اصلی هستید", callback_data="noop")])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def back_menu(callback: str = BACK, label: str = "⬅️ بازگشت") -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[[InlineKeyboardButton(text=label, callback_data=callback)]]
    )


def back_cancel(
    callback: str = BACK, *, cancel_label: str = "❌ لغو"
) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(text="⬅️ بازگشت", callback_data=callback),
                InlineKeyboardButton(text=cancel_label, callback_data=CANCEL),
            ]
        ]
    )


def confirm(
    action: str,
    entity_id: str | int,
    *,
    back: str = BACK,
    yes: str = "✅ تأیید نهایی",
    no: str = "⬅️ انصراف",
) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text=yes, callback_data=f"confirm:{action}:{entity_id}")],
            [InlineKeyboardButton(text=no, callback_data=back)],
        ]
    )


def media_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(text="📥 افزودن گروه منبع", callback_data="source:add"),
                InlineKeyboardButton(text="📋 گروه‌های منبع", callback_data="source:list"),
            ],
            [
                InlineKeyboardButton(text="🆕 آماده استفاده", callback_data="media:list:ready:0"),
                InlineKeyboardButton(text="📚 همه فایل‌ها", callback_data="media:list:all:0"),
            ],
            [
                InlineKeyboardButton(text="⚠️ دارای خطا", callback_data="media:list:error:0"),
                InlineKeyboardButton(text="📊 وضعیت فایل‌ها", callback_data="media:stats"),
            ],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def media_list(
    items: list[MediaAsset], *, page: int, filter_name: str, has_next: bool
) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = []
    for media in items:
        title = (media.file_name or f"ویدیو #{media.id}")[:35]
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"🎬 {title}", callback_data=f"media:view:{media.id}"
                )
            ]
        )
    nav: list[InlineKeyboardButton] = []
    if page > 0:
        nav.append(
            InlineKeyboardButton(
                text="⬅️ صفحه قبل", callback_data=f"media:list:{filter_name}:{page - 1}"
            )
        )
    if has_next:
        nav.append(
            InlineKeyboardButton(
                text="صفحه بعد ➡️", callback_data=f"media:list:{filter_name}:{page + 1}"
            )
        )
    if nav:
        rows.append(nav)
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:media")])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def source_list(sources: list[object]) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = []
    for source in sources:
        active = "✅" if getattr(source, "is_active", False) else "⏸"
        auto = "📥" if getattr(source, "auto_ingest", False) else "⏹"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{active}{auto} {getattr(source, 'title', None) or getattr(source, 'chat_id', '')}",
                    callback_data=f"source:view:{source.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="➕ افزودن گروه", callback_data="source:add")])
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:media")])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def source_item(source: object) -> InlineKeyboardMarkup:
    source_id = source.id
    active = getattr(source, "is_active", False)
    auto = getattr(source, "auto_ingest", False)
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="⏸ غیرفعال" if active else "✅ فعال",
                    callback_data=f"source:toggle:{source_id}",
                ),
                InlineKeyboardButton(
                    text="⏹ خاموش کردن دریافت" if auto else "📥 روشن کردن دریافت",
                    callback_data=f"source:auto:{source_id}",
                ),
            ],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="source:list")],
        ]
    )


def media_item(media_id: int, *, ready: bool) -> InlineKeyboardMarkup:
    rows = []
    if ready:
        rows.append(
            [
                InlineKeyboardButton(
                    text="➕ ساخت پست با این ویدیو", callback_data=f"post:new:{media_id}"
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:media")])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def post_list(
    posts: list[Post], *, page: int, filter_name: str, has_next: bool
) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = []
    status_fa = {
        "DRAFT": "پیش‌نویس",
        "READY": "آماده",
        "SCHEDULED": "زمان‌بندی",
        "PUBLISHED": "منتشرشده",
        "PAUSED": "متوقف",
        "ARCHIVED": "آرشیو",
        "FAILED": "خطا",
    }
    for post in posts:
        title = (post.title or f"پست #{post.id}")[:30]
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{status_fa.get(post.status.value, post.status.value)} | {title}",
                    callback_data=f"post:view:{post.id}",
                )
            ]
        )
    nav = []
    if page > 0:
        nav.append(
            InlineKeyboardButton(
                text="⬅️", callback_data=f"post:list:{filter_name}:{page - 1}"
            )
        )
    if has_next:
        nav.append(
            InlineKeyboardButton(
                text="➡️", callback_data=f"post:list:{filter_name}:{page + 1}"
            )
        )
    if nav:
        rows.append(nav)
    rows.append([InlineKeyboardButton(text="➕ پست جدید", callback_data="menu:newpost")])
    rows.append([InlineKeyboardButton(text="⚡ عملیات گروهی", callback_data="bulk:start")])
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def post_item(post: Post) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = [
        [
            InlineKeyboardButton(text="👁 پیش‌نمایش", callback_data=f"post:preview:{post.id}"),
            InlineKeyboardButton(text="🚀 انتشار", callback_data=f"post:publish:{post.id}"),
        ],
        [
            InlineKeyboardButton(text="🕒 زمان‌بندی", callback_data=f"post:schedule:{post.id}"),
            InlineKeyboardButton(text="♻️ کپی", callback_data=f"post:clone:{post.id}"),
        ],
        [
            InlineKeyboardButton(text="🔗 لینک", callback_data=f"post:link:{post.id}"),
            InlineKeyboardButton(text="📢 مقصدها", callback_data=f"post:destinations:{post.id}"),
        ],
        [InlineKeyboardButton(text="✏️ ویرایش پیش‌نویس", callback_data=f"post:edit:{post.id}")],
    ]
    if post.status.value in {"PUBLISHED", "ARCHIVED"}:
        rows[0][1] = InlineKeyboardButton(
            text="♻️ انتشار مجدد",
            callback_data=f"post:republish:{post.id}",
        )
    if post.status.value in {"FAILED", "SCHEDULED"}:
        rows.append(
            [
                InlineKeyboardButton(
                    text="🔁 تلاش دوباره مقصدهای خطادار", callback_data=f"post:retry:{post.id}"
                )
            ]
        )
    if post.status.value == "SCHEDULED":
        rows.append([InlineKeyboardButton(text="⏸ توقف زمان‌بندی", callback_data=f"post:pause:{post.id}")])
    if post.status.value == "PAUSED":
        rows.append([InlineKeyboardButton(text="▶️ ادامه", callback_data=f"post:resume:{post.id}")])
    if post.status.value == "FAILED":
        rows.append([InlineKeyboardButton(text="⏸ توقف", callback_data=f"post:pause:{post.id}")])
    rows.append(
        [
            InlineKeyboardButton(text="🗄 آرشیو", callback_data=f"post:archive:{post.id}"),
            InlineKeyboardButton(text="🗑 حذف", callback_data=f"post:delete:{post.id}"),
        ]
    )
    rows.append(
        [
            InlineKeyboardButton(text="⬅️ فهرست", callback_data="post:list:all:0"),
            InlineKeyboardButton(text="🏠 منو", callback_data=BACK),
        ]
    )
    return InlineKeyboardMarkup(inline_keyboard=rows)


def channels_menu(channels: list[PublishChannel]) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = []
    for channel in channels:
        status = "✅" if channel.can_post else ("⚠️" if channel.can_post is False else "❔")
        default = " ⭐" if channel.is_default else ""
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{status} {channel.title or channel.chat_id}{default}",
                    callback_data=f"channel:view:{channel.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="➕ افزودن کانال", callback_data="channel:add")])
    rows.append([InlineKeyboardButton(text="🔄 بررسی همه", callback_data="channel:check_all")])
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def channel_item(channel: PublishChannel) -> InlineKeyboardMarkup:
    rows = [
        [InlineKeyboardButton(text="🔄 بررسی دسترسی", callback_data=f"channel:check:{channel.id}")],
        [InlineKeyboardButton(text="⭐ کانال پیش‌فرض", callback_data=f"channel:default:{channel.id}")],
        [
            InlineKeyboardButton(
                text="🚫 غیرفعال" if channel.is_active else "✅ فعال",
                callback_data=f"channel:toggle:{channel.id}",
            )
        ],
        [InlineKeyboardButton(text="🗑 حذف", callback_data=f"channel:delete:{channel.id}")],
        [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:channels")],
    ]
    return InlineKeyboardMarkup(inline_keyboard=rows)


def membership_menu(channels: list[RequiredChannel]) -> InlineKeyboardMarkup:
    rows: list[list[InlineKeyboardButton]] = []
    for channel in channels:
        state = "✅" if channel.is_active and channel.is_required_globally else "⏸"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{state} {channel.title}",
                    callback_data=f"member:view:{channel.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="➕ افزودن کانال الزامی", callback_data="member:add")])
    rows.append(
        [
            InlineKeyboardButton(text="🔄 بررسی دسترسی ربات", callback_data="member:check_all"),
            InlineKeyboardButton(text="📝 متن عضویت", callback_data="member:text"),
        ]
    )
    rows.append(
        [InlineKeyboardButton(text="🔒 روشن/خاموش عضویت اجباری", callback_data="member:toggle_global")]
    )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def membership_item(channel: RequiredChannel) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="🔄 بررسی دسترسی", callback_data=f"member:check:{channel.id}"
                )
            ],
            [
                InlineKeyboardButton(
                    text="🚫 غیرفعال" if channel.is_active else "✅ فعال",
                    callback_data=f"member:toggle:{channel.id}",
                ),
                InlineKeyboardButton(
                    text="➕ افزودن به الزام عمومی"
                    if not channel.is_required_globally
                    else "➖ حذف از الزام عمومی",
                    callback_data=f"member:global:{channel.id}",
                ),
            ],
            [
                InlineKeyboardButton(text="⬆️", callback_data=f"member:up:{channel.id}"),
                InlineKeyboardButton(text="⬇️", callback_data=f"member:down:{channel.id}"),
            ],
            [InlineKeyboardButton(text="🗑 حذف", callback_data=f"member:delete:{channel.id}")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:membership")],
        ]
    )


def newpost_media_list(items: list[MediaAsset]) -> InlineKeyboardMarkup:
    rows = []
    for media in items:
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"🎬 {media.file_name or ('ویدیو #' + str(media.id))}"[:60],
                    callback_data=f"post:new:{media.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def bulk_list(posts: list[Post], selected: set[int]) -> InlineKeyboardMarkup:
    rows = []
    for post in posts:
        mark = "✅" if post.id in selected else "⬜"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{mark} {post.title or ('پست #' + str(post.id))}"[:60],
                    callback_data=f"bulk:toggle:{post.id}",
                )
            ]
        )
    rows.append(
        [
            InlineKeyboardButton(text="🚀 انتشار", callback_data="bulk:action:publish"),
            InlineKeyboardButton(text="🗄 آرشیو", callback_data="bulk:action:archive"),
        ]
    )
    rows.append([InlineKeyboardButton(text="🗑 حذف", callback_data="bulk:action:delete")])
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def bulk_confirm(action: str, count: int) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text=f"✅ تأیید {action} برای {count} پست", callback_data=f"confirm:bulk_{action}")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="bulk:start")],
        ]
    )


def post_channels_select(
    channels: list[PublishChannel], selected: set[int]
) -> InlineKeyboardMarkup:
    rows = []
    for channel in channels:
        mark = "✅" if channel.id in selected else "⬜"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{mark} {channel.title or channel.chat_id}",
                    callback_data=f"newpost:channel:{channel.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="✅ ادامه", callback_data="newpost:channels_done")])
    rows.append([InlineKeyboardButton(text="❌ لغو", callback_data=CANCEL)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def post_membership_select(mode: str) -> InlineKeyboardMarkup:
    labels = {
        "INHERIT": "🌐 طبق تنظیم عمومی",
        "ENFORCE": "🔒 الزام برای این پست",
        "DISABLE": "🔓 نادیده‌گرفتن برای این پست",
    }
    rows = []
    for value, label in labels.items():
        mark = "✅ " if mode == value else ""
        rows.append(
            [InlineKeyboardButton(text=mark + label, callback_data=f"newpost:membership:{value}")]
        )
    rows.append([InlineKeyboardButton(text="ادامه ➡️", callback_data="newpost:membership_done")])
    rows.append([InlineKeyboardButton(text="❌ لغو", callback_data=CANCEL)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def post_delete_select() -> InlineKeyboardMarkup:
    options = [
        ("بدون حذف", "0", "0"),
        ("۱۵ ثانیه", "15", "0"),
        ("۳۰ ثانیه", "30", "0"),
        ("۱ دقیقه", "60", "0"),
        ("۵ دقیقه", "300", "0"),
        ("۱۰ دقیقه", "600", "0"),
    ]
    rows = [
        [
            InlineKeyboardButton(
                text=label, callback_data=f"newpost:delete:{user_seconds}:{channel_seconds}"
            )
        ]
        for label, user_seconds, channel_seconds in options
    ]
    rows.append([InlineKeyboardButton(text="زمان دلخواه", callback_data="newpost:delete_custom")])
    rows.append([InlineKeyboardButton(text="❌ لغو", callback_data=CANCEL)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def preview_actions() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="🚀 انتشار همین حالا", callback_data="newpost:publish")],
            [InlineKeyboardButton(text="💾 ذخیره پیش‌نویس", callback_data="newpost:save")],
            [InlineKeyboardButton(text="🕒 زمان‌بندی", callback_data="newpost:schedule")],
            [InlineKeyboardButton(text="❌ لغو", callback_data=CANCEL)],
        ]
    )


def schedule_menu(jobs: list[ScheduledJob]) -> InlineKeyboardMarkup:
    rows = []
    for job in jobs[:10]:
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"⏰ #{job.id} | پست {job.post_id}",
                    callback_data=f"schedule:view:{job.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def schedule_item(job_id: int) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="🗑 لغو زمان‌بندی", callback_data=f"schedule:cancel:{job_id}")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:schedule")],
        ]
    )


def token_menu(post_id: int, active: bool) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="♻️ تولید لینک جدید", callback_data=f"link:regen:{post_id}")],
            [
                InlineKeyboardButton(
                    text="🚫 غیرفعال" if active else "✅ فعال",
                    callback_data=f"link:toggle:{post_id}",
                )
            ],
            [InlineKeyboardButton(text="⏳ تعیین انقضا", callback_data=f"link:expiry:{post_id}")],
            [InlineKeyboardButton(text="🔢 محدودیت استفاده", callback_data=f"link:maxuses:{post_id}")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:links")],
        ]
    )


def caption_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="📝 قالب کپشن", callback_data="caption:edit:template")],
            [InlineKeyboardButton(text="⬆️ متن ابتدای کپشن", callback_data="caption:edit:prefix")],
            [InlineKeyboardButton(text="⬇️ متن انتهای کپشن", callback_data="caption:edit:suffix")],
            [InlineKeyboardButton(text="🏷 امضای برند", callback_data="caption:edit:signature")],
            [InlineKeyboardButton(text="🔘 دکمه‌های زیر پست", callback_data="caption:edit:buttons")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def cover_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="🖼 ارسال عکس جدید", callback_data="cover:set")],
            [InlineKeyboardButton(text="🗑 حذف کاور عمومی", callback_data="cover:remove")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def auto_delete_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(text="⏱ زمان پیام کاربر", callback_data="autodel:user"),
                InlineKeyboardButton(text="📢 زمان پست کانال", callback_data="autodel:channel"),
            ],
            [InlineKeyboardButton(text="🔄 روشن/خاموش", callback_data="autodel:toggle")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def links_menu(posts: list[object]) -> InlineKeyboardMarkup:
    rows = []
    for post in posts:
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"🔗 {getattr(post, 'title', None) or ('پست #' + str(post.id))}",
                    callback_data=f"link:view:{post.id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def settings_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(text="🛡 محافظت از محتوا", callback_data="settings:toggle:protect_content"),
                InlineKeyboardButton(text="📥 دریافت خودکار", callback_data="settings:toggle:auto_ingest_enabled"),
            ],
            [
                InlineKeyboardButton(text="🚀 انتشار خودکار", callback_data="settings:toggle:publish_enabled"),
                InlineKeyboardButton(text="🔒 عضویت اجباری", callback_data="settings:toggle:membership_enabled"),
            ],
            [
                InlineKeyboardButton(text="🖼 کاور تامبنیل", callback_data="settings:toggle:use_media_thumbnail_as_cover"),
                InlineKeyboardButton(text="⏱ حذف خودکار", callback_data="settings:toggle:auto_delete_enabled"),
            ],
            [InlineKeyboardButton(text="🌍 منطقه زمانی", callback_data="settings:timezone")],
            [InlineKeyboardButton(text="🔗 قالب لینک", callback_data="settings:link_template")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def membership_text_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="✏️ ویرایش متن", callback_data="member:text:message")],
            [InlineKeyboardButton(text="✏️ ویرایش متن دکمه", callback_data="member:text:button")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:membership")],
        ]
    )


def admins_menu(admins: list[object], *, is_primary: bool) -> InlineKeyboardMarkup:
    rows = []
    for admin in admins:
        mark = "👑" if getattr(admin, "is_primary", False) else "👤"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{mark} {getattr(admin, 'title', None) or admin.telegram_id} | {admin.telegram_id}",
                    callback_data="noop",
                )
            ]
        )
        if is_primary and not getattr(admin, "is_primary", False):
            rows.append(
                [
                    InlineKeyboardButton(
                        text=f"🗑 حذف {admin.telegram_id}",
                        callback_data=f"admin:remove:{admin.telegram_id}",
                    )
                ]
            )
    if is_primary:
        rows.append([InlineKeyboardButton(text="➕ افزودن مدیر", callback_data="admin:add")])
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def users_menu(users: list[object]) -> InlineKeyboardMarkup:
    rows = []
    for user in users:
        blocked = getattr(user, "is_blocked", False)
        mark = "🚫" if blocked else "✅"
        rows.append(
            [
                InlineKeyboardButton(
                    text=f"{mark} {getattr(user, 'display_name', None) or user.telegram_id} | {user.telegram_id}",
                    callback_data=f"user:toggle:{user.telegram_id}",
                )
            ]
        )
    rows.append([InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)])
    return InlineKeyboardMarkup(inline_keyboard=rows)


def errors_menu() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="🔄 به‌روزرسانی", callback_data="errors:refresh")],
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data=BACK)],
        ]
    )


def membership_gate(
    channels: list[RequiredChannel], *, token: str, check_label: str
) -> InlineKeyboardMarkup:
    rows = []
    for channel in channels:
        rows.append(
            [InlineKeyboardButton(text=f"📣 {channel.title}", url=channel.invite_link)]
        )
    rows.append(
        [InlineKeyboardButton(text=check_label, callback_data=f"gate:check:{token}")]
    )
    return InlineKeyboardMarkup(inline_keyboard=rows)


def destinations_view(destinations: list[PostDestination]) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="⬅️ بازگشت", callback_data="menu:home")],
        ]
    )
