# keyboards/admin_kb.py

from __future__ import annotations

from typing import Final

from aiogram.types import (
    InlineKeyboardButton,
    InlineKeyboardMarkup,
)
from aiogram.utils.keyboard import (
    InlineKeyboardBuilder,
)

from core.ui_emojis import emoji_id


# ============================================================
# Telegram Glass Button Styles
# ============================================================

STYLE_PRIMARY: Final[str] = "primary"
STYLE_SUCCESS: Final[str] = "success"
STYLE_DANGER: Final[str] = "danger"

_ALLOWED_STYLES: Final[frozenset[str]] = frozenset(
    {
        STYLE_PRIMARY,
        STYLE_SUCCESS,
        STYLE_DANGER,
    }
)


# ============================================================
# Style Policy
# ============================================================
#
# success = تایید، فعال‌سازی، بروزرسانی مثبت، تکمیل
# danger  = رد، حذف، مسدودسازی، غیرفعال‌سازی، خروج، خطا
# primary = ورود به منو، مشاهده، جستجو، بازگشت، تنظیمات
#
# تمام دکمه‌ها باید علاوه بر style یک icon_custom_emoji_id
# Premium نیز داشته باشند.
#
# ============================================================

# ============================================================
# Shared Premium Custom Emoji IDs
# ============================================================

EMOJI_SUCCESS: Final[str] = emoji_id("success")
EMOJI_DANGER: Final[str] = emoji_id("error")
EMOJI_SETTINGS: Final[str] = emoji_id("sparkles")
EMOJI_MONEY: Final[str] = emoji_id("money")
EMOJI_USER: Final[str] = emoji_id("user")
EMOJI_PHONE: Final[str] = emoji_id("support")
EMOJI_BROADCAST: Final[str] = emoji_id("chat")
EMOJI_FILE: Final[str] = emoji_id("list")
EMOJI_UP: Final[str] = emoji_id("bolt")
EMOJI_DOWN: Final[str] = emoji_id("back")
EMOJI_WARNING: Final[str] = emoji_id("warning")
EMOJI_SERVER: Final[str] = emoji_id("loading")
EMOJI_ADMIN: Final[str] = emoji_id("users")
EMOJI_PACKAGE: Final[str] = emoji_id("package")
EMOJI_WALLET: Final[str] = emoji_id("wallet")
EMOJI_SHOP: Final[str] = emoji_id("shop")
EMOJI_PREMIUM: Final[str] = emoji_id("premium")
EMOJI_STARS: Final[str] = emoji_id("stars")
EMOJI_BACK: Final[str] = emoji_id("back")
EMOJI_HISTORY: Final[str] = emoji_id("history")


# ============================================================
# Internal Helpers
# ============================================================

def _validate_callback_data(
    callback_data: str,
) -> str:
    callback_data = str(
        callback_data
    ).strip()

    if not callback_data:
        raise ValueError(
            "callback_data cannot be empty."
        )

    if len(
        callback_data.encode("utf-8")
    ) > 64:
        raise ValueError(
            "callback_data exceeds Telegram 64-byte limit."
        )

    return callback_data


def _validate_id(
    value,
    *,
    name: str = "id",
) -> int:
    try:
        value = int(value)
    except (
        TypeError,
        ValueError,
    ) as exc:
        raise ValueError(
            f"{name} must be an integer."
        ) from exc

    if value <= 0:
        raise ValueError(
            f"{name} must be greater than zero."
        )

    return value


def _button(
    text: str,
    callback_data: str,
    style: str = STYLE_PRIMARY,
    icon: str | None = None,
) -> InlineKeyboardButton:
    """
    Factory مرکزی تمام دکمه‌های پنل ادمین.

    تمام callback buttonهای این فایل:
        - style دارند
        - Premium Custom Emoji دارند
        - callback_data آن‌ها validate می‌شود
    """
    if style not in _ALLOWED_STYLES:
        raise ValueError(
            f"Invalid button style: {style!r}"
        )

    callback_data = _validate_callback_data(
        callback_data
    )

    # هیچ دکمه‌ای بدون استایل یا آیکن Premium ساخته نمی‌شود.
    if not icon:
        if style == STYLE_SUCCESS:
            icon = EMOJI_SUCCESS
        elif style == STYLE_DANGER:
            icon = EMOJI_DANGER
        else:
            icon = EMOJI_SETTINGS

    return InlineKeyboardButton(
        text=str(text),
        callback_data=callback_data,
        style=style,
        icon_custom_emoji_id=icon,
    )


def _url_button(
    text: str,
    url: str,
    *,
    style: str = STYLE_PRIMARY,
    icon: str | None = None,
) -> InlineKeyboardButton:
    """
    دکمه لینک خارجی با همان سیستم استایل و Premium Emoji.
    """
    url = str(url).strip()

    if not url:
        raise ValueError(
            "url cannot be empty."
        )

    if style not in _ALLOWED_STYLES:
        raise ValueError(
            f"Invalid button style: {style!r}"
        )

    if not icon:
        if style == STYLE_SUCCESS:
            icon = EMOJI_SUCCESS
        elif style == STYLE_DANGER:
            icon = EMOJI_DANGER
        else:
            icon = EMOJI_SETTINGS

    return InlineKeyboardButton(
        text=str(text),
        url=url,
        style=style,
        icon_custom_emoji_id=icon,
    )


def _primary(
    text: str,
    callback_data: str,
    icon: str | None = EMOJI_SETTINGS,
) -> InlineKeyboardButton:
    return _button(
        text=text,
        callback_data=callback_data,
        style=STYLE_PRIMARY,
        icon=icon,
    )


def _success(
    text: str,
    callback_data: str,
    icon: str | None = EMOJI_SUCCESS,
) -> InlineKeyboardButton:
    return _button(
        text=text,
        callback_data=callback_data,
        style=STYLE_SUCCESS,
        icon=icon,
    )


def _danger(
    text: str,
    callback_data: str,
    icon: str | None = EMOJI_DANGER,
) -> InlineKeyboardButton:
    return _button(
        text=text,
        callback_data=callback_data,
        style=STYLE_DANGER,
        icon=icon,
    )


def _back(
    callback_data: str = "admin_main",
    text: str = "بازگشت",
) -> InlineKeyboardButton:
    return _primary(
        text=text,
        callback_data=callback_data,
        icon=EMOJI_BACK,
    )


# ============================================================
# Main Admin Menu
# ============================================================

def get_admin_main_menu() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    # Owner approval has priority in this project.
    builder.row(
        _success(
            "درخواست‌های خرید منتظر تایید",
            "admin_orders_pending_owner",
            EMOJI_PACKAGE,
        )
    )

    builder.row(
        _danger(
            "سفارش‌های نیازمند بررسی دستی",
            "admin_orders_provider_unknown",
            EMOJI_WARNING,
        )
    )

    builder.row(
        _success(
            "بررسی احراز هویت‌های جدید",
            "admin_kyc_queue",
            EMOJI_SUCCESS,
        )
    )

    builder.row(
        _primary(
            "آمار و گزارشات مالی",
            "admin_stats",
            EMOJI_HISTORY,
        ),
        _primary(
            "تنظیم نرخ ارز و قیمت‌ها",
            "admin_pricing",
            EMOJI_MONEY,
        ),
    )

    builder.row(
        _primary(
            "مدیریت سفارش‌ها",
            "admin_orders_manage",
            EMOJI_PACKAGE,
        ),
        _primary(
            "جستجوی کاربر",
            "admin_search_user",
            EMOJI_USER,
        ),
    )

    builder.row(
        _primary(
            "ارسال پیام همگانی",
            "admin_broadcast",
            EMOJI_BROADCAST,
        ),
        _primary(
            "تنظیمات پیشرفته ربات",
            "admin_bot_settings",
            EMOJI_SETTINGS,
        ),
    )

    builder.row(
        _primary(
            "وضعیت سرور و سرویس‌ها",
            "admin_server_status",
            EMOJI_SERVER,
        ),
        _primary(
            "مدیریت لاگ‌ها و خطاها",
            "admin_logs_view",
            EMOJI_FILE,
        ),
    )

    builder.row(
        _primary(
            "افزایش / کاهش موجودی",
            "admin_wallet_adjust",
            EMOJI_MONEY,
        ),
        _success(
            "فیش‌های واریزی معلق",
            "admin_pending_receipts",
            EMOJI_FILE,
        ),
    )

    builder.row(
        _danger(
            "خروج از پنل مدیریت",
            "main_menu",
            EMOJI_DANGER,
        )
    )

    return builder.as_markup()


# ============================================================
# Owner Approval / MarketApp Order Keyboards
# ============================================================

def get_owner_order_keyboard(
    order_id: int,
) -> InlineKeyboardMarkup:
    """
    کیبورد اصلی سفارشی که باید مالک تایید یا رد کند.

    callbackها دقیقاً با handlers/user/shop.py جدید هماهنگ‌اند.
    """
    order_id = _validate_id(
        order_id,
        name="order_id",
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "تایید و آماده‌سازی تحویل",
            f"owner_approve_order_{order_id}",
            EMOJI_SUCCESS,
        )
    )

    builder.row(
        _danger(
            "رد درخواست خرید",
            f"owner_reject_order_{order_id}",
            EMOJI_DANGER,
        )
    )

    builder.row(
        _primary(
            "مشاهده جزئیات سفارش",
            f"admin_order_view_{order_id}",
            EMOJI_FILE,
        )
    )

    return builder.as_markup()


def get_provider_unknown_order_keyboard(
    order_id: int,
) -> InlineKeyboardMarkup:
    """
    سفارش‌هایی که درخواست MarketApp احتمالاً ارسال شده
    ولی نتیجه قطعی دریافت نشده است.

    عمداً دکمه «خرید دوباره» ندارد.
    """
    order_id = _validate_id(
        order_id,
        name="order_id",
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _danger(
            "بررسی دستی وضعیت سفارش",
            f"admin_order_reconcile_{order_id}",
            EMOJI_WARNING,
        )
    )

    builder.row(
        _primary(
            "مشاهده جزئیات سفارش",
            f"admin_order_view_{order_id}",
            EMOJI_FILE,
        ),
        _primary(
            "پیام به خریدار",
            f"admin_order_message_{order_id}",
            EMOJI_BROADCAST,
        ),
    )

    builder.row(
        _back(
            "admin_orders_provider_unknown",
            "بازگشت به سفارش‌های نامشخص",
        )
    )

    return builder.as_markup()


# ============================================================
# KYC Review
# ============================================================

def get_admin_kyc_review_keyboard(
    user_id: int,
) -> InlineKeyboardMarkup:
    user_id = _validate_id(
        user_id,
        name="user_id",
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "تایید احراز هویت",
            f"kyc_approve_{user_id}",
            EMOJI_SUCCESS,
        ),
        _danger(
            "رد مدارک",
            f"kyc_reject_{user_id}",
            EMOJI_DANGER,
        ),
    )

    builder.row(
        _primary(
            "ارسال اخطار به کاربر",
            f"kyc_warn_{user_id}",
            EMOJI_WARNING,
        )
    )

    builder.row(
        _back(
            "admin_kyc_queue",
            "بازگشت به لیست انتظار",
        )
    )

    return builder.as_markup()


# ============================================================
# Pricing
# ============================================================

def get_admin_pricing_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "قیمت‌های Premium (USDT)",
            "admin_product_prices_premium",
            EMOJI_PREMIUM,
        )
    )

    builder.row(
        _primary(
            "قیمت‌های Stars (USDT)",
            "admin_product_prices_stars",
            EMOJI_STARS,
        )
    )

    builder.row(
        _primary(
            "نرخ دستی USDT",
            "set_rate_usdt",
            EMOJI_MONEY,
        ),
        _primary(
            "نرخ دستی TON/GRAM",
            "set_rate_ton",
            EMOJI_UP,
        ),
    )

    builder.row(
        _success(
            "بروزرسانی خودکار نرخ بازار",
            "auto_sync_rates",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت به منوی مدیریت",
        )
    )

    return builder.as_markup()


# ============================================================
# Bot Settings
# ============================================================

def get_admin_bot_settings_keyboard(
    is_maintenance: bool = False,
    auto_backup: bool = True,
) -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    if bool(
        is_maintenance
    ):
        builder.row(
            _success(
                "خاموش کردن حالت تعمیرات",
                "admin_toggle_maint_off",
                EMOJI_SUCCESS,
            )
        )
    else:
        builder.row(
            _danger(
                "فعال‌سازی حالت تعمیرات",
                "admin_toggle_maint_on",
                EMOJI_WARNING,
            )
        )

    if bool(
        auto_backup
    ):
        backup_button = _danger(
            "غیرفعال‌سازی بکاپ خودکار",
            "admin_toggle_backup_off",
            EMOJI_DANGER,
        )
    else:
        backup_button = _success(
            "فعال‌سازی بکاپ خودکار",
            "admin_toggle_backup_on",
            EMOJI_SUCCESS,
        )

    builder.row(
        backup_button,
        _success(
            "تهیه پشتیبان دستی",
            "admin_force_backup",
            EMOJI_FILE,
        ),
    )

    builder.row(
        _primary(
            "مدیریت کارت‌ها و درگاه‌ها",
            "admin_manage_cards",
            EMOJI_WALLET,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت به منوی مدیریت",
        )
    )

    return builder.as_markup()


# ============================================================
# User Management
# ============================================================

def get_admin_user_manage_keyboard(
    user_id: int,
    is_blocked: bool = False,
    is_admin: bool = False,
) -> InlineKeyboardMarkup:
    user_id = _validate_id(
        user_id,
        name="user_id",
    )

    builder = InlineKeyboardBuilder()

    if bool(
        is_blocked
    ):
        block_button = _success(
            "رفع مسدودی کاربر",
            f"admin_unblock_{user_id}",
            EMOJI_SUCCESS,
        )
    else:
        block_button = _danger(
            "مسدود کردن کاربر",
            f"admin_block_{user_id}",
            EMOJI_DANGER,
        )

    builder.row(
        block_button,
        _primary(
            "ویرایش موجودی ولت",
            f"admin_edit_wallet_{user_id}",
            EMOJI_MONEY,
        ),
    )

    if bool(
        is_admin
    ):
        admin_button = _danger(
            "عزل از ادمینی",
            f"admin_demote_{user_id}",
            EMOJI_ADMIN,
        )
    else:
        admin_button = _success(
            "ارتقا به ادمین",
            f"admin_promote_{user_id}",
            EMOJI_ADMIN,
        )

    builder.row(
        admin_button,
        _primary(
            "تاریخچه تراکنش‌ها",
            f"admin_user_history_{user_id}",
            EMOJI_HISTORY,
        ),
    )

    builder.row(
        _primary(
            "ارسال پیام مستقیم",
            f"admin_send_msg_{user_id}",
            EMOJI_BROADCAST,
        )
    )

    builder.row(
        _back(
            "admin_search_user",
            "بازگشت به جستجو",
        )
    )

    return builder.as_markup()


# ============================================================
# Receipt Review
# ============================================================

def get_admin_receipt_review_keyboard(
    tx_id: str,
    user_id: int,
) -> InlineKeyboardMarkup:
    user_id = _validate_id(
        user_id,
        name="user_id",
    )

    tx_id = str(
        tx_id
    ).strip()

    if not tx_id:
        raise ValueError(
            "tx_id cannot be empty."
        )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "تایید و واریز به حساب",
            f"admin_accept_receipt_{tx_id}_{user_id}",
            EMOJI_SUCCESS,
        ),
        _danger(
            "رد فیش / تراکنش",
            f"admin_reject_receipt_{tx_id}_{user_id}",
            EMOJI_DANGER,
        ),
    )

    builder.row(
        _primary(
            "درخواست ارسال مجدد رسید",
            f"admin_ask_receipt_{user_id}",
            EMOJI_PHONE,
        )
    )

    builder.row(
        _back(
            "admin_pending_receipts",
            "بازگشت به تراکنش‌های معلق",
        )
    )

    return builder.as_markup()


# ============================================================
# Broadcast
# ============================================================

def get_admin_broadcast_options_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "ارسال به همه کاربران",
            "broadcast_all",
            EMOJI_BROADCAST,
        )
    )

    builder.row(
        _success(
            "فقط کاربران احراز شده",
            "broadcast_kyc_passed",
            EMOJI_SUCCESS,
        ),
        _success(
            "فقط کاربران دارای موجودی",
            "broadcast_positive_balance",
            EMOJI_MONEY,
        ),
    )

    builder.row(
        _danger(
            "بازگشت به منوی مدیریت",
            "admin_main",
            EMOJI_BACK,
        )
    )

    return builder.as_markup()


# ============================================================
# Confirm Sensitive Action
# ============================================================

def get_admin_confirm_action_keyboard(
    action_tag: str,
) -> InlineKeyboardMarkup:
    action_tag = str(
        action_tag
    ).strip()

    if not action_tag:
        raise ValueError(
            "action_tag cannot be empty."
        )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "بله، مطمئن هستم",
            f"admin_confirm_yes_{action_tag}",
            EMOJI_SUCCESS,
        )
    )

    builder.row(
        _danger(
            "انصراف و بازگشت",
            "admin_main",
            EMOJI_DANGER,
        )
    )

    return builder.as_markup()


# ============================================================
# Pagination
# ============================================================

def get_admin_pagination_keyboard(
    current_page: int,
    total_pages: int,
    action_prefix: str,
) -> InlineKeyboardMarkup:
    total_pages = max(
        1,
        int(total_pages),
    )

    current_page = max(
        1,
        int(current_page),
    )

    current_page = min(
        current_page,
        total_pages,
    )

    action_prefix = str(
        action_prefix
    ).strip()

    if not action_prefix:
        raise ValueError(
            "action_prefix cannot be empty."
        )

    builder = InlineKeyboardBuilder()
    navigation_buttons = []

    if current_page > 1:
        navigation_buttons.append(
            _primary(
                "قبلی",
                (
                    f"{action_prefix}_page_"
                    f"{current_page - 1}"
                ),
                EMOJI_UP,
            )
        )

    navigation_buttons.append(
        _primary(
            (
                f"صفحه {current_page} "
                f"از {total_pages}"
            ),
            "noop",
            EMOJI_SETTINGS,
        )
    )

    if current_page < total_pages:
        navigation_buttons.append(
            _primary(
                "بعدی",
                (
                    f"{action_prefix}_page_"
                    f"{current_page + 1}"
                ),
                EMOJI_DOWN,
            )
        )

    builder.row(
        *navigation_buttons
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت به منوی مدیریت",
        )
    )

    return builder.as_markup()


# ============================================================
# Search User Result
# ============================================================

def get_admin_user_search_result_keyboard(
    user_id: int,
) -> InlineKeyboardMarkup:
    user_id = _validate_id(
        user_id,
        name="user_id",
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "مشاهده پروفایل کاربر",
            f"admin_user_view_{user_id}",
            EMOJI_USER,
        )
    )

    builder.row(
        _primary(
            "ویرایش موجودی",
            f"admin_edit_wallet_{user_id}",
            EMOJI_MONEY,
        ),
        _primary(
            "تاریخچه تراکنش‌ها",
            f"admin_user_history_{user_id}",
            EMOJI_HISTORY,
        ),
    )

    builder.row(
        _primary(
            "ارسال پیام",
            f"admin_send_msg_{user_id}",
            EMOJI_BROADCAST,
        )
    )

    builder.row(
        _back(
            "admin_search_user",
            "بازگشت به جستجو",
        )
    )

    return builder.as_markup()


# ============================================================
# Payment / Card Management
# ============================================================

def get_admin_payment_methods_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "مدیریت کارت‌های بانکی",
            "admin_cards",
            EMOJI_MONEY,
        ),
        _primary(
            "مدیریت درگاه‌ها",
            "admin_gateways",
            EMOJI_SETTINGS,
        ),
    )

    builder.row(
        _success(
            "فعال‌سازی روش پرداخت",
            "admin_payment_enable",
            EMOJI_SUCCESS,
        ),
        _danger(
            "غیرفعال‌سازی روش پرداخت",
            "admin_payment_disable",
            EMOJI_DANGER,
        ),
    )

    builder.row(
        _back(
            "admin_bot_settings",
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Wallet Adjustment
# ============================================================

def get_admin_wallet_adjust_keyboard(
    user_id: int,
) -> InlineKeyboardMarkup:
    user_id = _validate_id(
        user_id,
        name="user_id",
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "افزایش موجودی",
            f"admin_wallet_add_{user_id}",
            EMOJI_MONEY,
        ),
        _danger(
            "کاهش موجودی",
            f"admin_wallet_remove_{user_id}",
            EMOJI_MONEY,
        ),
    )

    builder.row(
        _primary(
            "مشاهده موجودی",
            f"admin_wallet_view_{user_id}",
            EMOJI_WALLET,
        )
    )

    builder.row(
        _primary(
            "تاریخچه تغییرات موجودی",
            f"admin_wallet_history_{user_id}",
            EMOJI_HISTORY,
        )
    )

    builder.row(
        _back(
            f"admin_user_view_{user_id}",
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Statistics
# ============================================================

def get_admin_stats_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "آمار کاربران",
            "admin_stats_users",
            EMOJI_USER,
        ),
        _primary(
            "آمار سفارش‌ها",
            "admin_stats_orders",
            EMOJI_PACKAGE,
        ),
    )

    builder.row(
        _primary(
            "گزارش مالی",
            "admin_stats_finance",
            EMOJI_MONEY,
        ),
        _primary(
            "گزارش تراکنش‌ها",
            "admin_stats_transactions",
            EMOJI_HISTORY,
        ),
    )

    builder.row(
        _success(
            "گزارش فروش روزانه",
            "admin_stats_daily",
            EMOJI_SUCCESS,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت به منوی مدیریت",
        )
    )

    return builder.as_markup()


# ============================================================
# Server Status
# ============================================================

def get_admin_server_status_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "بروزرسانی وضعیت",
            "admin_server_status",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _primary(
            "بررسی دیتابیس",
            "admin_check_database",
            EMOJI_FILE,
        ),
        _primary(
            "بررسی APIها",
            "admin_check_apis",
            EMOJI_SERVER,
        ),
    )

    builder.row(
        _primary(
            "بررسی کیف پول‌ها",
            "admin_check_wallets",
            EMOJI_WALLET,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Logs
# ============================================================

def get_admin_logs_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "مشاهده لاگ‌های اخیر",
            "admin_logs_recent",
            EMOJI_FILE,
        )
    )

    builder.row(
        _danger(
            "خطاهای اخیر",
            "admin_logs_errors",
            EMOJI_WARNING,
        ),
        _primary(
            "لاگ امنیتی",
            "admin_logs_security",
            EMOJI_SETTINGS,
        ),
    )

    builder.row(
        _danger(
            "پاکسازی لاگ‌ها",
            "admin_logs_clear",
            EMOJI_DANGER,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Order Management
# ============================================================

def get_admin_orders_keyboard() -> InlineKeyboardMarkup:
    """
    منوی سفارش‌ها با اولویت Owner Approval و MarketApp.
    """
    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "در انتظار تایید مالک",
            "admin_orders_pending_owner",
            EMOJI_PACKAGE,
        )
    )

    builder.row(
        _danger(
            "نیازمند بررسی دستی",
            "admin_orders_provider_unknown",
            EMOJI_WARNING,
        )
    )

    builder.row(
        _primary(
            "همه سفارش‌ها",
            "admin_orders_all",
            EMOJI_FILE,
        ),
        _primary(
            "سفارش‌های جدید",
            "admin_orders_new",
            EMOJI_PACKAGE,
        ),
    )

    builder.row(
        _primary(
            "در حال پردازش",
            "admin_orders_processing",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _success(
            "تکمیل‌شده",
            "admin_orders_completed",
            EMOJI_SUCCESS,
        ),
        _danger(
            "رد / لغو شده",
            "admin_orders_cancelled",
            EMOJI_DANGER,
        ),
    )

    builder.row(
        _primary(
            "جستجوی سفارش",
            "admin_order_search",
            EMOJI_PHONE,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت",
        )
    )

    return builder.as_markup()


def get_admin_order_actions_keyboard(
    order_id: str | int,
    status: str | None = None,
) -> InlineKeyboardMarkup:
    """
    عملیات روی یک سفارش.

    اگر status داده نشود، برای سازگاری با کدهای قبلی
    سفارش را pending_owner_approval در نظر می‌گیرد و
    دکمه تایید/رد مالک نمایش می‌دهد.
    """
    order_id = _validate_id(
        order_id,
        name="order_id",
    )

    status = (
        str(status)
        .strip()
        .lower()
        if status is not None
        else "pending_owner_approval"
    )

    builder = InlineKeyboardBuilder()

    if status == "pending_owner_approval":
        builder.row(
            _success(
                "تایید و آماده‌سازی تحویل",
                f"owner_approve_order_{order_id}",
                EMOJI_SUCCESS,
            )
        )

        builder.row(
            _danger(
                "رد درخواست",
                f"owner_reject_order_{order_id}",
                EMOJI_DANGER,
            )
        )

    elif status == "provider_status_unknown":
        builder.row(
            _danger(
                "بررسی دستی سفارش",
                f"admin_order_reconcile_{order_id}",
                EMOJI_WARNING,
            )
        )

    elif status in {
        "price_changed",
        "insufficient_balance",
        "rejected_by_owner",
        "failed_refunded",
        "failed_refund_required",
        "cancelled",
    }:
        # وضعیت‌های بسته یا متوقف شده:
        # هیچ دکمه خرید دوباره از اینجا نمی‌دهیم.
        builder.row(
            _primary(
                "مشاهده وضعیت",
                f"admin_order_view_{order_id}",
                EMOJI_FILE,
            )
        )

    elif status == "completed":
        builder.row(
            _success(
                "سفارش تکمیل شده",
                f"admin_order_view_{order_id}",
                EMOJI_SUCCESS,
            )
        )

    else:
        builder.row(
            _primary(
                "مشاهده جزئیات",
                f"admin_order_view_{order_id}",
                EMOJI_FILE,
            )
        )

    # Common actions
    builder.row(
        _primary(
            "جزئیات کامل",
            f"admin_order_view_{order_id}",
            EMOJI_FILE,
        ),
        _primary(
            "پیام به خریدار",
            f"admin_order_message_{order_id}",
            EMOJI_BROADCAST,
        ),
    )

    builder.row(
        _back(
            "admin_orders_manage",
            "بازگشت به سفارش‌ها",
        )
    )

    return builder.as_markup()


# ============================================================
# Pending Receipts
# ============================================================

def get_admin_pending_receipts_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "بروزرسانی لیست",
            "admin_pending_receipts",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _primary(
            "فیش‌های جدید",
            "admin_receipts_new",
            EMOJI_FILE,
        ),
        _primary(
            "در انتظار بررسی",
            "admin_receipts_pending",
            EMOJI_WARNING,
        ),
    )

    builder.row(
        _success(
            "فیش‌های تاییدشده",
            "admin_receipts_approved",
            EMOJI_SUCCESS,
        ),
        _danger(
            "فیش‌های ردشده",
            "admin_receipts_rejected",
            EMOJI_DANGER,
        ),
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Generic Yes / No
# ============================================================

def get_admin_yes_no_keyboard(
    yes_callback: str,
    no_callback: str,
) -> InlineKeyboardMarkup:
    yes_callback = _validate_callback_data(
        yes_callback
    )
    no_callback = _validate_callback_data(
        no_callback
    )

    builder = InlineKeyboardBuilder()

    builder.row(
        _success(
            "بله",
            yes_callback,
            EMOJI_SUCCESS,
        ),
        _danger(
            "خیر",
            no_callback,
            EMOJI_DANGER,
        ),
    )

    return builder.as_markup()


# ============================================================
# Generic Back
# ============================================================

def get_admin_back_keyboard(
    callback_data: str = "admin_main",
) -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _back(
            callback_data,
            "بازگشت",
        )
    )

    return builder.as_markup()


# ============================================================
# Generic Cancel
# ============================================================

def get_admin_cancel_keyboard(
    callback_data: str = "admin_main",
) -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _danger(
            "انصراف",
            callback_data,
            EMOJI_DANGER,
        )
    )

    return builder.as_markup()


# ============================================================
# Back + Cancel
# ============================================================

def get_admin_back_cancel_keyboard(
    back_callback: str = "admin_main",
    cancel_callback: str = "admin_main",
) -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _back(
            back_callback,
            "بازگشت",
        ),
        _danger(
            "انصراف",
            cancel_callback,
            EMOJI_DANGER,
        ),
    )

    return builder.as_markup()


# ============================================================
# Admin Home
# ============================================================

def get_admin_home_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _primary(
            "منوی مدیریت",
            "admin_main",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _danger(
            "خروج از پنل",
            "main_menu",
            EMOJI_DANGER,
        )
    )

    return builder.as_markup()


# ============================================================
# Security
# ============================================================

def get_admin_security_keyboard() -> InlineKeyboardMarkup:
    builder = InlineKeyboardBuilder()

    builder.row(
        _danger(
            "کاربران مسدودشده",
            "admin_blocked_users",
            EMOJI_DANGER,
        )
    )

    builder.row(
        _primary(
            "لاگ‌های امنیتی",
            "admin_logs_security",
            EMOJI_SETTINGS,
        )
    )

    builder.row(
        _primary(
            "مدیریت ادمین‌ها",
            "admin_manage_admins",
            EMOJI_ADMIN,
        )
    )

    builder.row(
        _back(
            "admin_main",
            "بازگشت",
        )
    )

    return builder.as_markup()
