import json
import aiohttp
import aiosqlite
from datetime import datetime
from aiogram import Router, F, Bot, BaseMiddleware
from aiogram.filters import CommandStart
from aiogram.types import CallbackQuery, Message, ReplyKeyboardMarkup, KeyboardButton, LabeledPrice, PreCheckoutQuery, TelegramObject
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.utils.keyboard import InlineKeyboardBuilder

from config import ADMIN_IDS, DB_PATH
from handlers.channel_lock import check_user_sub, get_join_channels_keyboard
from keyboards.inline import get_main_menu_keyboard

router = Router()

async def check_is_admin(user_id: int) -> bool:
    if user_id in ADMIN_IDS:
        return True
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT user_id FROM admins WHERE user_id = ?", (user_id,)) as cursor:
            row = await cursor.fetchone()
            return row is not None

# ==================== میدل‌ور قفل اجباری کانال‌های اسپانسری ====================
class SubscriptionMiddleware(BaseMiddleware):
    async def __call__(
        self,
        handler,
        event: TelegramObject,
        data: dict
    ):
        bot: Bot = data.get("bot")
        user = data.get("event_from_user")

        if not user or await check_is_admin(user.id):
            return await handler(event, data)

        if isinstance(event, Message):
            if event.text and event.text.startswith("/start"):
                return await handler(event, data)
        elif isinstance(event, CallbackQuery):
            if event.data == "check_subscription":
                return await handler(event, data)

        is_subbed, unsubscribed_channels = await check_user_sub(bot, user.id)

        if not is_subbed:
            text = "⚠️ **برای استفاده از خدمات ربات، ابتدا باید در تمامی کانال‌های زیر عضو شوید:**"
            kb = get_join_channels_keyboard(unsubscribed_channels)

            if isinstance(event, Message):
                await event.answer(text, reply_markup=kb, parse_mode="Markdown")
            elif isinstance(event, CallbackQuery):
                await event.answer("⚠️ لطفاً ابتدا در تمامی کانال‌های اسپانسری عضو شوید!", show_alert=True)
                try:
                    await event.message.answer(text, reply_markup=kb, parse_mode="Markdown")
                except Exception:
                    pass
            return

        return await handler(event, data)

router.message.outer_middleware(SubscriptionMiddleware())
router.callback_query.outer_middleware(SubscriptionMiddleware())

# ==================== تعریف حالت‌های FSM ====================
class UserStates(StatesGroup):
    waiting_for_receipt = State()
    waiting_for_ticket_msg = State()
    waiting_for_stars_toman_amount = State()
    waiting_for_ton_toman_amount = State()
    waiting_for_trx_toman_amount = State()
    waiting_for_discount_code_input = State()

STAR_USD_PRICE = 0.016

async def safe_edit_or_send(target: CallbackQuery | Message, text: str, reply_markup=None, parse_mode="Markdown"):
    if isinstance(target, CallbackQuery):
        try:
            await target.message.edit_text(text, reply_markup=reply_markup, parse_mode=parse_mode)
        except Exception:
            try:
                await target.message.delete()
            except Exception:
                pass
            await target.message.answer(text, reply_markup=reply_markup, parse_mode=parse_mode)
    else:
        await target.answer(text, reply_markup=reply_markup, parse_mode="Markdown")

def redact_user_id(user_id: int) -> str:
    s = str(user_id)
    if len(s) >= 7:
        return f"{s[:3]}******{s[-4:]}"
    elif len(s) >= 4:
        return f"{s[0]}***{s[-1]}"
    return s

async def send_purchase_log_to_channel(bot: Bot, user_id: int, product_name: str, price: int, del_type: str):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='log_channel'") as cursor:
            row = await cursor.fetchone()
            log_ch = row[0] if row else ""
        async with db.execute("SELECT value FROM settings WHERE key='log_footer_text'") as cursor:
            row_f = await cursor.fetchone()
            footer = row_f[0] if row_f else "ممنون از اعتماد شما ❤️"

    if not log_ch:
        return

    redacted_id = redact_user_id(user_id)
    now_date = datetime.now().strftime("%Y-%m-%d %H:%M")

    del_method_str = "⚡ تحویل خودکار"
    if del_type == "vpn":
        del_method_str = "🌐 وی‌پی‌ان (لینک اختصاصی)"
    elif del_type == "manual":
        del_method_str = "🛠️ تحویل دستی"

    log_text = (
        f"🟢 **گزارش تراکنش موفق**\n"
        f"━━━━━━━━━━━━━━\n\n"
        f"👤 **کاربر:** `{redacted_id}`\n"
        f"🛒 **محصول:** {product_name}\n"
        f"💰 **مبلغ پرداخت شده:** {price:,} تومان\n"
        f"🔄 **نوع تحویل:** {del_method_str}\n"
        f"📅 **تاریخ (میلادی):** `{now_date}`\n\n"
        f"{footer}"
    )

    try:
        await bot.send_message(chat_id=log_ch, text=log_text, parse_mode="Markdown")
    except Exception:
        pass

async def get_live_star_toman_price() -> int:
    try:
        url = "https://api.nobitex.ir/v2/trades/USDTIRT"
        async with aiohttp.ClientSession() as session:
            async with session.get(url, timeout=5) as resp:
                data = await resp.json()
                if data.get("status") == "ok" and data.get("trades"):
                    last_trade_rial = int(data["trades"][0]["price"])
                    usdt_toman = last_trade_rial // 10
                    return max(1, int(usdt_toman * STAR_USD_PRICE))
    except Exception:
        pass
    return 1500

async def get_live_ton_toman_price() -> int:
    try:
        url = "https://api.nobitex.ir/v2/trades/TONIRT"
        async with aiohttp.ClientSession() as session:
            async with session.get(url, timeout=5) as resp:
                data = await resp.json()
                if data.get("status") == "ok" and data.get("trades"):
                    return int(data["trades"][0]["price"]) // 10
    except Exception:
        pass
    return 350000

async def get_live_trx_toman_price() -> int:
    try:
        url = "https://api.nobitex.ir/v2/trades/TRXIRT"
        async with aiohttp.ClientSession() as session:
            async with session.get(url, timeout=5) as resp:
                data = await resp.json()
                if data.get("status") == "ok" and data.get("trades"):
                    return int(data["trades"][0]["price"]) // 10
    except Exception:
        pass
    return 15000

def get_reply_main_menu():
    return ReplyKeyboardMarkup(
        keyboard=[[KeyboardButton(text="🏠 منوی اصلی")]],
        resize_keyboard=True
    )

async def process_referral_reward(buyer_id: int, purchase_price: int, bot: Bot):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT referred_by FROM users WHERE user_id = ?", (buyer_id,)) as cursor:
            row = await cursor.fetchone()
            if not row or not row[0]:
                return
            referrer_id = row[0]

        async with db.execute("SELECT value FROM settings WHERE key='referral_percent'") as cursor:
            p_row = await cursor.fetchone()
            percent = int(p_row[0]) if p_row and p_row[0].isdigit() else 30

        if percent <= 0:
            return

        commission = (purchase_price * percent) // 100
        if commission <= 0:
            return

        async with db.execute("SELECT COUNT(*) FROM orders WHERE user_id = ?", (buyer_id,)) as cursor:
            order_count = (await cursor.fetchone())[0]

        is_first_buy = (order_count == 1)

        if is_first_buy:
            await db.execute("""
                UPDATE users SET 
                    balance = balance + ?,
                    total_earned = total_earned + ?,
                    ref_orders_count = ref_orders_count + 1,
                    ref_buyers_count = ref_buyers_count + 1
                WHERE user_id = ?
            """, (commission, commission, referrer_id))
        else:
            await db.execute("""
                UPDATE users SET 
                    balance = balance + ?,
                    total_earned = total_earned + ?,
                    ref_orders_count = ref_orders_count + 1
                WHERE user_id = ?
            """, (commission, commission, referrer_id))

        await db.commit()

        async with db.execute("SELECT username FROM users WHERE user_id = ?", (buyer_id,)) as cursor:
            buyer_username = (await cursor.fetchone())[0] or "ناشناس"

    try:
        await bot.send_message(
            referrer_id,
            f"🎉 **درآمد جدید از زیرمجموعه!**\n\n"
            f"👤 زیرمجموعه شما (@{buyer_username}) خریدی به مبلغ {purchase_price:,} تومان انجام داد.\n"
            f"💵 **مبلغ {commission:,} تومان ({percent}%) به کیف پول شما اضافه شد!**",
            parse_mode="Markdown"
        )
    except Exception:
        pass

async def render_product_preview(user_id: int, p_id: int, state: FSMContext):
    data = await state.get_data()
    applied_discount = data.get("applied_discount")

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT name, description, price, delivery_type, category_id, media_type, media_file_id FROM products WHERE id = ?", (p_id,)) as cursor:
            prod = await cursor.fetchone()
        async with db.execute("SELECT balance FROM users WHERE user_id = ?", (user_id,)) as cursor:
            balance_row = await cursor.fetchone()
            balance = balance_row[0] if balance_row else 0

        vpn_stock_count = 0
        if prod and prod[3] == "vpn":
            async with db.execute("SELECT COUNT(*) FROM vpn_stock WHERE product_id = ? AND status = 'available'", (p_id,)) as cursor:
                vpn_stock_count = (await cursor.fetchone())[0]

    if not prod:
        return None, None, None, None

    name, desc, original_price, del_type, cat_id, media_type, media_file_id = prod
    final_price = original_price
    discount_msg = ""

    if applied_discount:
        d_type = applied_discount["type"]
        d_val = applied_discount["value"]
        d_scope = applied_discount["scope"]
        d_target = applied_discount["target_id"]

        is_valid = False
        if d_scope == "all":
            is_valid = True
        elif d_scope == "category" and d_target == cat_id:
            is_valid = True
        elif d_scope == "product" and d_target == p_id:
            is_valid = True

        if is_valid:
            if d_type == "percent":
                discount_amount = (original_price * d_val) // 100
            else:
                discount_amount = d_val

            final_price = max(0, original_price - discount_amount)
            discount_msg = f"\n🏷️ **کد تخفیف ({applied_discount['code']}):** {discount_amount:,} تومان تخفیف"
        else:
            discount_msg = f"\n⚠️ *کد تخفیف {applied_discount['code']} برای این محصول قابل استفاده نیست.*"

    await state.update_data(current_product_id=p_id, final_price=final_price)

    if del_type == "auto":
        del_str = "⚡ تحویل خودکار (بلافاصله بعد از خرید)"
    elif del_type == "vpn":
        del_str = f"🌐 تحویل آنی لینک وی‌پی‌ان (موجودی: {vpn_stock_count} عدد)"
    else:
        del_str = "🛠️ تحویل دستی (توسط پشتیبانی)"

    text = (
        f"📦 **{name}**\n\n"
        f"📝 **توضیحات:**\n{desc or 'توضیحاتی ثبت نشده است.'}\n\n"
        f"💰 **قیمت اصلی:** {original_price:,} تومان{discount_msg}\n"
        f"💵 **مبلغ قابل پرداخت:** **{final_price:,} تومان**\n"
        f"🔄 **نوع تحویل:** {del_str}\n"
        f"-------------------------\n"
        f"💳 **موجودی فعلی شما:** {balance:,} تومان\n\n"
        f"آیا از خرید این محصول اطمینان دارید؟"
    )

    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید و پرداخت", callback_data=f"confirm_buy_{p_id}", style="success")
    builder.button(text="🏷️ اعمال کد تخفیف", callback_data=f"enter_discount_{p_id}")
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    return text, builder.as_markup(), media_type, media_file_id

# ==================== ۱. دستور /start ====================
@router.message(CommandStart())
async def start_handler(message: Message, bot: Bot, state: FSMContext):
    await state.clear()
    user_id = message.from_user.id
    username = message.from_user.username or ""
    full_name = message.from_user.full_name or ""

    referrer_id = None
    args = message.text.split()[1] if len(message.text.split()) > 1 else None
    if args and args.startswith("ref_"):
        ref_str = args.replace("ref_", "")
        if ref_str.isdigit():
            possible_ref = int(ref_str)
            if possible_ref != user_id:
                referrer_id = possible_ref

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT user_id FROM users WHERE user_id = ?", (user_id,)) as cursor:
            existing_user = await cursor.fetchone()

        if not existing_user:
            if referrer_id:
                async with db.execute("SELECT user_id FROM users WHERE user_id = ?", (referrer_id,)) as cursor:
                    if await cursor.fetchone():
                        await db.execute("""
                            INSERT INTO users (user_id, username, full_name, referred_by)
                            VALUES (?, ?, ?, ?)
                        """, (user_id, username, full_name, referrer_id))

                        await db.execute("UPDATE users SET ref_count = ref_count + 1 WHERE user_id = ?", (referrer_id,))
                        await db.commit()

                        try:
                            await bot.send_message(
                                referrer_id,
                                f"👥 **عضو جدید با لینک شما وارد شد!**\n"
                                f"کاربر @{username or full_name} با لینک اختصاصی شما به ربات پیوست.",
                                parse_mode="Markdown"
                            )
                        except Exception:
                            pass
                    else:
                        await db.execute("INSERT INTO users (user_id, username, full_name) VALUES (?, ?, ?)", (user_id, username, full_name))
                        await db.commit()
            else:
                await db.execute("INSERT INTO users (user_id, username, full_name) VALUES (?, ?, ?)", (user_id, username, full_name))
                await db.commit()
        else:
            await db.execute("UPDATE users SET username = ?, full_name = ? WHERE user_id = ?", (username, full_name, user_id))
            await db.commit()

    is_subbed, unsubscribed_channels = await check_user_sub(bot, user_id)

    if not is_subbed:
        await message.answer(
            "⚠️ **برای استفاده از خدمات ربات، ابتدا باید در تمامی کانال‌های زیر عضو شوید:**",
            reply_markup=get_join_channels_keyboard(unsubscribed_channels),
            parse_mode="Markdown"
        )
        return

    is_admin = await check_is_admin(user_id)
    await message.answer(
        f"سلام {full_name} عزیز! 👋\nبه فروشگاه خوش آمدید. لطفاً از منوی زیر انتخاب کنید:",
        reply_markup=await get_main_menu_keyboard(is_admin)
    )
    await message.answer("💡 در صورت گم شدن منو، می‌توانید همیشه از دکمه «🏠 منوی اصلی» پایین صفحه استفاده کنید.", reply_markup=get_reply_main_menu())

@router.callback_query(F.data == "check_subscription")
async def check_subscription_handler(callback: CallbackQuery, bot: Bot):
    user_id = callback.from_user.id
    is_subbed, unsubscribed_channels = await check_user_sub(bot, user_id)

    if not is_subbed:
        await callback.answer("❌ شما هنوز در تمامی کانال‌ها عضو نشده‌اید!", show_alert=True)
        return

    await callback.answer("✅ عضویت شما تایید شد.")
    is_admin = await check_is_admin(user_id)
    await safe_edit_or_send(
        callback,
        "✨ عضویت شما با موفقیت تایید شد! به فروشگاه خوش آمدید:\nلطفاً گزینه مورد نظر را انتخاب کنید:",
        reply_markup=await get_main_menu_keyboard(is_admin)
    )

# ==================== ۲. دکمه ثابت معمولی منوی اصلی ====================
@router.message(F.text == "🏠 منوی اصلی")
async def reply_main_menu_handler(message: Message, state: FSMContext, bot: Bot):
    await state.clear()
    user_id = message.from_user.id
    
    is_subbed, unsubscribed_channels = await check_user_sub(bot, user_id)
    if not is_subbed:
        await message.answer(
            "⚠️ **برای استفاده از خدمات ربات، ابتدا باید در کانال‌های زیر عضو شوید:**",
            reply_markup=get_join_channels_keyboard(unsubscribed_channels),
            parse_mode="Markdown"
        )
        return

    is_admin = await check_is_admin(user_id)
    await message.answer(
        "✨ منوی اصلی ربات بروزرسانی شد. لطفاً گزینه مورد نظر را انتخاب کنید:",
        reply_markup=await get_main_menu_keyboard(is_admin)
    )

# ==================== ۳. بازگشت شیشه‌ای ====================
@router.callback_query(F.data == "back_to_main")
async def back_to_main(callback: CallbackQuery, state: FSMContext):
    await state.clear()
    is_admin = await check_is_admin(callback.from_user.id)
    await safe_edit_or_send(
        callback,
        "✨ به فروشگاه خوش آمدید. لطفاً گزینه مورد نظر را انتخاب کنید:",
        reply_markup=await get_main_menu_keyboard(is_admin)
    )

# ==================== ۴. پنل کسب درآمد ====================
@router.callback_query(F.data == "referral_info")
async def referral_info_handler(callback: CallbackQuery, bot: Bot):
    user_id = callback.from_user.id

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("""
            SELECT balance, ref_count, ref_buyers_count, ref_orders_count, total_earned 
            FROM users WHERE user_id = ?
        """, (user_id,)) as cursor:
            row = await cursor.fetchone()

        async with db.execute("SELECT value FROM settings WHERE key='referral_percent'") as cursor:
            p_row = await cursor.fetchone()
            percent = p_row[0] if p_row else "30"

    balance = row[0] if row else 0
    ref_count = row[1] if row else 0
    ref_buyers = row[2] if row else 0
    ref_orders = row[3] if row else 0
    total_earned = row[4] if row else 0

    bot_info = await bot.get_me()
    ref_link = f"https://t.me/{bot_info.username}?start=ref_{user_id}"

    text = (
        f"💰 **کسب درآمد کاربران**\n"
        f"━━━━━━━━━━━━━━\n\n"
        f"🔗 **لینک اختصاصی شما:**\n"
        f"`{ref_link}`\n\n"
        f"هرکس با لینک شما وارد ربات شود و خرید انجام دهد، **{percent}%** مبلغ خرید به موجودی کیف پول شما اضافه می‌شود.\n\n"
        f"👥 **دعوت‌شده‌ها:** {ref_count} نفر\n"
        f"🛒 **خریداران موفق:** {ref_buyers} نفر\n"
        f"🧾 **تعداد خریدهای مشمول درآمد:** {ref_orders}\n"
        f"💵 **کل درآمد:** {total_earned:,} تومان\n"
        f"💰 **موجودی کیف پول شما:** {balance:,} تومان"
    )

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

# ==================== ۵. اطلاعات حساب کاربر ====================
@router.callback_query(F.data == "my_profile")
async def my_profile_handler(callback: CallbackQuery):
    user_id = callback.from_user.id
    username = callback.from_user.username or "ندارد"
    
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT balance FROM users WHERE user_id = ?", (user_id,)) as cursor:
            row = await cursor.fetchone()
            balance = row[0] if row else 0

        async with db.execute("SELECT COUNT(*) FROM orders WHERE user_id = ?", (user_id,)) as cursor:
            order_count = (await cursor.fetchone())[0]

        async with db.execute("SELECT COUNT(*) FROM vpn_stock WHERE used_by = ?", (user_id,)) as cursor:
            vpn_count = (await cursor.fetchone())[0]

    text = (
        f"👤 **اطلاعات حساب کاربری**\n\n"
        f"🆔 آیدی عددی: `{user_id}`\n"
        f"🌐 یوزرنیم: @{username}\n"
        f"💰 موجودی کیف پول: **{balance:,} تومان**\n"
        f"📦 تعداد کل سفارشات: **{order_count} عدد**\n"
        f"🌐 وی‌پی‌ان‌های خریداری‌شده: **{vpn_count} عدد**\n"
    )
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

# ==================== ۶. لیست وی‌پی‌ان‌های خریداری‌شده ====================
@router.callback_query(F.data == "my_vpn_accounts")
async def my_vpn_accounts_handler(callback: CallbackQuery):
    user_id = callback.from_user.id

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("""
            SELECT vpn_stock.id, products.name
            FROM vpn_stock
            JOIN products ON vpn_stock.product_id = products.id
            WHERE vpn_stock.used_by = ?
            ORDER BY vpn_stock.id DESC
        """, (user_id,)) as cursor:
            vpn_list = await cursor.fetchall()

    if not vpn_list:
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ بازگشت به منوی اصلی", callback_data="back_to_main", style="danger")
        await safe_edit_or_send(callback, "⚠️ شما هنوز هیچ سرویس وی‌پی‌انی خریداری نکرده‌اید.", reply_markup=builder.as_markup())
        return

    builder = InlineKeyboardBuilder()
    for v_id, p_name in vpn_list:
        builder.button(text=f"🌐 {p_name} (#{v_id})", callback_data=f"show_vpn_{v_id}")

    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    await safe_edit_or_send(
        callback,
        "🌐 **لیست سرویس‌های وی‌پی‌ان خریداری‌شده شما:**\n\n"
        "لطفاً جهت مشاهده و کپی لینک کانکشن، روی وی‌پی‌ان مورد نظر کلیک کنید:",
        reply_markup=builder.as_markup(),
        parse_mode="Markdown"
    )

@router.callback_query(F.data.startswith("show_vpn_"))
async def show_single_vpn_handler(callback: CallbackQuery):
    v_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("""
            SELECT products.name, vpn_stock.link
            FROM vpn_stock
            JOIN products ON vpn_stock.product_id = products.id
            WHERE vpn_stock.id = ? AND vpn_stock.used_by = ?
        """, (v_id, user_id)) as cursor:
            vpn_item = await cursor.fetchone()

    if not vpn_item:
        await callback.answer("❌ اطلاعات این وی‌پی‌ان یافت نشد.", show_alert=True)
        return

    p_name, link = vpn_item

    text = (
        f"🔰 **{p_name}**\n"
        f"📌 **شناسه سرویس:** #{v_id}\n\n"
        f"🔑 **لینک کانکشن اختصاصی (روی کد کلیک کنید تا کپی شود):**\n\n"
        f"`{link}`"
    )

    builder = InlineKeyboardBuilder()
    builder.button(text="🔙 بازگشت به لیست وی‌پی‌ان‌ها", callback_data="my_vpn_accounts", style="primary")
    builder.button(text="❌ بازگشت به منوی اصلی", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

# ==================== ۷. لیست سفارشات من ====================
@router.callback_query(F.data == "my_orders")
async def my_orders_handler(callback: CallbackQuery):
    user_id = callback.from_user.id
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("""
            SELECT orders.id, products.name, orders.price, orders.status, orders.delivered_content, orders.created_at
            FROM orders
            JOIN products ON orders.product_id = products.id
            WHERE orders.user_id = ?
            ORDER BY orders.id DESC
        """, (user_id,)) as cursor:
            orders = await cursor.fetchall()

    if not orders:
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ بازگشت", callback_data="back_to_main", style="danger")
        await safe_edit_or_send(callback, "⚠️ شما هنوز هیچ سفارشی ثبت نکرده‌اید.", reply_markup=builder.as_markup())
        return

    text = "📦 **لیست سفارشات شما:**\n\n"
    for o_id, p_name, price, status, content, created_at in orders:
        text += f"🔹 **سفارش #{o_id}** - {p_name}\n"
        text += f"💰 قیمت: {price:,} تومان\n"
        text += f"📌 وضعیت: `{status}`\n"
        if content and not content.startswith("[") and not content.startswith("{"):
            text += f"🔑 محتوای تحویلی:\n`{content}`\n"
        text += "-------------------------\n"

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

# ==================== ۸. سیستم مدیریت و انتخاب روش‌های شارژ حساب ====================
@router.callback_query(F.data == "charge_wallet")
async def charge_wallet_start(callback: CallbackQuery, state: FSMContext):
    await state.clear()
    
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT key, value FROM settings") as cursor:
            rows = await cursor.fetchall()
            settings = {row[0]: row[1] for row in rows}

    enable_card = settings.get("enable_card", "1") == "1"
    enable_stars = settings.get("enable_stars", "1") == "1"
    enable_ton = settings.get("enable_ton", "1") == "1"
    enable_trx = settings.get("enable_trx", "1") == "1"
    enable_crypto = enable_ton or enable_trx

    if not (enable_card or enable_stars or enable_crypto):
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
        await safe_edit_or_send(callback, "⚠️ در حال حاضر تمامی درگاه‌های شارژ توسط مدیریت موقتاً غیرفعال شده‌اند.", reply_markup=builder.as_markup())
        return

    builder = InlineKeyboardBuilder()
    if enable_card:
        builder.button(text="💳 کارت به کارت (ارسال رسید)", callback_data="charge_card_to_card")
    if enable_stars:
        builder.button(text="🌟 شارژ خودکار با استارز تلگرام", callback_data="charge_with_stars", style="success")
    if enable_crypto:
        builder.button(text="💎 شارژ خودکار با رمز ارز (Crypto)", callback_data="charge_with_crypto", style="primary")

    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    text = "💳 **انتخاب روش شارژ حساب کاربری:**\n\nلطفاً یکی از روش‌های زیر را جهت افزایش موجودی انتخاب کنید:"
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.callback_query(F.data == "charge_with_crypto")
async def charge_crypto_sub_menu(callback: CallbackQuery):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT key, value FROM settings") as cursor:
            rows = await cursor.fetchall()
            settings = {row[0]: row[1] for row in rows}

    enable_ton = settings.get("enable_ton", "1") == "1"
    enable_trx = settings.get("enable_trx", "1") == "1"

    builder = InlineKeyboardBuilder()
    if enable_ton:
        builder.button(text="💎 شبکه TON (Tonkeeper)", callback_data="charge_with_ton")
    if enable_trx:
        builder.button(text="🔴 شبکه TRON (ترون / TRX)", callback_data="charge_with_trx")

    builder.button(text="🔙 بازگشت به روش‌های پرداخت", callback_data="charge_wallet", style="danger")
    builder.adjust(1)

    await safe_edit_or_send(callback, "💎 **انتخاب شبکه بلاکچین جهت شارژ:**", reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.callback_query(F.data == "charge_card_to_card")
async def charge_card_handler(callback: CallbackQuery, state: FSMContext):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='bank_card'") as cursor:
            row_card = await cursor.fetchone()
            card_number = row_card[0] if row_card else "ثبت نشده"

        async with db.execute("SELECT value FROM settings WHERE key='card_owner'") as cursor:
            row_owner = await cursor.fetchone()
            card_owner = row_owner[0] if row_owner else "ثبت نشده"

    await state.set_state(UserStates.waiting_for_receipt)

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")

    text = (
        f"💳 **شارژ کارت به کارت**\n\n"
        f"لطفاً مبلغ مورد نظر را به شماره کارت زیر واریز کنید:\n\n"
        f"`{card_number}`\n"
        f"👤 **به نام:** {card_owner}\n\n"
        f"📌 **سپس عکس رسید بانکی یا متن واریزی را ارسال کنید:**"
    )
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.message(UserStates.waiting_for_receipt)
async def process_receipt_submission(message: Message, state: FSMContext, bot: Bot):
    user_id = message.from_user.id
    username = message.from_user.username or "بدون یوزرنیم"
    photo_id = message.photo[-1].file_id if message.photo else None
    caption = message.caption or message.text or "بدون توضیح"

    async with aiosqlite.connect(DB_PATH) as db:
        cursor = await db.execute(
            "INSERT INTO receipts (user_id, photo_id, caption) VALUES (?, ?, ?)",
            (user_id, photo_id, caption)
        )
        receipt_id = cursor.lastrowid

        # دریافت آیدی گروه بررسی رسیدها
        async with db.execute("SELECT value FROM settings WHERE key='receipt_group'") as c_grp:
            row_grp = await c_grp.fetchone()
            receipt_group_id = row_grp[0] if row_grp else ""

        await db.commit()

    await state.clear()
    is_admin = await check_is_admin(user_id)
    await message.answer("✅ رسید شما با موفقیت ثبت شد و برای پشتیبانی ارسال گردید.", reply_markup=await get_main_menu_keyboard(is_admin))

    admin_btn = InlineKeyboardBuilder()
    admin_btn.button(text="✅ تایید و شارژ", callback_data=f"approve_rec_{receipt_id}", style="success")
    admin_btn.button(text="❌ رد رسید", callback_data=f"reject_rec_{receipt_id}", style="danger")

    admin_msg = (
        f"💳 **رسید جدید دریافت شد! (#{receipt_id})**\n\n"
        f"👤 کاربر: @{username}\n"
        f"🆔 آیدی عددی: `{user_id}`\n"
        f"📝 توضیحات: {caption}"
    )

    # در صورتی که گروه رسیدها تنظیم شده باشد به گروه، در غیر این صورت به پی‌وی ادمین‌ها ارسال می‌شود
    if receipt_group_id:
        try:
            if photo_id:
                await bot.send_photo(receipt_group_id, photo_id, caption=admin_msg, reply_markup=admin_btn.as_markup(), parse_mode="Markdown")
            else:
                await bot.send_message(receipt_group_id, admin_msg, reply_markup=admin_btn.as_markup(), parse_mode="Markdown")
        except Exception:
            pass
    else:
        async with aiosqlite.connect(DB_PATH) as db:
            async with db.execute("SELECT user_id FROM admins") as cursor:
                db_admins = [r[0] for row in await cursor.fetchall()]

        all_admins = set(ADMIN_IDS + db_admins)
        for admin_id in all_admins:
            try:
                if photo_id:
                    await bot.send_photo(admin_id, photo_id, caption=admin_msg, reply_markup=admin_btn.as_markup(), parse_mode="Markdown")
                else:
                    await bot.send_message(admin_id, admin_msg, reply_markup=admin_btn.as_markup(), parse_mode="Markdown")
            except Exception:
                pass

@router.callback_query(F.data == "charge_with_stars")
async def charge_stars_start(callback: CallbackQuery, state: FSMContext):
    await state.set_state(UserStates.waiting_for_stars_toman_amount)
    star_toman_price = await get_live_star_toman_price()

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")

    text = (
        f"🌟 **شارژ خودکار با استارز تلگرام**\n\n"
        f"📊 **قیمت لحظه‌ای هر ۱ استارز:** ~{star_toman_price:,} تومان\n\n"
        f"لطفاً مبلغ شارژ مورد نظر را **به تومان** وارد کنید (مثلاً 50000):"
    )
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.message(UserStates.waiting_for_stars_toman_amount)
async def process_stars_toman_amount(message: Message, state: FSMContext, bot: Bot):
    if not message.text.isdigit():
        await message.answer("لطفاً فقط عدد وارد کنید:")
        return

    toman_amount = int(message.text)
    if toman_amount < 5000:
        await message.answer("مبلغ شارژ باید حداقل ۵,۰۰۰ تومان باشد:")
        return

    star_toman_price = await get_live_star_toman_price()
    stars_count = max(1, toman_amount // star_toman_price)
    actual_toman = stars_count * star_toman_price

    await state.clear()

    await bot.send_invoice(
        chat_id=message.from_user.id,
        title="🌟 شارژ کیف پول با استارز",
        description=f"پرداخت {stars_count} استارز معادل {actual_toman:,} تومان شارژ حساب",
        payload=f"stars_payload_{actual_toman}",
        provider_token="",
        currency="XTR",
        prices=[LabeledPrice(label="استارز تلگرام", amount=stars_count)]
    )

@router.pre_checkout_query()
async def process_pre_checkout_query(query: PreCheckoutQuery):
    await query.answer(ok=True)

@router.message(F.successful_payment)
async def process_successful_stars_payment(message: Message, bot: Bot):
    payload = message.successful_payment.invoice_payload
    user_id = message.from_user.id

    toman_amount = 0
    if payload.startswith("stars_payload_"):
        toman_amount = int(payload.replace("stars_payload_", ""))

    if toman_amount > 0:
        async with aiosqlite.connect(DB_PATH) as db:
            await db.execute("UPDATE users SET balance = balance + ? WHERE user_id = ?", (toman_amount, user_id))
            await db.commit()

        await process_referral_reward(user_id, toman_amount, bot)

        await message.answer(
            f"🎉 **پرداخت استارز با موفقیت انجام شد!**\n\n"
            f"💰 **مبلغ {toman_amount:,} تومان به کیف پول شما اضافه شد.**",
            parse_mode="Markdown"
        )

# --- شارژ شبکه TON ---
@router.callback_query(F.data == "charge_with_ton")
async def charge_ton_start(callback: CallbackQuery, state: FSMContext):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='ton_wallet'") as cursor:
            row = await cursor.fetchone()
            ton_wallet = row[0] if row else ""

    if not ton_wallet or len(ton_wallet) < 20:
        await callback.answer("❌ آدرس ولت TON هنوز توسط مدیریت تنظیم نشده است.", show_alert=True)
        return

    await state.set_state(UserStates.waiting_for_ton_toman_amount)
    ton_toman_price = await get_live_ton_toman_price()

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")

    text = (
        f"💎 **شارژ خودکار با ولت TON (Tonkeeper)**\n\n"
        f"📊 **قیمت لحظه‌ای هر ۱ TON:** ~{ton_toman_price:,} تومان\n\n"
        f"لطفاً مبلغ شارژ مورد نظر را **به تومان** وارد کنید (مثلاً 100000):"
    )
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.message(UserStates.waiting_for_ton_toman_amount)
async def process_ton_toman_amount(message: Message, state: FSMContext):
    if not message.text.isdigit():
        await message.answer("لطفاً فقط عدد وارد کنید:")
        return

    toman_amount = int(message.text)
    if toman_amount < 10000:
        await message.answer("مبلغ شارژ باید حداقل ۱۰,۰۰۰ تومان باشد:")
        return

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='ton_wallet'") as cursor:
            ton_wallet = (await cursor.fetchone())[0]

    ton_toman_price = await get_live_ton_toman_price()
    ton_amount = round(toman_amount / ton_toman_price, 3)
    nano_ton = int(ton_amount * 1_000_000_000)

    user_id = message.from_user.id
    memo_comment = f"charge_{user_id}"

    ton_deep_link = f"ton://transfer/{ton_wallet}?amount={nano_ton}&text={memo_comment}"

    await state.clear()

    builder = InlineKeyboardBuilder()
    builder.button(text="💎 پرداخت با Tonkeeper / Telegram Wallet", url=ton_deep_link)
    builder.button(text="🔄 تایید و بررسی واریزی", callback_data=f"verify_ton_{user_id}_{toman_amount}")
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    text = (
        f"💎 **فاکتور واریز TON**\n\n"
        f"💰 مبلغ درخواست: **{toman_amount:,} تومان**\n"
        f"💠 معادل ارزی: **{ton_amount} TON**\n"
        f"📌 شناسه واریز (Memo): `{memo_comment}`\n\n"
        f"۱. روی دکمه پرداخت زیر کلیک کنید تا ولت شما باز شود.\n"
        f"۲. پس از تایید انتقال، روی دکمه **تایید و بررسی واریزی** بزنید."
    )
    await message.answer(text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.callback_query(F.data.startswith("verify_ton_"))
async def verify_ton_payment_handler(callback: CallbackQuery, bot: Bot):
    parts = callback.data.split("_")
    target_user_id = int(parts[2])
    toman_amount = int(parts[3])
    memo_comment = f"charge_{target_user_id}"

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='ton_wallet'") as cursor:
            ton_wallet = (await cursor.fetchone())[0]

    async with aiohttp.ClientSession() as session:
        url = f"https://tonapi.io/v2/blockchain/accounts/{ton_wallet}/transactions?limit=15"
        try:
            async with session.get(url, timeout=7) as resp:
                if resp.status == 200:
                    data = await resp.json()
                    transactions = data.get("transactions", [])
                    
                    payment_found = False
                    for tx in transactions:
                        in_msg = tx.get("in_msg", {})
                        decoded_op = in_msg.get("decoded_body", {})
                        comment = decoded_op.get("text", "")
                        if comment == memo_comment:
                            payment_found = True
                            break

                    if payment_found:
                        async with aiosqlite.connect(DB_PATH) as db:
                            await db.execute("UPDATE users SET balance = balance + ? WHERE user_id = ?", (toman_amount, target_user_id))
                            await db.commit()

                        await process_referral_reward(target_user_id, toman_amount, bot)

                        await safe_edit_or_send(
                            callback,
                            f"🎉 **واریزی TON شما تایید شد!**\n\n💰 مبلغ **{toman_amount:,} تومان** به کیف پول شما اضافه گردید."
                        )
                        return
        except Exception:
            pass

    await callback.answer("⌛ هنوز تراکنشی در شبکه یافت نشد. پس از تایید تراکنش مجدداً بزنید.", show_alert=True)

# --- شارژ شبکه TRON (ترون / TRX) ---
@router.callback_query(F.data == "charge_with_trx")
async def charge_trx_start(callback: CallbackQuery, state: FSMContext):
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='trx_wallet'") as cursor:
            row = await cursor.fetchone()
            trx_wallet = row[0] if row else ""

    if not trx_wallet or len(trx_wallet) < 20:
        await callback.answer("❌ آدرس ولت ترون هنوز توسط مدیریت تنظیم نشده است.", show_alert=True)
        return

    await state.set_state(UserStates.waiting_for_trx_toman_amount)
    trx_toman_price = await get_live_trx_toman_price()

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")

    text = (
        f"🔴 **شارژ خودکار با ترون (TRX)**\n\n"
        f"📊 **قیمت لحظه‌ای هر ۱ ترون (TRX):** ~{trx_toman_price:,} تومان\n\n"
        f"لطفاً مبلغ شارژ مورد نظر را **به تومان** وارد کنید (مثلاً 100000):"
    )
    await safe_edit_or_send(callback, text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.message(UserStates.waiting_for_trx_toman_amount)
async def process_trx_toman_amount(message: Message, state: FSMContext):
    if not message.text.isdigit():
        await message.answer("لطفاً فقط عدد وارد کنید:")
        return

    toman_amount = int(message.text)
    if toman_amount < 10000:
        await message.answer("مبلغ شارژ باید حداقل ۱۰,۰۰۰ تومان باشد:")
        return

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='trx_wallet'") as cursor:
            trx_wallet = (await cursor.fetchone())[0]

    trx_toman_price = await get_live_trx_toman_price()
    trx_amount = round(toman_amount / trx_toman_price, 2)

    user_id = message.from_user.id
    memo_comment = f"charge_{user_id}"

    await state.clear()

    builder = InlineKeyboardBuilder()
    builder.button(text="🔄 تایید و بررسی واریزی", callback_data=f"verify_trx_{user_id}_{toman_amount}")
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)

    text = (
        f"🔴 **فاکتور واریز ترون (TRX)**\n\n"
        f"💰 مبلغ درخواست: **{toman_amount:,} تومان**\n"
        f"💠 معادل ارزی: **{trx_amount} TRX**\n\n"
        f"📌 **آدرس ولت مقصد:**\n`{trx_wallet}`\n\n"
        f"📌 **شناسه واریز (Note/Comment):**\n`{memo_comment}`\n\n"
        f"۱. مقدار **{trx_amount} TRX** را به آدرس بالا واریز نمایید.\n"
        f"۲. حتماً شناسه `{memo_comment}` را در بخش Note/Memo ثبت کنید.\n"
        f"۳. پس از انجام انتقال، روی دکمه **تایید و بررسی واریزی** بزنید."
    )
    await message.answer(text, reply_markup=builder.as_markup(), parse_mode="Markdown")

@router.callback_query(F.data.startswith("verify_trx_"))
async def verify_trx_payment_handler(callback: CallbackQuery, bot: Bot):
    parts = callback.data.split("_")
    target_user_id = int(parts[2])
    toman_amount = int(parts[3])
    memo_comment = f"charge_{target_user_id}"

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT value FROM settings WHERE key='trx_wallet'") as cursor:
            trx_wallet = (await cursor.fetchone())[0]

    async with aiohttp.ClientSession() as session:
        url = f"https://apilist.tronscanapi.com/api/transaction-info?address={trx_wallet}&limit=15"
        try:
            async with session.get(url, timeout=7) as resp:
                if resp.status == 200:
                    data = await resp.json()
                    transactions = data.get("data", [])
                    
                    payment_found = False
                    for tx in transactions:
                        comment = tx.get("note", "") or tx.get("data", "")
                        if memo_comment in str(comment) and tx.get("toAddress") == trx_wallet:
                            payment_found = True
                            break

                    if payment_found:
                        async with aiosqlite.connect(DB_PATH) as db:
                            await db.execute("UPDATE users SET balance = balance + ? WHERE user_id = ?", (toman_amount, target_user_id))
                            await db.commit()

                        await process_referral_reward(target_user_id, toman_amount, bot)

                        await safe_edit_or_send(
                            callback,
                            f"🎉 **واریزی ترون شما تایید شد!**\n\n💰 مبلغ **{toman_amount:,} تومان** به کیف پول شما اضافه گردید."
                        )
                        return
        except Exception:
            pass

    await callback.answer("⌛ هنوز تراکنشی در شبکه ترون یافت نشد. پس از نهایی شدن انتقال مجدداً بزنید.", show_alert=True)

# ==================== ۹. انتخاب و پیش‌نمایش محصول ====================
@router.callback_query(F.data.startswith("cat_"))
async def show_category_products(callback: CallbackQuery):
    cat_id = int(callback.data.split("_")[1])
    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT id, name, price, delivery_type FROM products WHERE category_id = ?", (cat_id,)) as cursor:
            products = await cursor.fetchall()

    builder = InlineKeyboardBuilder()
    if not products:
        builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
        await safe_edit_or_send(callback, "⚠️ هیچ محصولی در این دسته‌بندی یافت نشد.", reply_markup=builder.as_markup())
        return

    for p_id, p_name, p_price, p_type in products:
        tag = "🌐 " if p_type == "vpn" else ""
        builder.button(text=f"{tag}{p_name} | {p_price:,} تومان", callback_data=f"preview_p_{p_id}")
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)
    await safe_edit_or_send(callback, "محصول مورد نظر را جهت مشاهده و خرید انتخاب کنید:", reply_markup=builder.as_markup())

@router.callback_query(F.data.startswith("preview_p_"))
async def preview_product_handler(callback: CallbackQuery, state: FSMContext):
    p_id = int(callback.data.split("_")[2])
    text, reply_markup, media_type, media_file_id = await render_product_preview(callback.from_user.id, p_id, state)

    if not text:
        await callback.answer("❌ محصول موجود نیست.", show_alert=True)
        return

    if media_type and media_file_id:
        try:
            await callback.message.delete()
        except Exception:
            pass

        if media_type == "photo":
            await callback.message.answer_photo(photo=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
        elif media_type == "video":
            await callback.message.answer_video(video=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
        elif media_type == "animation":
            await callback.message.answer_animation(animation=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
    else:
        await safe_edit_or_send(callback, text, reply_markup=reply_markup, parse_mode="Markdown")

@router.callback_query(F.data.startswith("enter_discount_"))
async def enter_discount_start(callback: CallbackQuery, state: FSMContext):
    p_id = int(callback.data.split("_")[2])
    await state.update_data(target_preview_prod_id=p_id)
    await state.set_state(UserStates.waiting_for_discount_code_input)

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو", callback_data=f"preview_p_{p_id}", style="danger")

    await safe_edit_or_send(callback, "🏷️ لطفاً کد تخفیف خود را وارد کنید:", reply_markup=builder.as_markup())

@router.message(UserStates.waiting_for_discount_code_input)
async def process_discount_code_input(message: Message, state: FSMContext):
    code_text = message.text.strip().upper()
    data = await state.get_data()
    p_id = data.get("target_preview_prod_id")

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT discount_type, value, scope, target_id FROM discount_codes WHERE code = ?", (code_text,)) as cursor:
            code_row = await cursor.fetchone()

    if not code_row:
        await message.answer("❌ کد تخفیف وارد شده معتبر نیست!")
    else:
        await state.update_data(applied_discount={
            "code": code_text,
            "type": code_row[0],
            "value": code_row[1],
            "scope": code_row[2],
            "target_id": code_row[3]
        })
        await message.answer("✅ کد تخفیف بررسی شد.")

    text, reply_markup, media_type, media_file_id = await render_product_preview(message.from_user.id, p_id, state)
    if text:
        if media_type and media_file_id:
            if media_type == "photo":
                await message.answer_photo(photo=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
            elif media_type == "video":
                await message.answer_video(video=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
            elif media_type == "animation":
                await message.answer_animation(animation=media_file_id, caption=text, reply_markup=reply_markup, parse_mode="Markdown")
        else:
            await message.answer(text, reply_markup=reply_markup, parse_mode="Markdown")

# ==================== ۱۰. تایید نهایی خرید و ارسال به کانال گزارشات ====================
@router.callback_query(F.data.startswith("confirm_buy_"))
async def confirm_buy_handler(callback: CallbackQuery, bot: Bot, state: FSMContext):
    p_id = int(callback.data.split("_")[2])
    user_id = callback.from_user.id
    username = callback.from_user.username or "بدون یوزرنیم"

    data = await state.get_data()
    stored_final_price = data.get("final_price")

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT name, price, delivery_type, stock_data FROM products WHERE id = ?", (p_id,)) as cursor:
            prod = await cursor.fetchone()
        async with db.execute("SELECT balance FROM users WHERE user_id = ?", (user_id,)) as cursor:
            balance = (await cursor.fetchone())[0]

    if not prod:
        await callback.answer("❌ محصول یافت نشد.", show_alert=True)
        return

    name, original_price, del_type, stock = prod
    price = stored_final_price if stored_final_price is not None else original_price
    
    if balance < price:
        builder = InlineKeyboardBuilder()
        builder.button(text="💳 شارژ حساب", callback_data="charge_wallet", style="success")
        builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
        await safe_edit_or_send(
            callback,
            f"❌ **موجودی شما کافی نیست!**\n\n"
            f"مبلغ قابل پرداخت: {price:,} تومان\n"
            f"موجودی شما: {balance:,} تومان", 
            reply_markup=builder.as_markup()
        )
        return

    await state.clear()

    # --- ۱. خرید وی‌پی‌ان (VPN) ---
    if del_type == "vpn":
        async with aiosqlite.connect(DB_PATH) as db:
            async with db.execute(
                "SELECT id, link FROM vpn_stock WHERE product_id = ? AND status = 'available' LIMIT 1",
                (p_id,)
            ) as cursor:
                vpn_item = await cursor.fetchone()

            if not vpn_item:
                await callback.answer("❌ متأسفانه موجودی این وی‌پی‌ان به پایان رسیده است!", show_alert=True)
                return

            stock_id, vpn_link = vpn_item

            await db.execute("UPDATE users SET balance = balance - ? WHERE user_id = ?", (price, user_id))

            cursor_ord = await db.execute(
                "INSERT INTO orders (user_id, product_id, price, status, delivered_content) VALUES (?, ?, ?, 'تکمیل شده', ?)",
                (user_id, p_id, price, vpn_link)
            )
            order_id = cursor_ord.lastrowid

            await db.execute(
                "UPDATE vpn_stock SET status = 'sold', used_by = ?, order_id = ? WHERE id = ?",
                (user_id, order_id, stock_id)
            )
            await db.commit()

        await process_referral_reward(user_id, price, bot)
        await send_purchase_log_to_channel(bot, user_id, name, price, del_type)

        builder = InlineKeyboardBuilder()
        builder.button(text="🌐 وی‌پی‌ان‌های من", callback_data="my_vpn_accounts", style="success")
        builder.button(text="🏠 منوی اصلی", callback_data="back_to_main")
        builder.adjust(1)

        await safe_edit_or_send(
            callback,
            f"🎉 **خرید وی‌پی‌ان با موفقیت انجام شد!**\n\n"
            f"📦 **محصول:** {name}\n"
            f"📌 **شناسه سفارش:** #{order_id}\n\n"
            f"🔑 **لینک کانکشن اختصاصی شما (روی کد بزنید تا کپی شود):**\n\n"
            f"`{vpn_link}`\n\n"
            f"💡 *همچنین می‌توانید هر زمان با کلیک روی دکمه «وی‌پی‌ان‌های من» در منوی اصلی، مجدداً به این لینک دسترسی داشته باشید.*",
            reply_markup=builder.as_markup(),
            parse_mode="Markdown"
        )
        return

    # --- ۲. تحویل خودکار معمولی ---
    if del_type == "auto":
        async with aiosqlite.connect(DB_PATH) as db:
            await db.execute("UPDATE users SET balance = balance - ? WHERE user_id = ?", (price, user_id))
            cursor = await db.execute(
                "INSERT INTO orders (user_id, product_id, price, status, delivered_content) VALUES (?, ?, ?, 'تکمیل شده', ?)",
                (user_id, p_id, price, stock)
            )
            order_id = cursor.lastrowid
            await db.commit()

        await process_referral_reward(user_id, price, bot)
        await send_purchase_log_to_channel(bot, user_id, name, price, del_type)

        await safe_edit_or_send(
            callback,
            f"✅ **خرید با موفقیت انجام شد!**\n\n"
            f"📦 **محصول:** {name}\n\n"
            f"👇 **محتویات سفارش شما در ادامه ارسال می‌گردد:**", 
            parse_mode="Markdown"
        )

        try:
            items = json.loads(stock)
            if isinstance(items, list):
                for item in items:
                    i_type = item.get("type")
                    if i_type == "photo":
                        await bot.send_photo(user_id, photo=item["file_id"], caption=item.get("caption", ""))
                    elif i_type == "document":
                        await bot.send_document(user_id, document=item["file_id"], caption=item.get("caption", ""))
                    elif i_type == "video":
                        await bot.send_video(user_id, video=item["file_id"], caption=item.get("caption", ""))
                    elif i_type == "text":
                        await bot.send_message(user_id, text=item["text"])
            else:
                await bot.send_message(user_id, text=f"🔑 **اطلاعات تحویلی:**\n\n`{stock}`", parse_mode="Markdown")
        except Exception:
            await bot.send_message(user_id, text=f"🔑 **اطلاعات تحویلی:**\n\n`{stock}`", parse_mode="Markdown")

    # --- ۳. تحویل دستی ---
    else:
        async with aiosqlite.connect(DB_PATH) as db:
            await db.execute("UPDATE users SET balance = balance - ? WHERE user_id = ?", (price, user_id))
            cursor = await db.execute(
                "INSERT INTO orders (user_id, product_id, price, status) VALUES (?, ?, ?, 'در حال انجام')",
                (user_id, p_id, price)
            )
            order_id = cursor.lastrowid
            await db.commit()

        await process_referral_reward(user_id, price, bot)
        await send_purchase_log_to_channel(bot, user_id, name, price, del_type)

        await safe_edit_or_send(
            callback,
            f"✅ **سفارش شما ثبت شد.**\n\n"
            f"📦 **محصول:** {name}\n"
            f"📌 **شناسه سفارش:** #{order_id}\n"
            f"⏳ **وضعیت:** `در حال انجام` (به محض آماده‌سازی توسط ادمین ارسال خواهد شد)", 
            parse_mode="Markdown"
        )
        
        async with aiosqlite.connect(DB_PATH) as db:
            async with db.execute("SELECT user_id FROM admins") as cursor:
                db_admins = [r[0] for row in await cursor.fetchall()]

        all_admins = set(ADMIN_IDS + db_admins)
        for admin_id in all_admins:
            try:
                await bot.send_message(
                    admin_id, 
                    f"📥 **سفارش دستی جدید (#{order_id})**\n"
                    f"📦 محصول: {name}\n"
                    f"👤 کاربر: @{username}\n"
                    f"🆔 آیدی عددی: `{user_id}`", 
                    parse_mode="Markdown"
                )
            except Exception:
                pass

# ==================== ۱۱. سیستم پشتیبانی و تیکت ====================
@router.callback_query(F.data == "support_tickets")
async def support_menu(callback: CallbackQuery):
    builder = InlineKeyboardBuilder()
    builder.button(text="➕ ثبت تیکت جدید", callback_data="new_ticket", style="success")
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    builder.adjust(1)
    await safe_edit_or_send(
        callback,
        "🎫 **بخش پشتیبانی**\n\nجهت ارتباط با پشتیبانی، تیکت جدید ثبت کنید:", 
        reply_markup=builder.as_markup(), 
        parse_mode="Markdown"
    )

@router.callback_query(F.data == "new_ticket")
async def new_ticket_start(callback: CallbackQuery, state: FSMContext):
    await state.set_state(UserStates.waiting_for_ticket_msg)
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ لغو و بازگشت", callback_data="back_to_main", style="danger")
    await safe_edit_or_send(callback, "📝 لطفاً پیام یا سوال خود را ارسال کنید:", reply_markup=builder.as_markup())

@router.message(UserStates.waiting_for_ticket_msg)
async def new_ticket_save(message: Message, state: FSMContext, bot: Bot):
    user_id = message.from_user.id
    username = message.from_user.username or "بدون یوزرنیم"
    text = message.text or message.caption or "بدون متن"
    photo_id = message.photo[-1].file_id if message.photo else None

    async with aiosqlite.connect(DB_PATH) as db:
        cursor = await db.execute("INSERT INTO tickets (user_id, subject) VALUES (?, ?)", (user_id, text[:30]))
        ticket_id = cursor.lastrowid
        await db.execute(
            "INSERT INTO ticket_messages (ticket_id, sender, message_text, photo_id) VALUES (?, 'user', ?, ?)",
            (ticket_id, text, photo_id)
        )
        await db.commit()

    await state.clear()
    is_admin = await check_is_admin(user_id)
    await message.answer("✅ تیکت شما با موفقیت ثبت شد و به زودی توسط پشتیبانی پاسخ داده می‌شود.", reply_markup=await get_main_menu_keyboard(is_admin))

    admin_btn = InlineKeyboardBuilder()
    admin_btn.button(text="💬 پاسخ به تیکت", callback_data=f"reply_tk_{ticket_id}", style="primary")

    async with aiosqlite.connect(DB_PATH) as db:
        async with db.execute("SELECT user_id FROM admins") as cursor:
            db_admins = [r[0] for row in await cursor.fetchall()]

    all_admins = set(ADMIN_IDS + db_admins)
    for admin_id in all_admins:
        try:
            await bot.send_message(
                admin_id, 
                f"📩 **تیکت جدید (#{ticket_id})**\n"
                f"👤 کاربر: @{username}\n"
                f"🆔 آیدی عددی: `{user_id}`\n\n"
                f"💬 متن: {text}", 
                reply_markup=admin_btn.as_markup(), 
                parse_mode="Markdown"
            )
        except Exception:
            pass