درین کد چرا بعضی تابع ها تکراری است: import logging
import os
import json
import re
from datetime import datetime, timedelta
from collections import defaultdict
from telegram import (
    Update, InlineKeyboardButton, InlineKeyboardMarkup
)
from telegram.ext import (
    Application, CommandHandler, MessageHandler, CallbackQueryHandler,
    ContextTypes, filters, ConversationHandler
)
import asyncio

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO,
    handlers=[
        logging.FileHandler('bot.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
ADMIN_ID = os.getenv("ADMIN_ID")
ADMIN_USERNAME = os.getenv("ADMIN_USERNAME")
CARD_NUMBER = os.getenv("CARD_NUMBER")
CARD_HOLDER = os.getenv("CARD_HOLDER")
EXCHANGE_RATE = float(os.getenv("EXCHANGE_RATE", "1300"))

DATA_FILE = 'orders_data.json'

ORDER_STATUS = {
    'pending': 'در انتظار پرداخت',
    'paid': 'پرداخت شده',
    'processing': 'در حال پردازش',
    'completed': 'تکمیل شده',
    'cancelled': 'لغو شده'
}

request_limits = defaultdict(list)

def check_rate_limit(user_id: str, limit: int = 5, window: int = 3600) -> bool:
    now = datetime.now()
    user_requests = request_limits[user_id]
    user_requests = [req for req in user_requests if now - req < timedelta(seconds=window)]
    request_limits[user_id] = user_requests

    if len(user_requests) >= limit:
        return False

    request_limits[user_id].append(now)
    return True

def load_orders_data():
    if os.path.exists(DATA_FILE):
        try:
            with open(DATA_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except json.JSONDecodeError:
            logger.error("خطا در بارگذاری فایل سفارش‌ها. فایل JSON خراب است.")
            return {}
    return {}

def save_orders_data(data):
    try:
        with open(DATA_FILE, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        backup_data(data)
    except Exception as e:
        logger.error(f"خطا در ذخیره‌سازی داده‌ها: {e}")

def backup_data(data):
    backup_file = f'backup_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json'
    try:
        with open(backup_file, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        logger.info(f"پشتیبان‌گیری انجام شد: {backup_file}")
    except Exception as e:
        logger.error(f"خطا در پشتیبان‌گیری داده‌ها: {e}")

def validate_name(name: str) -> bool:
    return bool(re.match(r'^[آ-یa-zA-Z\s]+$', name))

def validate_amount(amount: str) -> bool:
    try:
        value = int(amount)
        return 10 <= value <= 100000
    except ValueError:
        return False

def validate_phone(phone: str) -> bool:
    return bool(re.match(r'^0[0-9]{9}$', phone))

RECEIPTS_DIR = 'receipts'

def main_inline_keyboard():
    inline_keyboard = [
        [InlineKeyboardButton("🔄 ثبت سفارش شارژ", callback_data='new_order')],
        [InlineKeyboardButton("📜 تاریخچه سفارش‌ها", callback_data='history')],
        [InlineKeyboardButton("📞 تماس با پشتیبانی", callback_data='support')],
        [InlineKeyboardButton("ℹ️ راهنما", callback_data='help')]
    ]
    return InlineKeyboardMarkup(inline_keyboard)

async def handle_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    photo = update.message.photo[-1]
    file = await photo.get_file()
    file_path = file.file_path
    os.makedirs(RECEIPTS_DIR, exist_ok=True)
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    file_name = f"{RECEIPTS_DIR}/{user_id}_{timestamp}.jpg"
    try:
        await file.download_to_drive(file_name)
    except Exception as e:
        logger.error(f"خطا در دانلود عکس از کاربر {user_id}: {e}")
        await update.message.reply_text("❌ خطا در دریافت عکس. لطفاً مجدداً تلاش کنید.")
        return ConversationHandler.END
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id and o.get('status') == 'pending']
    if not user_orders:
        await update.message.reply_text("❌ سفارشی یافت نشد که منتظر ارسال رسید باشد.\nلطفاً با ادمین تماس بگیرید.")
        return ConversationHandler.END
    order = sorted(user_orders, key=lambda x: x['order_date'], reverse=True)[0]
    order_id = order['order_id']
    orders_data[order_id]['receipt'] = file_name
    orders_data[order_id]['status'] = 'processing'
    save_orders_data(orders_data)
    await update.message.reply_text(
        "✅ رسید پرداخت شما دریافت شد و در حال پردازش است. پس از تایید، شارژ سیم‌کارت شما اعمال خواهد شد.\n\nبرای پیگیری وضعیت سفارش می‌توانید از قسمت '📜 تاریخچه سفارش‌ها' استفاده کنید."
    )
    logger.info(f"دریافت رسید برای سفارش {order_id} از کاربر {user_id}")
    return ConversationHandler.END

orders_data = load_orders_data()

NAME, AMOUNT, PHONE, CONFIRM, RECEIPT = range(5)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if not check_rate_limit(user_id):
        await update.message.reply_text("⚠️ لطفاً کمی صبر کنید و سپس دوباره تلاش کنید.", reply_markup=None)
        return
    welcome_text = (
        f"سلام {update.effective_user.first_name} عزیز! 👋\n\n"
        "به ربات شارژ سیم‌کارت‌های افغانستان خوش آمدید.\n"
        "ما بهترین قیمت‌ها و سریع‌ترین خدمات را ارائه می‌دهیم.\n"
        "همین حالا شروع کنید و از تخفیفات ویژه بهره‌مند شوید!"
    )
    special_offer = (
        "🎉 پیشنهاد ویژه 🌟\n"
        "با شارژ بالای ۵۰۰ افغانی از تخفیف ۱۰٪ بهره‌مند شوید!"
    )
    await update.message.reply_text(welcome_text)
    await update.message.reply_text(special_offer, reply_markup=main_inline_keyboard())

async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    keyboard = [
        [InlineKeyboardButton("📊 مشاهده همه سفارش‌ها", callback_data='view_all_orders')],
        [InlineKeyboardButton("🔍 جستجوی سفارش", callback_data='search_order')],
        [InlineKeyboardButton("📈 آمار کلی", callback_data='statistics')],
        [InlineKeyboardButton("💱 تغییر نرخ تبدیل", callback_data='change_rate')],
        [InlineKeyboardButton("❌ حذف سفارش", callback_data='delete_order')],
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text(
        "🔰 پنل مدیریت\n"
        f"💱 نرخ فعلی تبدیل: هر افغانی = {EXCHANGE_RATE} تومان\n\n"
        "لطفاً یک گزینه را انتخاب کنید:",
        reply_markup=reply_markup
    )

async def verify_payment(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return
    if not context.args:
        await update.message.reply_text("❌ لطفاً شناسه سفارش را وارد کنید.\nمثال: /verify_payment ORDER_123")
        return
    order_id = context.args[0]
    if order_id in orders_data:
        orders_data[order_id]['status'] = 'paid'
        save_orders_data(orders_data)
        user_id = orders_data[order_id].get('user_id')
        if user_id:
            try:
                await context.bot.send_message(
                    chat_id=user_id,
                    text=f"✅ پرداخت سفارش {order_id} تایید شد و شارژ به زودی انجام خواهد شد."
                )
                await update.message.reply_text(f"✅ وضعیت سفارش {order_id} به 'پرداخت شده' تغییر کرد.")
                logger.info(f"سفارش {order_id} پرداخت شد و به کاربر {user_id} اطلاع داده شد.")
            except Exception as e:
                await update.message.reply_text("❌ خطا در ارسال پیام به کاربر.")
                logger.error(f"Error sending message to user {user_id}: {e}")
    else:
        await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")

async def generate_report(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return
    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])
    report = f"""📊 گزارش عملکرد:

📦 کل سفارش‌ها: {total_orders}
✅ سفارش‌های تکمیل شده: {completed_orders}
⏳ سفارش‌های در انتظار: {pending_orders}
💰 درآمد کل: {total_revenue:,} تومان
    """
    await update.message.reply_text(report)
    logger.info("گزارش عملکرد توسط ادمین تولید شد.")

def get_button_actions():
    return {
        'view_all_orders': show_all_orders,
        'search_order': start_order_search,
        'statistics': show_statistics,
        'change_rate': start_rate_change,
        'delete_order': start_order_delete,
        'back_to_main': cancel_order,
        'new_order': start_order,
        'history': show_history,
        'support': show_support,
        'help': show_help
    }

async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    button_actions = get_button_actions()
    action = button_actions.get(query.data)
    if action:
        await action(update, context)
    else:
        await query.message.reply_text("🚫 عملکرد مربوطه پیدا نشد.")

async def start_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(
        "👤 لطفاً نام و نام خانوادگی خود را وارد کنید:",
        reply_markup=reply_markup
    )
    return NAME

async def order_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    text = update.message.text.strip()
    if not validate_name(text):
        await update.message.reply_text("❌ لطفاً نام و نام خانوادگی را به درستی وارد کنید (فقط حروف و فاصله).")
        return NAME
    context.user_data['name'] = text
    await update.message.reply_text("💰 لطفاً مقدار شارژ مورد نظر را به افغانی وارد کنید:")
    return AMOUNT

async def order_amount(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    if not validate_amount(text):
        await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید (بین ۱۰ تا ۱۰۰٬۰۰۰ افغانی).")
        return AMOUNT
    amount = int(text)
    context.user_data['amount'] = amount
    await update.message.reply_text("📱 لطفاً شماره تلفن مقصد را وارد کنید:")
    return PHONE

async def order_phone(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    if not validate_phone(text):
        await update.message.reply_text("❌ لطفاً یک شماره تلفن معتبر وارد کنید (مثلاً ۰۷۱۲۳۴۵۶۷۸۹).")
        return PHONE
    context.user_data['phone'] = text
    await show_invoice(update, context)
    return CONFIRM

async def show_invoice(update: Update, context: ContextTypes.DEFAULT_TYPE):
    order_data = context.user_data
    amount_af = int(order_data['amount'])
    amount_ir = amount_af * EXCHANGE_RATE
    invoice_text = (
        "📋 پیش‌فاکتور سفارش شما:\n\n"
        f"👤 نام و نام خانوادگی: {order_data['name']}\n"
        f"💰 مقدار شارژ: {amount_af} افغانی\n"
        f"💶 مبلغ قابل پرداخت: {amount_ir:,} تومان\n"
        f"📱 شماره تلفن مقصد: {order_data['phone']}\n\n"
        f"💳 شماره کارت جهت واریز:\n"
        f"{CARD_NUMBER}\n"
        f"بنام: {CARD_HOLDER}\n\n"
        "لطفاً صحت اطلاعات را بررسی و تأیید کنید."
    )
    keyboard = [
        [
            InlineKeyboardButton("✅ تأیید و پرداخت", callback_data='confirm_order'),
            InlineKeyboardButton("❌ لغو سفارش", callback_data='cancel_order')
        ],
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(invoice_text, reply_markup=reply_markup)

async def confirm_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    order_data = context.user_data
    amount_af = int(order_data['amount'])
    amount_ir = amount_af * EXCHANGE_RATE
    order_id = f"ORDER_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
    order_data['order_id'] = order_id
    order_data['status'] = 'pending'
    order_data['order_date'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    order_data['amount_ir'] = amount_ir
    order_data['user_id'] = user_id
    orders_data[order_id] = order_data.copy()
    save_orders_data(orders_data)
    admin_message = (
        "🆕 سفارش جدید:\n\n"
        f"🔹 شناسه سفارش: {order_id}\n"
        f"👤 نام مشتری: {order_data['name']}\n"
        f"💰 مقدار شارژ: {amount_af} افغانی\n"
        f"💶 مبلغ به تومان: {amount_ir:,} تومان\n"
        f"📱 شماره تلفن: {order_data['phone']}\n"
        f"📅 تاریخ: {order_data['order_date']}"
    )
    try:
        await context.bot.send_message(chat_id=ADMIN_ID, text=admin_message)
        logger.info(f"سفارش {order_id} توسط کاربر {user_id} ثبت شد.")
    except Exception as e:
        logger.error(f"Failed to send message to admin: {e}")
    payment_text = (
        "✅ سفارش شما ثبت شد.\n\n"
        f"💳 لطفاً مبلغ {amount_ir:,} تومان را به شماره کارت زیر واریز کنید:\n"
        f"{CARD_NUMBER}\n"
        f"بنام: {CARD_HOLDER}\n\n"
        "📸 پس از واریز، لطفاً تصویر رسید پرداخت را ارسال کنید."
    )
    keyboard = [[InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.edit_message_text(payment_text, reply_markup=reply_markup)
    context.user_data.clear()
    return RECEIPT

async def cancel_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data.clear()
    await update.callback_query.edit_message_text(
        "❌ سفارش شما لغو شد.\nبرای ثبت سفارش جدید از منوی اصلی اقدام کنید.",
        reply_markup=main_inline_keyboard()
    )
    return ConversationHandler.END

async def show_history(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id]
    if not user_orders:
        await update.callback_query.message.reply_text("📝 شما هیچ سفارشی ثبت نکرده‌اید.", reply_markup=main_inline_keyboard())
        return
    history_text = "📜 تاریخچه سفارش‌های شما:\n\n"
    for order in user_orders:
        history_text += (
            f"🔹 شناسه سفارش: {order['order_id']}\n"
            f"💰 مقدار شارژ: {order['amount']} افغانی\n"
            f"💶 مبلغ به تومان: {order['amount_ir']:,} تومان\n"
            f"📱 شماره تلفن: {order['phone']}\n"
            f"📅 تاریخ: {order['order_date']}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order['status'], 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
    await update.callback_query.message.reply_text(history_text, reply_markup=main_inline_keyboard())
    logger.info(f"کاربر {user_id} تاریخچه سفارش‌های خود را مشاهده کرد.")

async def show_support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    support_text = (
        "📞 راه‌های ارتباط با پشتیبانی:\n\n"
        f"🔹 تلگرام: @{ADMIN_USERNAME}\n"
        "🔸 ساعات پاسخگویی: 8 صبح تا 8 شب\n\n"
        "برای ارتباط سریع‌تر لطفاً از تلگرام استفاده کنید."
    )
    keyboard = [[InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(support_text, reply_markup=reply_markup)

async def show_help(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [[InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def show_all_orders(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    if not orders_data:
        await update.callback_query.message.reply_text("📝 هیچ سفارشی ثبت نشده است.")
        return
    for order_id, order_data in orders_data.items():
        order_text = (
            f"🔹 شناسه سفارش: {order_id}\n"
            f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
            f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
            f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
            f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
            f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
        await update.callback_query.message.reply_text(order_text, reply_markup=main_inline_keyboard())
        logger.info(f"ادمین سفارش {order_id} را مشاهده کرد.")

async def start_order_search(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_order_id'
    await update.callback_query.message.reply_text("🔍 لطفاً شناسه سفارش را وارد کنید:")

async def show_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return
    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')
    stats_text = (
        "📊 آمار کلی سیستم:\n\n"
        f"📦 تعداد کل سفارش‌ها: {total_orders}\n"
        f"✅ سفارش‌های تکمیل شده: {completed_orders}\n"
        f"⏳ سفارش‌های در انتظار: {pending_orders}\n"
        f"💰 درآمد کل: {total_revenue:,} تومان"
    )
    await update.callback_query.message.reply_text(stats_text, reply_markup=main_inline_keyboard())
    logger.info("ادمین آمار کلی سیستم را مشاهده کرد.")

async def start_rate_change(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_new_rate'
    await update.callback_query.message.reply_text(
        "💱 لطفاً نرخ جدید تبدیل افغانی به تومان را وارد کنید:\n"
        "مثال: 1300"
    )

async def start_order_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_delete_id'
    await update.callback_query.message.reply_text("❌ لطفاً شناسه سفارش مورد نظر برای حذف را وارد کنید:")

async def admin_message_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if user_id != str(ADMIN_ID):
        return
    admin_state = context.user_data.get('admin_state')
    if admin_state == 'waiting_new_rate':
        if not validate_amount(update.message.text):
            await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید.")
            return 'waiting_new_rate'
        try:
            new_rate = float(update.message.text)
            global EXCHANGE_RATE
            EXCHANGE_RATE = new_rate
            await update.message.reply_text(f"✅ نرخ تبدیل با موفقیت به {new_rate:,} تومان تغییر کرد.")
            for order in orders_data.values():
                if order.get('status') == 'pending':
                    order['amount_ir'] = order['amount'] * EXCHANGE_RATE
            save_orders_data(orders_data)
            logger.info(f"نرخ تبدیل به {new_rate} تومان تغییر کرد و سفارش‌های معلق به‌روزرسانی شدند.")
        except ValueError:
            await update.message.reply_text("❌ لطفاً یک عدد معتبر وارد کنید.")
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_order_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            order_data = orders_data[order_id]
            order_text = (
                f"🔹 اطلاعات سفارش:\n\n"
                f"شناسه: {order_id}\n"
                f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
                f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
                f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
                f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
                f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
                f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}"
            )
            await update.message.reply_text(order_text, reply_markup=main_inline_keyboard())
            logger.info(f"ادمین سفارش {order_id} را جستجو کرد و مشاهده کرد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_delete_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            del orders_data[order_id]
            save_orders_data(orders_data)
            await update.message.reply_text(f"✅ سفارش {order_id} با موفقیت حذف شد.", reply_markup=main_inline_keyboard())
            logger.info(f"سفارش {order_id} توسط ادمین حذف شد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.", reply_markup=main_inline_keyboard())
        context.user_data['admin_state'] = None

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def show_history(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id]
    if not user_orders:
        await update.callback_query.message.reply_text("📝 شما هیچ سفارشی ثبت نکرده‌اید.", reply_markup=main_inline_keyboard())
        return
    history_text = "📜 تاریخچه سفارش‌های شما:\n\n"
    for order in user_orders:
        history_text += (
            f"🔹 شناسه سفارش: {order['order_id']}\n"
            f"💰 مقدار شارژ: {order['amount']} افغانی\n"
            f"💶 مبلغ به تومان: {order['amount_ir']:,} تومان\n"
            f"📱 شماره تلفن: {order['phone']}\n"
            f"📅 تاریخ: {order['order_date']}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order['status'], 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
    await update.callback_query.message.reply_text(history_text, reply_markup=main_inline_keyboard())
    logger.info(f"کاربر {user_id} تاریخچه سفارش‌های خود را مشاهده کرد.")

async def show_support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    support_text = (
        "📞 راه‌های ارتباط با پشتیبانی:\n\n"
        f"🔹 تلگرام: @{ADMIN_USERNAME}\n"
        "🔸 ساعات پاسخگویی: 8 صبح تا 8 شب\n\n"
        "برای ارتباط سریع‌تر لطفاً از تلگرام استفاده کنید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(support_text, reply_markup=reply_markup)

async def show_help(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def show_all_orders(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    if not orders_data:
        await update.callback_query.message.reply_text("📝 هیچ سفارشی ثبت نشده است.")
        return
    for order_id, order_data in orders_data.items():
        order_text = (
            f"🔹 شناسه سفارش: {order_id}\n"
            f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
            f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
            f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
            f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
            f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
        await update.callback_query.message.reply_text(order_text, reply_markup=None)
        logger.info(f"ادمین سفارش {order_id} را مشاهده کرد.")

async def start_order_search(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_order_id'
    await update.callback_query.message.reply_text("🔍 لطفاً شناسه سفارش را وارد کنید:")

async def show_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return
    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')
    stats_text = (
        "📊 آمار کلی سیستم:\n\n"
        f"📦 تعداد کل سفارش‌ها: {total_orders}\n"
        f"✅ سفارش‌های تکمیل شده: {completed_orders}\n"
        f"⏳ سفارش‌های در انتظار: {pending_orders}\n"
        f"💰 درآمد کل: {total_revenue:,} تومان"
    )
    await update.callback_query.message.reply_text(stats_text, reply_markup=main_inline_keyboard())
    logger.info("ادمین آمار کلی سیستم را مشاهده کرد.")

async def start_rate_change(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_new_rate'
    await update.callback_query.message.reply_text(
        "💱 لطفاً نرخ جدید تبدیل افغانی به تومان را وارد کنید:\n"
        "مثال: 1300"
    )

async def start_order_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_delete_id'
    await update.callback_query.message.reply_text("❌ لطفاً شناسه سفارش مورد نظر برای حذف را وارد کنید:")

async def admin_message_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if user_id != str(ADMIN_ID):
        return
    admin_state = context.user_data.get('admin_state')
    if admin_state == 'waiting_new_rate':
        if not validate_amount(update.message.text):
            await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید.")
            return 'waiting_new_rate'
        try:
            new_rate = float(update.message.text)
            global EXCHANGE_RATE
            EXCHANGE_RATE = new_rate
            await update.message.reply_text(f"✅ نرخ تبدیل با موفقیت به {new_rate:,} تومان تغییر کرد.")
            for order in orders_data.values():
                if order.get('status') == 'pending':
                    order['amount_ir'] = order['amount'] * EXCHANGE_RATE
            save_orders_data(orders_data)
            logger.info(f"نرخ تبدیل به {new_rate} تومان تغییر کرد و سفارش‌های معلق به‌روزرسانی شدند.")
        except ValueError:
            await update.message.reply_text("❌ لطفاً یک عدد معتبر وارد کنید.")
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_order_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            order_data = orders_data[order_id]
            order_text = (
                f"🔹 اطلاعات سفارش:\n\n"
                f"شناسه: {order_id}\n"
                f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
                f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
                f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
                f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
                f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
                f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}"
            )
            await update.message.reply_text(order_text, reply_markup=main_inline_keyboard())
            logger.info(f"ادمین سفارش {order_id} را جستجو کرد و مشاهده کرد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_delete_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            del orders_data[order_id]
            save_orders_data(orders_data)
            await update.message.reply_text(f"✅ سفارش {order_id} با موفقیت حذف شد.", reply_markup=main_inline_keyboard())
            logger.info(f"سفارش {order_id} توسط ادمین حذف شد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.", reply_markup=main_inline_keyboard())
        context.user_data['admin_state'] = None

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def show_history(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id]
    if not user_orders:
        await update.callback_query.message.reply_text("📝 شما هیچ سفارشی ثبت نکرده‌اید.", reply_markup=main_inline_keyboard())
        return
    history_text = "📜 تاریخچه سفارش‌های شما:\n\n"
    for order in user_orders:
        history_text += (
            f"🔹 شناسه سفارش: {order['order_id']}\n"
            f"💰 مقدار شارژ: {order['amount']} افغانی\n"
            f"💶 مبلغ به تومان: {order['amount_ir']:,} تومان\n"
            f"📱 شماره تلفن: {order['phone']}\n"
            f"📅 تاریخ: {order['order_date']}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order['status'], 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
    await update.callback_query.message.reply_text(history_text, reply_markup=main_inline_keyboard())
    logger.info(f"کاربر {user_id} تاریخچه سفارش‌های خود را مشاهده کرد.")

async def show_support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    support_text = (
        "📞 راه‌های ارتباط با پشتیبانی:\n\n"
        f"🔹 تلگرام: @{ADMIN_USERNAME}\n"
        "🔸 ساعات پاسخگویی: 8 صبح تا 8 شب\n\n"
        "برای ارتباط سریع‌تر لطفاً از تلگرام استفاده کنید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(support_text, reply_markup=reply_markup)

async def show_help(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def show_all_orders(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    if not orders_data:
        await update.callback_query.message.reply_text("📝 هیچ سفارشی ثبت نشده است.")
        return
    for order_id, order_data in orders_data.items():
        order_text = (
            f"🔹 شناسه سفارش: {order_id}\n"
            f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
            f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
            f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
            f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
            f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
        await update.callback_query.message.reply_text(order_text, reply_markup=None)
        logger.info(f"ادمین سفارش {order_id} را مشاهده کرد.")

async def start_order_search(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_order_id'
    await update.callback_query.message.reply_text("🔍 لطفاً شناسه سفارش را وارد کنید:")

async def show_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return
    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')
    stats_text = (
        "📊 آمار کلی سیستم:\n\n"
        f"📦 تعداد کل سفارش‌ها: {total_orders}\n"
        f"✅ سفارش‌های تکمیل شده: {completed_orders}\n"
        f"⏳ سفارش‌های در انتظار: {pending_orders}\n"
        f"💰 درآمد کل: {total_revenue:,} تومان"
    )
    await update.callback_query.message.reply_text(stats_text, reply_markup=main_inline_keyboard())
    logger.info("ادمین آمار کلی سیستم را مشاهده کرد.")

async def start_rate_change(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_new_rate'
    await update.callback_query.message.reply_text(
        "💱 لطفاً نرخ جدید تبدیل افغانی به تومان را وارد کنید:\n"
        "مثال: 1300"
    )

async def start_order_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_delete_id'
    await update.callback_query.message.reply_text("❌ لطفاً شناسه سفارش مورد نظر برای حذف را وارد کنید:")

async def admin_message_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if user_id != str(ADMIN_ID):
        return
    admin_state = context.user_data.get('admin_state')
    if admin_state == 'waiting_new_rate':
        if not validate_amount(update.message.text):
            await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید.")
            return 'waiting_new_rate'
        try:
            new_rate = float(update.message.text)
            global EXCHANGE_RATE
            EXCHANGE_RATE = new_rate
            await update.message.reply_text(f"✅ نرخ تبدیل با موفقیت به {new_rate:,} تومان تغییر کرد.")
            for order in orders_data.values():
                if order.get('status') == 'pending':
                    order['amount_ir'] = order['amount'] * EXCHANGE_RATE
            save_orders_data(orders_data)
            logger.info(f"نرخ تبدیل به {new_rate} تومان تغییر کرد و سفارش‌های معلق به‌روزرسانی شدند.")
        except ValueError:
            await update.message.reply_text("❌ لطفاً یک عدد معتبر وارد کنید.")
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_order_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            order_data = orders_data[order_id]
            order_text = (
                f"🔹 اطلاعات سفارش:\n\n"
                f"شناسه: {order_id}\n"
                f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
                f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
                f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
                f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
                f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
                f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}"
            )
            await update.message.reply_text(order_text, reply_markup=main_inline_keyboard())
            logger.info(f"ادمین سفارش {order_id} را جستجو کرد و مشاهده کرد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.", reply_markup=main_inline_keyboard())
        context.user_data['admin_state'] = None
    elif admin_state == 'waiting_delete_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            del orders_data[order_id]
            save_orders_data(orders_data)
            await update.message.reply_text(f"✅ سفارش {order_id} با موفقیت حذف شد.", reply_markup=main_inline_keyboard())
            logger.info(f"سفارش {order_id} توسط ادمین حذف شد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.", reply_markup=main_inline_keyboard())
        context.user_data['admin_state'] = None

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.callback_query.message.reply_text(help_text, reply_markup=reply_markup)

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    text = update.message.text.strip()
    if user_id == str(ADMIN_ID):
        await admin_message_handler(update, context)
        return
    if text == "🔰 شروع":
        await start(update, context)
    else:
        await update.message.reply_text("⚠️ لطفاً یکی از گزینه‌های موجود را انتخاب کنید.", reply_markup=main_inline_keyboard())

def main():
    if not TOKEN:
        logger.error("توکن بات تنظیم نشده است. لطفاً متغیر محیطی TELEGRAM_BOT_TOKEN را تنظیم کنید.")
        return
    if not ADMIN_ID:
        logger.error("شناسه ادمین تنظیم نشده است. لطفاً متغیر محیطی ADMIN_ID را تنظیم کنید.")
        return
    application = Application.builder().token(TOKEN).build()
    conv_handler = ConversationHandler(
        entry_points=[CallbackQueryHandler(start_order, pattern='^new_order$')],
        states={
            NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_name)],
            AMOUNT: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_amount)],
            PHONE: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_phone)],
            CONFIRM: [
                CallbackQueryHandler(confirm_order, pattern='^confirm_order$'),
                CallbackQueryHandler(cancel_order, pattern='^cancel_order$')
            ],
            RECEIPT: [MessageHandler(filters.PHOTO, handle_photo)]
        },
        fallbacks=[CallbackQueryHandler(cancel_order, pattern='^cancel_order$')],
        per_message=True
    )
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("admin", admin_panel))
    application.add_handler(CommandHandler("verify_payment", verify_payment))
    application.add_handler(CommandHandler("report", generate_report))
    application.add_handler(CommandHandler("help", help_command))
    application.add_handler(CallbackQueryHandler(button_handler))
    application.add_handler(conv_handler)
    application.add_handler(MessageHandler(filters.PHOTO, handle_photo))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    logger.info("Bot started...")
    application.run_polling(allowed_updates=Update.ALL_TYPES)

if __name__ == '__main__':
    main()