#!/usr/bin/env python3
import os
import sys
import logging
import json
from datetime import datetime
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler, Filters

# --- تنظیمات ---
TOKEN = "8575116565:AAGmfMUyJGcB9Fb02KhqxIg108AiBumrMCA"
ADMIN_ID = 8438594855

ORDERS_FILE = "orders.json"
BLOCKED_FILE = "blocked_users.json"
USERS_FILE = "users.json"

# قیمت‌ها (هر گیگابایت = ۵۰,۰۰۰ میو پوینت)
PRICES = {
    "1G": 50000,
    "5G": 250000,
    "10G": 500000,
    "20G": 1000000,
    "50G": 2500000,
}

MIU_CARD_NUMBER = "924899704940"

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

# ============= مدیریت فایل‌ها =============

def load_orders():
    if os.path.exists(ORDERS_FILE):
        with open(ORDERS_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

def save_orders(orders):
    with open(ORDERS_FILE, 'w', encoding='utf-8') as f:
        json.dump(orders, f, ensure_ascii=False, indent=2)

def load_blocked_users():
    if os.path.exists(BLOCKED_FILE):
        with open(BLOCKED_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {"users": []}

def save_blocked_users(data):
    with open(BLOCKED_FILE, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def load_users():
    if os.path.exists(USERS_FILE):
        with open(USERS_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

def save_users(users):
    with open(USERS_FILE, 'w', encoding='utf-8') as f:
        json.dump(users, f, ensure_ascii=False, indent=2)

def generate_order_id():
    orders = load_orders()
    return str(len(orders) + 1)

def is_user_blocked(user_id):
    blocked = load_blocked_users()
    return str(user_id) in blocked['users']

def add_user_to_list(user_id, username, first_name):
    users = load_users()
    if str(user_id) not in users:
        users[str(user_id)] = {
            'username': username,
            'first_name': first_name,
            'joined_date': datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        save_users(users)
        return True
    return False

# ============= هندلرهای اصلی =============

def start(update, context):
    user = update.effective_user
    user_id = user.id
    username = user.username or "ندارد"
    first_name = user.first_name
    
    if is_user_blocked(user_id):
        update.message.reply_text("🚫 شما توسط ادمین بلاک شده‌اید و نمی‌توانید از ربات استفاده کنید.")
        return
    
    add_user_to_list(user_id, username, first_name)
    
    welcome_text = (
        f"👋 سلام {user.first_name}!\n"
        "به ربات فروش کانفیگ خوش آمدید.\n\n"
        "📌 لطفاً یکی از گزینه‌های زیر را انتخاب کنید:\n"
    )
    keyboard = [
        [InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")],
        [InlineKeyboardButton("📋 وضعیت سفارشات", callback_data="my_orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    
    if user_id == ADMIN_ID:
        keyboard.append([InlineKeyboardButton("📊 آمار ربات", callback_data="admin_stats")])
        keyboard.append([InlineKeyboardButton("🚫 مدیریت بلاک", callback_data="admin_block_menu")])
        keyboard.append([InlineKeyboardButton("📢 پیام همگانی", callback_data="admin_broadcast")])
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(welcome_text, reply_markup=reply_markup)

def help_command(update, context):
    user_id = update.effective_user.id
    if is_user_blocked(user_id):
        if update.callback_query:
            update.callback_query.edit_message_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        else:
            update.message.reply_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    if update.callback_query:
        query = update.callback_query
        query.answer()
        message = query.message
        edit = True
    else:
        message = update.message
        edit = False
    
    help_text = (
        "📌 **راهنمای استفاده از ربات**\n\n"
        "💡 **چگونه کانفیگ بگیریم؟**\n"
        "1️⃣ روی دکمه '🛒 خرید کانفیگ' کلیک کنید.\n"
        "2️⃣ حجم مورد نظر خود را انتخاب کنید.\n"
        "3️⃣ مبلغ میو پوینت را به شماره کارت زیر واریز کنید:\n"
        f"   🏦 شماره کارت میویی: `{MIU_CARD_NUMBER}`\n\n"
        "4️⃣ رسید را به صورت **متن** در ربات ارسال کنید.\n"
        "5️⃣ منتظر تأیید ادمین باشید.\n"
        "6️⃣ پس از تأیید، لینک اشتراک برای شما ارسال می‌شود.\n\n"
        "📊 **قیمت‌ها:**\n"
        "• 1 گیگابایت = ۵۰,۰۰۰ میو پوینت\n"
        "• 5 گیگابایت = ۲۵۰,۰۰۰ میو پوینت\n"
        "• 10 گیگابایت = ۵۰۰,۰۰۰ میو پوینت\n"
        "• 20 گیگابایت = ۱,۰۰۰,۰۰۰ میو پوینت\n"
        "• 50 گیگابایت = ۲,۵۰۰,۰۰۰ میو پوینت\n\n"
        "✅ با میو پوینت‌های خود به راحتی کانفیگ بگیرید!"
    )
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    if edit:
        query.edit_message_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')
    else:
        message.reply_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')

def my_orders(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    if is_user_blocked(user_id):
        query.edit_message_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    orders = load_orders()
    user_orders = [o for o in orders.values() if o.get("user_id") == user_id]
    
    if not user_orders:
        text = "📭 **شما هیچ سفارشی ندارید!**\n\nبرای ثبت سفارش جدید، روی دکمه 'خرید کانفیگ' کلیک کنید."
        keyboard = [[InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")]]
        reply_markup = InlineKeyboardMarkup(keyboard)
        query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
        return
    
    text = "📋 **لیست سفارشات شما:**\n\n"
    status_emoji = {
        "pending": "⏳",
        "approved": "✅",
        "rejected": "❌",
        "completed": "🎉"
    }
    status_text = {
        "pending": "در انتظار تأیید",
        "approved": "تأیید شده - در انتظار لینک",
        "rejected": "رد شده",
        "completed": "تکمیل شده"
    }
    
    for i, order in enumerate(user_orders, 1):
        status = order.get('status', 'pending')
        emoji = status_emoji.get(status, '❓')
        text += (
            f"{i}. 📦 **حجم:** {order['volume']}\n"
            f"   💰 **مبلغ:** {order['price']:,} میو پوینت\n"
            f"   {emoji} **وضعیت:** {status_text.get(status, 'نامشخص')}\n"
            f"   📅 **تاریخ:** {order.get('date', 'نامشخص')}\n"
        )
        if status == 'completed' and 'subscription_link' in order:
            text += f"   🔗 **لینک:** `{order['subscription_link']}`\n"
        text += "\n"
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')

def buy_config(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    if is_user_blocked(user_id):
        query.edit_message_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    keyboard = [
        [InlineKeyboardButton("📶 1 گیگابایت - ۵۰,۰۰۰ میو پوینت", callback_data="vol_1G")],
        [InlineKeyboardButton("📶 5 گیگابایت - ۲۵۰,۰۰۰ میو پوینت", callback_data="vol_5G")],
        [InlineKeyboardButton("📶 10 گیگابایت - ۵۰۰,۰۰۰ میو پوینت", callback_data="vol_10G")],
        [InlineKeyboardButton("📶 20 گیگابایت - ۱,۰۰۰,۰۰۰ میو پوینت", callback_data="vol_20G")],
        [InlineKeyboardButton("📶 50 گیگابایت - ۲,۵۰۰,۰۰۰ میو پوینت", callback_data="vol_50G")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_main")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(
        "📊 **لطفاً حجم مورد نظر خود را انتخاب کنید:**",
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )

def select_volume(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    if is_user_blocked(user_id):
        query.edit_message_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    volume = query.data.split("_")[1]
    price = PRICES[volume]
    
    context.user_data['order'] = {
        'volume': volume,
        'price': price,
        'user_id': user_id,
        'status': 'pending',
        'status_text': 'در انتظار پرداخت',
        'date': datetime.now().strftime("%Y-%m-%d %H:%M")
    }
    
    text = (
        f"📦 **حجم انتخابی:** {volume}\n"
        f"💰 **مبلغ قابل پرداخت:** {price:,} میو پوینت\n\n"
        f"💳 لطفاً مبلغ را به شماره کارت میویی زیر واریز کنید:\n"
        f"🏦 **شماره کارت:** `{MIU_CARD_NUMBER}`\n\n"
        "✅ پس از واریز، **رسید را به صورت متن** در همینجا ارسال کنید.\n"
        "مثال: مبلغ ۵۰,۰۰۰ میو پوینت به شماره کارت ... واریز شد. کد پیگیری: ۱۲۳۴۵\n\n"
        "⚠️ لطفاً فقط یکبار رسید را ارسال کنید."
    )
    keyboard = [[InlineKeyboardButton("🔙 بازگشت", callback_data="buy_config")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
    
    context.user_data['awaiting_receipt'] = True

def handle_receipt(update, context):
    user_id = update.effective_user.id
    
    if is_user_blocked(user_id):
        update.message.reply_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    if update.effective_user.id == ADMIN_ID:
        return
    
    if not context.user_data.get('awaiting_receipt'):
        update.message.reply_text(
            "⚠️ در حال حاضر درخواست خرید فعالی ندارید.\n"
            "لطفاً از منوی اصلی شروع کنید."
        )
        return
    
    user = update.effective_user
    order = context.user_data.get('order')
    
    if not order:
        update.message.reply_text("❌ خطا در اطلاعات سفارش. لطفاً دوباره تلاش کنید.")
        return
    
    if not update.message.text:
        update.message.reply_text("❌ لطفاً رسید خود را به صورت متن ارسال کنید.")
        return
    
    receipt_text = update.message.text
    order['receipt'] = receipt_text
    order['status'] = 'pending'
    order['status_text'] = 'در انتظار تأیید ادمین'
    
    orders = load_orders()
    order_id = generate_order_id()
    orders[order_id] = order
    save_orders(orders)
    
    admin_text = (
        f"🆕 **سفارش جدید دریافت شد!**\n\n"
        f"🆔 **شماره سفارش:** {order_id}\n"
        f"👤 **کاربر:** {user.first_name} (ID: {user_id})\n"
        f"📦 **حجم:** {order['volume']}\n"
        f"💰 **مبلغ:** {order['price']:,} میو پوینت\n"
        f"📝 **رسید:** {receipt_text}\n"
        f"📅 **تاریخ:** {order['date']}\n\n"
        "لطفاً رسید را بررسی کنید."
    )
    
    keyboard = [
        [InlineKeyboardButton("✅ تأیید سفارش", callback_data=f"approve_{order_id}")],
        [InlineKeyboardButton("❌ رد سفارش", callback_data=f"reject_{order_id}")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    context.bot.send_message(
        chat_id=ADMIN_ID,
        text=admin_text,
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )
    
    update.message.reply_text(
        "✅ رسید شما با موفقیت ثبت شد.\n"
        "⏳ منتظر تأیید ادمین باشید.\n"
        "پس از تأیید، لینک اشتراک برای شما ارسال می‌شود."
    )
    
    context.user_data['awaiting_receipt'] = False

# ============= مدیریت ادمین =============

def admin_stats(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    users = load_users()
    orders = load_orders()
    blocked = load_blocked_users()
    
    total_orders = len(orders)
    pending_orders = len([o for o in orders.values() if o.get('status') == 'pending'])
    completed_orders = len([o for o in orders.values() if o.get('status') == 'completed'])
    rejected_orders = len([o for o in orders.values() if o.get('status') == 'rejected'])
    
    total_income = sum([o.get('price', 0) for o in orders.values() if o.get('status') == 'completed'])
    
    active_users = len([u for u in users.keys() if str(u) not in blocked['users']])
    
    stats_text = (
        "📊 **آمار ربات**\n\n"
        f"👥 **تعداد کل کاربران:** {len(users)}\n"
        f"✅ **کاربران فعال:** {active_users}\n"
        f"🚫 **کاربران بلاک شده:** {len(blocked['users'])}\n"
        f"📦 **تعداد کل سفارشات:** {total_orders}\n"
        f"⏳ **سفارشات در انتظار:** {pending_orders}\n"
        f"✅ **سفارشات موفق:** {completed_orders}\n"
        f"❌ **سفارشات رد شده:** {rejected_orders}\n"
        f"💰 **کل درآمد:** {total_income:,} میو پوینت\n\n"
        "📋 **۱۰ کاربر آخر:**\n"
    )
    
    users_list = list(users.items())
    for i, (user_id, user_data) in enumerate(users_list[-10:], 1):
        is_blocked = "🚫" if str(user_id) in blocked['users'] else "✅"
        stats_text += (
            f"{i}. {is_blocked} {user_data.get('first_name', 'نامشخص')} "
            f"(@{user_data.get('username', 'ندارد')})\n"
        )
    
    if len(users) > 10:
        stats_text += f"\nو {len(users) - 10} کاربر دیگر..."
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(stats_text, reply_markup=reply_markup, parse_mode='Markdown')

def admin_block_menu(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    blocked = load_blocked_users()
    users = load_users()
    
    blocked_list = []
    for uid in blocked['users']:
        if uid in users:
            blocked_list.append(f"🚫 {uid} ({users[uid].get('first_name', 'نامشخص')})")
        else:
            blocked_list.append(f"🚫 {uid}")
    
    blocked_text = "\n".join(blocked_list) if blocked_list else "هیچ کاربری بلاک نیست"
    
    text = (
        "🚫 **مدیریت بلاک کاربران**\n\n"
        "📋 **لیست کاربران بلاک شده:**\n"
        f"{blocked_text}\n\n"
        "📌 **دستورات:**\n"
        "• برای بلاک: `/block [آیدی عددی]`\n"
        "• برای آنبلاک: `/unblock [آیدی عددی]`\n"
        "• مثال: `/block 123456789`"
    )
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')

def admin_broadcast(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    text = (
        "📢 **ارسال پیام همگانی**\n\n"
        "لطفاً پیام خود را به صورت **متن** در پیام بعدی ارسال کنید.\n"
        "پیام به همه کاربران ارسال خواهد شد.\n\n"
        "⚠️ توجه: کاربران بلاک شده پیام را دریافت نمی‌کنند."
    )
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
    
    context.user_data['awaiting_broadcast'] = True

def handle_broadcast(update, context):
    """ارسال پیام همگانی به همه کاربران"""
    if update.effective_user.id != ADMIN_ID:
        return
    
    if not context.user_data.get('awaiting_broadcast'):
        return
    
    message_text = update.message.text
    users = load_users()
    blocked = load_blocked_users()
    
    update.message.reply_text("⏳ در حال ارسال پیام به کاربران...")
    
    sent = 0
    failed = 0
    blocked_count = 0
    
    for user_id in users.keys():
        if str(user_id) not in blocked['users']:
            try:
                context.bot.send_message(
                    chat_id=int(user_id),
                    text=f"📢 **پیام همگانی از ادمین:**\n\n{message_text}",
                    parse_mode='Markdown'
                )
                sent += 1
            except Exception as e:
                failed += 1
                logger.error(f"خطا در ارسال به {user_id}: {e}")
        else:
            blocked_count += 1
    
    update.message.reply_text(
        f"✅ **پیام همگانی ارسال شد!**\n\n"
        f"📨 ارسال شده: {sent}\n"
        f"❌ ناموفق: {failed}\n"
        f"🚫 بلاک شده: {blocked_count}\n"
        f"👥 تعداد کل کاربران: {len(users)}"
    )
    
    context.user_data['awaiting_broadcast'] = False

def block_user(update, context):
    if update.effective_user.id != ADMIN_ID:
        update.message.reply_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    try:
        user_id_to_block = int(context.args[0])
    except (IndexError, ValueError):
        update.message.reply_text(
            "❌ لطفاً آیدی عددی کاربر را وارد کنید.\n"
            "مثال: `/block 123456789`"
        )
        return
    
    blocked = load_blocked_users()
    if str(user_id_to_block) in blocked['users']:
        update.message.reply_text(f"⚠️ کاربر {user_id_to_block} قبلاً بلاک شده است.")
        return
    
    blocked['users'].append(str(user_id_to_block))
    save_blocked_users(blocked)
    
    update.message.reply_text(f"✅ کاربر {user_id_to_block} با موفقیت بلاک شد.")
    
    try:
        context.bot.send_message(
            chat_id=user_id_to_block,
            text="🚫 شما توسط ادمین بلاک شده‌اید و نمی‌توانید از ربات استفاده کنید."
        )
    except:
        pass

def unblock_user(update, context):
    if update.effective_user.id != ADMIN_ID:
        update.message.reply_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    try:
        user_id_to_unblock = int(context.args[0])
    except (IndexError, ValueError):
        update.message.reply_text(
            "❌ لطفاً آیدی عددی کاربر را وارد کنید.\n"
            "مثال: `/unblock 123456789`"
        )
        return
    
    blocked = load_blocked_users()
    if str(user_id_to_unblock) not in blocked['users']:
        update.message.reply_text(f"⚠️ کاربر {user_id_to_unblock} بلاک نیست.")
        return
    
    blocked['users'] = [uid for uid in blocked['users'] if uid != str(user_id_to_unblock)]
    save_blocked_users(blocked)
    
    update.message.reply_text(f"✅ کاربر {user_id_to_unblock} آنبلاک شد.")
    
    try:
        context.bot.send_message(
            chat_id=user_id_to_unblock,
            text="✅ شما توسط ادمین آنبلاک شدید و می‌توانید از ربات استفاده کنید."
        )
    except:
        pass

def admin_approve(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    order_id = query.data.split("_")[1]
    orders = load_orders()
    
    if order_id not in orders:
        query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    order = orders[order_id]
    order['status'] = 'approved'
    order['status_text'] = 'تأیید شده - در انتظار ارسال لینک'
    save_orders(orders)
    
    # ذخیره order_id در context کاربری (نه general)
    context.user_data['sending_link_for'] = order_id
    
    query.edit_message_text(
        f"✅ **سفارش #{order_id} تأیید شد.**\n\n"
        f"👤 **کاربر:** {order['user_id']}\n"
        f"📦 **حجم:** {order['volume']}\n\n"
        "📤 لطفاً **لینک اشتراک** را در پیام بعدی ارسال کنید\n"
        "تا به کاربر تحویل داده شود.",
        parse_mode='Markdown'
    )

def admin_reject(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    order_id = query.data.split("_")[1]
    orders = load_orders()
    
    if order_id not in orders:
        query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    order = orders[order_id]
    user_id = order['user_id']
    order['status'] = 'rejected'
    order['status_text'] = 'رد شده توسط ادمین'
    save_orders(orders)
    
    if not is_user_blocked(user_id):
        try:
            context.bot.send_message(
                chat_id=user_id,
                text=f"❌ متأسفیم! سفارش شما (شماره {order_id}) رد شد.\n"
                     "لطفاً برای اطلاعات بیشتر با پشتیبانی تماس بگیرید."
            )
        except Exception as e:
            logger.error(f"خطا در ارسال پیام به کاربر: {e}")
    
    query.edit_message_text(f"✅ سفارش #{order_id} رد شد.")

def admin_send_subscription(update, context):
    """ارسال لینک اشتراک به کاربر توسط ادمین"""
    if update.effective_user.id != ADMIN_ID:
        return
    
    # دریافت order_id از context
    order_id = context.user_data.get('sending_link_for')
    
    if not order_id:
        update.message.reply_text(
            "❌ در حال تأیید سفارشی نیستید.\n"
            "لطفاً ابتدا یک سفارش را تأیید کنید."
        )
        return
    
    orders = load_orders()
    
    if order_id not in orders:
        update.message.reply_text("❌ سفارش یافت نشد.")
        context.user_data['sending_link_for'] = None
        return
    
    order = orders[order_id]
    user_id = order['user_id']
    subscription_link = update.message.text
    
    # بررسی بلاک بودن کاربر
    if is_user_blocked(user_id):
        update.message.reply_text(f"⚠️ کاربر {user_id} بلاک است، لینک ارسال نشد.")
        context.user_data['sending_link_for'] = None
        return
    
    try:
        # ارسال لینک به کاربر
        context.bot.send_message(
            chat_id=user_id,
            text=(
                f"🎉 **تبریک! سفارش شما تأیید شد!**\n\n"
                f"🆔 **شماره سفارش:** {order_id}\n"
                f"📦 **حجم:** {order['volume']}\n"
                f"🔗 **لینک اشتراک شما:**\n"
                f"`{subscription_link}`\n\n"
                "با تشکر از خرید شما! 🌟"
            ),
            parse_mode='Markdown'
        )
        
        # به‌روزرسانی وضعیت سفارش
        order['status'] = 'completed'
        order['status_text'] = 'تکمیل شده'
        order['subscription_link'] = subscription_link
        save_orders(orders)
        
        update.message.reply_text(
            f"✅ لینک اشتراک برای سفارش #{order_id} ارسال شد.\n"
            f"👤 کاربر: {user_id}"
        )
        
    except Exception as e:
        update.message.reply_text(f"❌ خطا در ارسال لینک: {e}")
    
    # پاک کردن context
    context.user_data['sending_link_for'] = None

def back_to_main(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    if is_user_blocked(user_id):
        query.edit_message_text("🚫 شما توسط ادمین بلاک شده‌اید.")
        return
    
    keyboard = [
        [InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")],
        [InlineKeyboardButton("📋 وضعیت سفارشات", callback_data="my_orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    
    if user_id == ADMIN_ID:
        keyboard.append([InlineKeyboardButton("📊 آمار ربات", callback_data="admin_stats")])
        keyboard.append([InlineKeyboardButton("🚫 مدیریت بلاک", callback_data="admin_block_menu")])
        keyboard.append([InlineKeyboardButton("📢 پیام همگانی", callback_data="admin_broadcast")])
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(
        "🏠 **به صفحه اصلی بازگشتید.**\n"
        "لطفاً یکی از گزینه‌های زیر را انتخاب کنید:",
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )

def error_handler(update, context):
    logger.error(f"Update {update} caused error {context.error}")

# ============= اجرای اصلی =============

def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    
    # دستورات
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help_command))
    dp.add_handler(CommandHandler("block", block_user))
    dp.add_handler(CommandHandler("unblock", unblock_user))
    
    # کالبک‌ها
    dp.add_handler(CallbackQueryHandler(buy_config, pattern="^buy_config$"))
    dp.add_handler(CallbackQueryHandler(select_volume, pattern="^vol_"))
    dp.add_handler(CallbackQueryHandler(back_to_main, pattern="^back_to_main$"))
    dp.add_handler(CallbackQueryHandler(my_orders, pattern="^my_orders$"))
    dp.add_handler(CallbackQueryHandler(help_command, pattern="^help$"))
    
    dp.add_handler(CallbackQueryHandler(admin_stats, pattern="^admin_stats$"))
    dp.add_handler(CallbackQueryHandler(admin_block_menu, pattern="^admin_block_menu$"))
    dp.add_handler(CallbackQueryHandler(admin_broadcast, pattern="^admin_broadcast$"))
    dp.add_handler(CallbackQueryHandler(admin_approve, pattern="^approve_"))
    dp.add_handler(CallbackQueryHandler(admin_reject, pattern="^reject_"))
    
    # هندلرهای پیام - ترتیب مهم است!
    # 1. هندلر broadcast برای ادمین
    dp.add_handler(MessageHandler(Filters.text & Filters.user(ADMIN_ID), handle_broadcast))
    
    # 2. هندلر ارسال لینک برای ادمین
    dp.add_handler(MessageHandler(Filters.text & Filters.user(ADMIN_ID), admin_send_subscription))
    
    # 3. هندلر دریافت رسید برای کاربران عادی
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.user(ADMIN_ID), handle_receipt))
    
    dp.add_error_handler(error_handler)
    
    logger.info("🤖 ربات فروش کانفیگ راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()