"""
bot/handlers/admin/plans.py
----------------------------
پنل مدیریت اصلی + مدیریت تعرفه‌ها برای ادمین.
"""

from __future__ import annotations

from aiogram import Router
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.types import (
    CallbackQuery,
    InlineKeyboardButton,
    InlineKeyboardMarkup,
    Message,
)
from sqlalchemy.ext.asyncio import AsyncSession

import config
from bot.states.states import AdminPlanStates
from database import crud


router = Router(name="admin_plans")


# =========================================================
# ADMIN CHECK
# =========================================================

def is_admin_user(user_id: int) -> bool:
    return config.is_admin(user_id)


# =========================================================
# MAIN ADMIN PANEL
# =========================================================

def admin_menu_keyboard() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="👥 مدیریت کاربران",
                    callback_data="admin_users",
                ),
                InlineKeyboardButton(
                    text="💰 مدیریت تعرفه‌ها",
                    callback_data="admin_plans",
                ),
            ],
            [
                InlineKeyboardButton(
                    text="🎫 مدیریت پشتیبانی",
                    callback_data="admin_support",
                ),
            ],
            [
                InlineKeyboardButton(
                    text="🧪 مدیریت اکانت تست",
                    callback_data="admin_test_menu",
                ),
            ],
        ]
    )


def admin_panel_text() -> str:
    return (
        "⚙️ <b>پنل مدیریت واسل</b>\n\n"
        "از این بخش می‌تونی قسمت‌های مختلف ربات رو مدیریت کنی.\n\n"
        "👥 مدیریت کاربران\n"
        "💰 مدیریت تعرفه‌ها\n"
        "🎫 مدیریت پشتیبانی\n"
        "🧪 مدیریت اکانت تست"
    )


# =========================================================
# /admin
# =========================================================

@router.message(Command("admin"))
async def admin_command(
    message: Message,
    state: FSMContext,
):
    if not is_admin_user(message.from_user.id):
        await message.answer(
            "⛔ شما دسترسی به پنل مدیریت ندارید."
        )
        return

    await state.clear()

    await message.answer(
        admin_panel_text(),
        reply_markup=admin_menu_keyboard(),
    )


# =========================================================
# BACK TO ADMIN PANEL
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_panel"
)
async def admin_panel(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    await callback.message.edit_text(
        admin_panel_text(),
        reply_markup=admin_menu_keyboard(),
    )

    await callback.answer()


# =========================================================
# TEST ACCOUNT MENU
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_test_menu"
)
async def admin_test_menu(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    await callback.message.edit_text(
        "🧪 <b>مدیریت اکانت تست</b>\n\n"
        "عملیات موردنظر را انتخاب کن:",
        reply_markup=InlineKeyboardMarkup(
            inline_keyboard=[
                [
                    InlineKeyboardButton(
                        text="➕ افزودن کانفیگ تست",
                        callback_data="admin_test_add",
                    )
                ],
                [
                    InlineKeyboardButton(
                        text="📦 موجودی کانفیگ تست",
                        callback_data="admin_test_stock",
                    )
                ],
                [
                    InlineKeyboardButton(
                        text="🔙 پنل مدیریت",
                        callback_data="admin_panel",
                    )
                ],
            ]
        ),
    )

    await callback.answer()


# =========================================================
# TEST CONFIG - ADD
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_test_add"
)
async def admin_test_add(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    # همان روند واقعی config.py
    # با قرار دادن State مربوط به دریافت کانفیگ تست
    from bot.states.states import AdminTestConfigStates

    await state.update_data(
        test_config_count=0
    )

    await state.set_state(
        AdminTestConfigStates.WAITING_FOR_TEST_CONFIG
    )

    # گرفتن موجودی فعلی
    from database.database import get_session

    async with get_session() as session:
        available_count = (
            await crud.get_available_test_config_count(
                session
            )
        )

    await callback.message.edit_text(
        "🧪 <b>افزودن کانفیگ تست</b>\n\n"
        f"📦 موجودی فعلی: <b>{available_count}</b> کانفیگ\n\n"
        "حالا کانفیگ‌های تست را یکی‌یکی ارسال کن.\n\n"
        "بعد از هر کانفیگ، کانفیگ بعدی را بفرست.\n"
        "وقتی تمام شد، دکمه «همینقدر خوبه» را بزن."
    )

    await callback.answer()


# =========================================================
# TEST STOCK
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_test_stock"
)
async def admin_test_stock(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    from database.database import get_session

    async with get_session() as session:

        available_count = (
            await crud.get_available_test_config_count(
                session
            )
        )

        all_configs = (
            await crud.list_test_configs(
                session
            )
        )

    used_count = (
        len(all_configs)
        - available_count
    )

    await callback.message.edit_text(
        "📦 <b>موجودی اکانت تست</b>\n\n"
        f"🟢 قابل استفاده: <b>{available_count}</b>\n"
        f"🔴 مصرف‌شده: <b>{used_count}</b>\n"
        f"📊 کل ثبت‌شده: <b>{len(all_configs)}</b>\n\n"
        "برای مشاهده و حذف کانفیگ‌های آزاد، "
        "گزینه زیر را بزن.",
        reply_markup=InlineKeyboardMarkup(
            inline_keyboard=[
                [
                    InlineKeyboardButton(
                        text="🧪 مشاهده کانفیگ‌های آزاد",
                        callback_data="admin_test_config_list",
                    )
                ],
                [
                    InlineKeyboardButton(
                        text="🔙 پنل مدیریت",
                        callback_data="admin_panel",
                    )
                ],
            ]
        ),
    )

    await callback.answer()


# =========================================================
# TEST CONFIG LIST
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_test_config_list"
)
async def admin_test_config_list(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    from database.database import get_session

    async with get_session() as session:

        all_configs = (
            await crud.list_test_configs(
                session
            )
        )

        configs = [
            item
            for item in all_configs
            if not item.used
        ]

    if not configs:

        await callback.message.edit_text(
            "🧪 <b>کانفیگ‌های آزاد تست</b>\n\n"
            "❌ در حال حاضر هیچ کانفیگ آزادی وجود ندارد.",
            reply_markup=InlineKeyboardMarkup(
                inline_keyboard=[
                    [
                        InlineKeyboardButton(
                            text="🔙 مدیریت اکانت تست",
                            callback_data="admin_test_menu",
                        )
                    ],
                    [
                        InlineKeyboardButton(
                            text="🏠 پنل مدیریت",
                            callback_data="admin_panel",
                        )
                    ],
                ]
            ),
        )

        await callback.answer()
        return

    buttons = []

    for test_config in configs:

        buttons.append(
            [
                InlineKeyboardButton(
                    text=f"🗑 حذف کانفیگ #{test_config.id}",
                    callback_data=(
                        f"admin_test_config_delete:"
                        f"{test_config.id}"
                    ),
                )
            ]
        )

    buttons.append(
        [
            InlineKeyboardButton(
                text="🔄 بروزرسانی",
                callback_data="admin_test_config_list",
            )
        ]
    )

    buttons.append(
        [
            InlineKeyboardButton(
                text="🔙 مدیریت اکانت تست",
                callback_data="admin_test_menu",
            )
        ]
    )

    await callback.message.edit_text(
        "🧪 <b>کانفیگ‌های آزاد تست</b>\n\n"
        f"📦 تعداد کانفیگ آزاد: <b>{len(configs)}</b>\n\n"
        "برای حذف هر کانفیگ روی دکمه آن بزن.",
        reply_markup=InlineKeyboardMarkup(
            inline_keyboard=buttons
        ),
    )

    await callback.answer()


# =========================================================
# TEST CONFIG DELETE
# =========================================================

@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith(
            "admin_test_config_delete:"
        )
    )
)
async def admin_test_config_delete(
    callback: CallbackQuery,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    try:
        config_id = int(
            callback.data.split(":", 1)[1]
        )
    except (ValueError, IndexError):
        await callback.answer(
            "❌ شناسه کانفیگ نامعتبر است.",
            show_alert=True,
        )
        return

    from database.database import get_session

    async with get_session() as session:

        all_configs = (
            await crud.list_test_configs(
                session
            )
        )

        selected_config = next(
            (
                item
                for item in all_configs
                if item.id == config_id
                and not item.used
            ),
            None,
        )

    if not selected_config:
        await callback.answer(
            "❌ این کانفیگ وجود ندارد یا قبلاً مصرف شده است.",
            show_alert=True,
        )
        return

    from html import escape

    preview = escape(
        str(
            selected_config.config_text
        )
    )

    if len(preview) > 700:
        preview = (
            preview[:700]
            + "\n..."
        )

    await callback.message.edit_text(
        "⚠️ <b>حذف کانفیگ تست</b>\n\n"
        f"🆔 شناسه: <code>{config_id}</code>\n\n"
        "آیا مطمئنی که می‌خواهی این کانفیگ حذف شود؟\n\n"
        "🔐 <b>پیش‌نمایش:</b>\n"
        f"<pre>{preview}</pre>\n\n"
        "⚠️ این عملیات قابل برگشت نیست.",
        reply_markup=InlineKeyboardMarkup(
            inline_keyboard=[
                [
                    InlineKeyboardButton(
                        text="🗑 بله، حذف شود",
                        callback_data=(
                            f"admin_test_config_delete_confirm:"
                            f"{config_id}"
                        ),
                    ),
                    InlineKeyboardButton(
                        text="❌ لغو",
                        callback_data=(
                            "admin_test_config_list"
                        ),
                    ),
                ],
                [
                    InlineKeyboardButton(
                        text="🔙 برگشت",
                        callback_data="admin_test_menu",
                    )
                ],
            ]
        ),
    )

    await callback.answer()


# =========================================================
# TEST CONFIG DELETE CONFIRM
# =========================================================

@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith(
            "admin_test_config_delete_confirm:"
        )
    )
)
async def admin_test_config_delete_confirm(
    callback: CallbackQuery,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    try:
        config_id = int(
            callback.data.split(":", 1)[1]
        )
    except (ValueError, IndexError):
        await callback.answer(
            "❌ شناسه کانفیگ نامعتبر است.",
            show_alert=True,
        )
        return

    from database.database import get_session

    async with get_session() as session:

        deleted = (
            await crud.delete_available_test_config(
                session=session,
                test_config_id=config_id,
            )
        )

    if not deleted:
        await callback.answer(
            "❌ این کانفیگ وجود ندارد یا قبلاً مصرف شده است.",
            show_alert=True,
        )
        return

    await callback.answer(
        "✅ کانفیگ حذف شد."
    )

    # نمایش دوباره لیست
    await admin_test_config_list(
        callback
    )


# =========================================================
# PLANS MAIN MENU
# =========================================================

def plans_admin_keyboard() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="➕ افزودن تعرفه",
                    callback_data="admin_plan_add",
                )
            ],
            [
                InlineKeyboardButton(
                    text="📋 لیست تعرفه‌ها",
                    callback_data="admin_plan_list",
                )
            ],
            [
                InlineKeyboardButton(
                    text="🔙 پنل مدیریت",
                    callback_data="admin_panel",
                )
            ],
        ]
    )


def category_keyboard() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="🟢 اقتصادی",
                    callback_data="admin_add:economic",
                )
            ],
            [
                InlineKeyboardButton(
                    text="🟣 ویژه",
                    callback_data="admin_add:special",
                )
            ],
            [
                InlineKeyboardButton(
                    text="🔙 بازگشت",
                    callback_data="admin_plans",
                )
            ],
        ]
    )


def plan_management_keyboard(
    plan_id: int,
    is_active: bool,
) -> InlineKeyboardMarkup:

    active_text = (
        "🔴 غیرفعال کردن"
        if is_active
        else "🟢 فعال کردن"
    )

    return InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="✏️ ویرایش",
                    callback_data=f"admin_plan_edit:{plan_id}",
                )
            ],
            [
                InlineKeyboardButton(
                    text=active_text,
                    callback_data=f"admin_plan_toggle:{plan_id}",
                )
            ],
            [
                InlineKeyboardButton(
                    text="🗑 حذف",
                    callback_data=f"admin_plan_delete:{plan_id}",
                )
            ],
            [
                InlineKeyboardButton(
                    text="🔙 لیست تعرفه‌ها",
                    callback_data="admin_plan_list",
                )
            ],
        ]
    )


# =========================================================
# PLANS
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_plans"
)
async def admin_plans(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    await callback.message.edit_text(
        "💰 <b>مدیریت تعرفه‌ها</b>\n\n"
        "عملیات موردنظر را انتخاب کنید:",
        reply_markup=plans_admin_keyboard(),
    )

    await callback.answer()


# =========================================================
# ADD PLAN
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_plan_add"
)
async def admin_plan_add(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    await callback.message.edit_text(
        "نوع تعرفه را انتخاب کنید:",
        reply_markup=category_keyboard(),
    )

    await callback.answer()


@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith("admin_add:")
    )
)
async def admin_choose_category(
    callback: CallbackQuery,
    state: FSMContext,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    category = callback.data.split(
        ":",
        1,
    )[1]

    if category == "economic":
        category_name = "🟢 اقتصادی"

    elif category == "special":
        category_name = "🟣 ویژه"

    else:
        await callback.answer(
            "نوع تعرفه نامعتبر است.",
            show_alert=True,
        )
        return

    await state.update_data(
        category=category_name
    )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_NAME
    )

    await callback.message.edit_text(
        f"نوع تعرفه: <b>{category_name}</b>\n\n"
        "نام تعرفه را وارد کنید.\n\n"
        "مثال:\n"
        "<code>1 گیگ یک ماهه</code>"
    )

    await callback.answer()


# =========================================================
# PLAN NAME
# =========================================================

@router.message(
    AdminPlanStates.WAITING_FOR_NAME
)
async def admin_plan_name(
    message: Message,
    state: FSMContext,
):
    if not is_admin_user(message.from_user.id):
        return

    if not message.text:
        await message.answer(
            "❌ نام معتبر وارد کن."
        )
        return

    data = await state.get_data()

    name = message.text.strip()

    if not name:
        await message.answer(
            "❌ نام نمی‌تواند خالی باشد."
        )
        return

    # ویرایش
    if data.get("editing_plan_id"):

        await state.update_data(
            edit_name=name
        )

        await state.set_state(
            AdminPlanStates.WAITING_FOR_PRICE
        )

        await message.answer(
            "💵 قیمت جدید را به تومان وارد کن."
        )

        return

    # ایجاد
    await state.update_data(
        name=name
    )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_PRICE
    )

    await message.answer(
        "💵 قیمت تعرفه را به تومان وارد کن.\n\n"
        "مثال:\n"
        "<code>4000</code>"
    )


# =========================================================
# PLAN PRICE
# =========================================================

@router.message(
    AdminPlanStates.WAITING_FOR_PRICE
)
async def admin_plan_price(
    message: Message,
    state: FSMContext,
):
    if not is_admin_user(message.from_user.id):
        return

    if not message.text:
        await message.answer(
            "❌ قیمت معتبر وارد کن."
        )
        return

    try:
        price = int(
            message.text
            .replace(",", "")
            .replace("٬", "")
            .strip()
        )

    except ValueError:
        await message.answer(
            "❌ قیمت نامعتبر است.\n\n"
            "فقط عدد وارد کن."
        )
        return

    if price <= 0:
        await message.answer(
            "❌ قیمت باید بیشتر از صفر باشد."
        )
        return

    data = await state.get_data()

    if data.get("editing_plan_id"):

        await state.update_data(
            edit_price=price
        )

    else:

        await state.update_data(
            price=price
        )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_VOLUME
    )

    await message.answer(
        "📦 حجم را به گیگابایت وارد کن.\n\n"
        "مثال:\n"
        "<code>10</code>"
    )


# =========================================================
# PLAN VOLUME
# =========================================================

@router.message(
    AdminPlanStates.WAITING_FOR_VOLUME
)
async def admin_plan_volume(
    message: Message,
    state: FSMContext,
):
    if not is_admin_user(message.from_user.id):
        return

    if not message.text:
        await message.answer(
            "❌ حجم معتبر وارد کن."
        )
        return

    try:
        volume = int(
            message.text.strip()
        )

    except ValueError:
        await message.answer(
            "❌ حجم نامعتبر است."
        )
        return

    if volume <= 0:
        await message.answer(
            "❌ حجم باید بیشتر از صفر باشد."
        )
        return

    data = await state.get_data()

    if data.get("editing_plan_id"):

        await state.update_data(
            edit_volume=volume
        )

    else:

        await state.update_data(
            volume=volume
        )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_DURATION
    )

    await message.answer(
        "⏱ مدت را به روز وارد کن.\n\n"
        "مثال:\n"
        "<code>30</code>"
    )


# =========================================================
# PLAN DURATION
# =========================================================

@router.message(
    AdminPlanStates.WAITING_FOR_DURATION
)
async def admin_plan_duration(
    message: Message,
    state: FSMContext,
):
    if not is_admin_user(message.from_user.id):
        return

    if not message.text:
        await message.answer(
            "❌ مدت معتبر وارد کن."
        )
        return

    try:
        duration = int(
            message.text.strip()
        )

    except ValueError:
        await message.answer(
            "❌ مدت نامعتبر است."
        )
        return

    if duration <= 0:
        await message.answer(
            "❌ مدت باید بیشتر از صفر باشد."
        )
        return

    data = await state.get_data()

    if data.get("editing_plan_id"):

        await state.update_data(
            edit_duration=duration
        )

    else:

        await state.update_data(
            duration=duration
        )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_DESCRIPTION
    )

    await message.answer(
        "📝 توضیحات را وارد کن.\n\n"
        "اگر توضیحی نداری بنویس:\n"
        "<code>-</code>"
    )


# =========================================================
# PLAN DESCRIPTION / SAVE
# =========================================================

@router.message(
    AdminPlanStates.WAITING_FOR_DESCRIPTION
)
async def admin_plan_description(
    message: Message,
    state: FSMContext,
    session: AsyncSession,
):
    if not is_admin_user(message.from_user.id):
        return

    if not message.text:
        await message.answer(
            "❌ توضیحات معتبر وارد کن."
        )
        return

    description = message.text.strip()

    if description == "-":
        description = None

    data = await state.get_data()

    # =====================================================
    # EDIT
    # =====================================================

    editing_plan_id = data.get(
        "editing_plan_id"
    )

    if editing_plan_id:

        plan = await crud.update_plan(
            session=session,
            plan_id=editing_plan_id,
            name=data["edit_name"],
            price=data["edit_price"],
            volume_gb=data["edit_volume"],
            duration_days=data["edit_duration"],
            description=description,
        )

        await state.clear()

        if not plan:
            await message.answer(
                "❌ تعرفه پیدا نشد."
            )
            return

        await message.answer(
            "✅ <b>تعرفه با موفقیت ویرایش شد.</b>\n\n"
            f"📌 {plan.name}\n"
            f"💵 {plan.price:,} تومان\n"
            f"📦 {plan.volume_gb} GB\n"
            f"⏱ {plan.duration_days} روز",
            reply_markup=plans_admin_keyboard(),
        )

        return

    # =====================================================
    # CREATE
    # =====================================================

    category = data.get(
        "category",
        "🟢 اقتصادی",
    )

    name = data["name"]
    price = data["price"]
    volume = data["volume"]
    duration = data["duration"]

    full_name = (
        f"{category} | {name}"
    )

    plan = await crud.create_plan(
        session=session,
        name=full_name,
        price=price,
        volume_gb=volume,
        duration_days=duration,
        description=description,
    )

    await state.clear()

    await message.answer(
        "✅ <b>تعرفه با موفقیت ساخته شد.</b>\n\n"
        f"📌 نام: <b>{plan.name}</b>\n"
        f"💵 قیمت: <b>{plan.price:,} تومان</b>\n"
        f"📦 حجم: <b>{plan.volume_gb} GB</b>\n"
        f"⏱ مدت: <b>{plan.duration_days} روز</b>\n"
        f"🟢 وضعیت: فعال",
        reply_markup=plans_admin_keyboard(),
    )


# =========================================================
# PLAN LIST
# =========================================================

@router.callback_query(
    lambda c: c.data == "admin_plan_list"
)
async def admin_plan_list(
    callback: CallbackQuery,
    state: FSMContext,
    session: AsyncSession,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    await state.clear()

    plans = await crud.list_all_plans(
        session
    )

    if not plans:

        await callback.message.edit_text(
            "📋 <b>لیست تعرفه‌ها</b>\n\n"
            "هنوز هیچ تعرفه‌ای ساخته نشده است.",
            reply_markup=plans_admin_keyboard(),
        )

        await callback.answer()
        return

    for plan in plans:

        status = (
            "🟢 فعال"
            if plan.is_active
            else "🔴 غیرفعال"
        )

        text = (
            f"💰 <b>{plan.name}</b>\n\n"
            f"💵 قیمت: {plan.price:,} تومان\n"
            f"📦 حجم: {plan.volume_gb} GB\n"
            f"⏱ مدت: {plan.duration_days} روز\n"
            f"📌 وضعیت: {status}"
        )

        if plan.description:
            text += (
                f"\n📝 {plan.description}"
            )

        await callback.message.answer(
            text,
            reply_markup=plan_management_keyboard(
                plan.id,
                plan.is_active,
            ),
        )

    await callback.message.answer(
        "📋 <b>پایان لیست تعرفه‌ها</b>",
        reply_markup=plans_admin_keyboard(),
    )

    await callback.answer()


# =========================================================
# TOGGLE PLAN
# =========================================================

@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith(
            "admin_plan_toggle:"
        )
    )
)
async def admin_plan_toggle(
    callback: CallbackQuery,
    session: AsyncSession,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    try:
        plan_id = int(
            callback.data.split(
                ":",
                1,
            )[1]
        )

    except (ValueError, AttributeError):
        await callback.answer(
            "شناسه تعرفه نامعتبر است.",
            show_alert=True,
        )
        return

    plan = await crud.toggle_plan_active(
        session,
        plan_id,
    )

    if not plan:
        await callback.answer(
            "تعرفه پیدا نشد.",
            show_alert=True,
        )
        return

    status = (
        "فعال"
        if plan.is_active
        else "غیرفعال"
    )

    await callback.message.edit_text(
        f"💰 <b>{plan.name}</b>\n\n"
        f"💵 قیمت: {plan.price:,} تومان\n"
        f"📦 حجم: {plan.volume_gb} GB\n"
        f"⏱ مدت: {plan.duration_days} روز\n"
        f"📌 وضعیت جدید: <b>{status}</b>",
        reply_markup=plan_management_keyboard(
            plan.id,
            plan.is_active,
        ),
    )

    await callback.answer(
        f"تعرفه {status} شد."
    )


# =========================================================
# DELETE PLAN
# =========================================================

@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith(
            "admin_plan_delete:"
        )
    )
)
async def admin_plan_delete(
    callback: CallbackQuery,
    session: AsyncSession,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    try:
        plan_id = int(
            callback.data.split(
                ":",
                1,
            )[1]
        )

    except (ValueError, AttributeError):
        await callback.answer(
            "شناسه تعرفه نامعتبر است.",
            show_alert=True,
        )
        return

    plan = await crud.get_plan(
        session,
        plan_id,
    )

    if not plan:
        await callback.answer(
            "تعرفه پیدا نشد.",
            show_alert=True,
        )
        return

    deleted = await crud.delete_plan(
        session,
        plan_id,
    )

    if not deleted:

        await callback.answer(
            "حذف تعرفه انجام نشد.",
            show_alert=True,
        )
        return

    await callback.message.edit_text(
        "🗑 <b>تعرفه حذف شد.</b>\n\n"
        f"تعرفه <b>{plan.name}</b> با موفقیت حذف شد.",
        reply_markup=plans_admin_keyboard(),
    )

    await callback.answer(
        "تعرفه حذف شد."
    )


# =========================================================
# EDIT PLAN
# =========================================================

@router.callback_query(
    lambda c: (
        c.data
        and c.data.startswith(
            "admin_plan_edit:"
        )
    )
)
async def admin_plan_edit(
    callback: CallbackQuery,
    state: FSMContext,
    session: AsyncSession,
):
    if not is_admin_user(callback.from_user.id):
        await callback.answer(
            "⛔ دسترسی ندارید.",
            show_alert=True,
        )
        return

    try:
        plan_id = int(
            callback.data.split(
                ":",
                1,
            )[1]
        )

    except (ValueError, AttributeError):
        await callback.answer(
            "شناسه تعرفه نامعتبر است.",
            show_alert=True,
        )
        return

    plan = await crud.get_plan(
        session,
        plan_id,
    )

    if not plan:
        await callback.answer(
            "تعرفه پیدا نشد.",
            show_alert=True,
        )
        return

    await state.clear()

    await state.update_data(
        editing_plan_id=plan_id
    )

    await state.set_state(
        AdminPlanStates.WAITING_FOR_NAME
    )

    await callback.message.edit_text(
        "✏️ <b>ویرایش تعرفه</b>\n\n"
        f"نام فعلی:\n"
        f"<code>{plan.name}</code>\n\n"
        "نام جدید را وارد کن."
    )

    await callback.answer()