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

# ============ تنظیمات ============
TOKEN = "8533551456:AAG9guJy4dpWKt52HJOvossvHzqCpTQ2Fh0"
ADMIN_ID = 8438594855

ORDERS_FILE = "orders.json"
USERS_FILE = "users.json"
CONFIG_REQUESTS_FILE = "config_requests.json"

PRICE_PER_GB = 1500  # قیمت هر گیگابایت معمولی

BANK_CARD = "6219861924855975"
BANK_HOLDER = "طاهره مروتی"

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# ============ فایل‌ها ============
def load_json(file):
    if os.path.exists(file):
        with open(file, 'r') as f:
            return json.load(f)
    return {}

def save_json(file, data):
    with open(file, 'w') as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

def get_orders():
    return load_json(ORDERS_FILE)

def save_orders(o):
    save_json(ORDERS_FILE, o)

def get_users():
    return load_json(USERS_FILE)

def save_users(u):
    save_json(USERS_FILE, u)

def get_config_requests():
    return load_json(CONFIG_REQUESTS_FILE)

def save_config_requests(r):
    save_json(CONFIG_REQUESTS_FILE, r)

def new_order_id():
    return str(len(get_orders()) + 1)

# ============ منو ============
def menu():
    kb = [
        [InlineKeyboardButton("🛒 خرید پنل نمایندگی", callback_data="buy_agency")],
        [InlineKeyboardButton("📋 سفارشات من", callback_data="orders")],
        [InlineKeyboardButton("💰 موجودی من", callback_data="balance")],
        [InlineKeyboardButton("📥 دریافت کانفیگ", callback_data="get_config")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    return InlineKeyboardMarkup(kb)

def admin_menu():
    kb = [
        [InlineKeyboardButton("📊 آمار", callback_data="stats")],
        [InlineKeyboardButton("📋 لیست سفارشات", callback_data="admin_orders")],
        [InlineKeyboardButton("📥 درخواست‌های کانفیگ", callback_data="config_requests")]
    ]
    return InlineKeyboardMarkup(kb)

# ============ هندلرها ============
def start(update, context):
    uid = update.effective_user.id
    users = get_users()
    if str(uid) not in users:
        users[str(uid)] = {
            "name": update.effective_user.first_name,
            "balance": 0,
            "join_date": datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        save_users(users)
    
    text = (
        f"👋 سلام {update.effective_user.first_name}!\n"
        "به ربات فروش پنل نمایندگی خوش آمدید.\n\n"
        "📌 یکی از گزینه‌های زیر را انتخاب کنید:"
    )
    update.message.reply_text(text, reply_markup=menu())

def help_cmd(update, context):
    q = update.callback_query
    if q:
        q.answer()
        msg = q.message
        edit = True
    else:
        msg = update.message
        edit = False
    
    text = (
        "📌 **راهنمای استفاده**\n\n"
        "🛒 **خرید پنل نمایندگی:**\n"
        "• ۳۰ گیگابایت با قیمت ویژه ۲۰,۰۰۰ تومان\n\n"
        f"🏦 شماره کارت: `{BANK_CARD}`\n"
        f"👤 بنام: {BANK_HOLDER}\n\n"
        "📸 پس از واریز، **تصویر رسید** را ارسال کنید.\n"
        "🌍 ۱۲ لوکیشن مختلف\n"
        "⏱ ۵ دقیقه ای تحویل داده می‌شود\n\n"
        "💰 **قیمت هر گیگابایت معمولی:** {:,} تومان".format(PRICE_PER_GB)
    )
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    if edit:
        q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
    else:
        msg.reply_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def balance(update, context):
    q = update.callback_query
    q.answer()
    uid = q.from_user.id
    users = get_users()
    bal = users.get(str(uid), {}).get("balance", 0)
    
    text = (
        f"💰 **موجودی شما:** {bal:,} تومان\n\n"
        f"📊 می‌توانید {int(bal/PRICE_PER_GB)} گیگابایت کانفیگ دریافت کنید."
    )
    kb = [
        [InlineKeyboardButton("📥 دریافت کانفیگ", callback_data="get_config")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
    ]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def orders_list(update, context):
    q = update.callback_query
    q.answer()
    uid = q.from_user.id
    orders = get_orders()
    my_orders = [o for o in orders.values() if o.get("user_id") == uid]
    
    if not my_orders:
        text = "📭 شما هیچ سفارشی ندارید!"
        kb = [[InlineKeyboardButton("🛒 خرید پنل نمایندگی", callback_data="buy_agency")]]
        q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb))
        return
    
    text = "📋 **سفارشات شما**\n\n"
    status_emoji = {"pending": "⏳", "approved": "✅", "completed": "🎉", "rejected": "❌"}
    status_text = {"pending": "در انتظار تایید", "approved": "تایید شده", "completed": "تکمیل", "rejected": "رد شده"}
    
    for i, o in enumerate(my_orders[-5:], 1):
        st = o.get("status", "pending")
        text += f"{i}. 📦 {o['volume']} - {status_emoji.get(st, '❓')} {status_text.get(st, 'نامشخص')}\n"
        if st == "completed":
            text += f"   💰 {o['price']:,} تومان\n"
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

# ============ خرید پنل نمایندگی ============
def buy_agency(update, context):
    q = update.callback_query
    q.answer()
    
    # پنل نمایندگی ۳۰ گیگ با قیمت ۲۰,۰۰۰
    vol = "۳۰ گیگ (نمایندگی)"
    price = 20000
    uid = q.from_user.id
    
    context.user_data['order'] = {
        "volume": vol,
        "price": price,
        "user_id": uid,
        "status": "pending",
        "type": "agency",
        "date": datetime.now().strftime("%Y-%m-%d %H:%M")
    }
    
    text = (
        f"📦 **پنل نمایندگی**\n"
        f"📦 **حجم:** {vol}\n"
        f"💰 **مبلغ ویژه:** {price:,} تومان\n\n"
        f"💳 لطفاً مبلغ را به شماره کارت زیر واریز کنید:\n"
        f"🏦 شماره کارت: `{BANK_CARD}`\n"
        f"👤 بنام: {BANK_HOLDER}\n\n"
        "📸 پس از واریز، **تصویر رسید** را ارسال کنید.\n"
        "🌍 ۱۲ لوکیشن مختلف\n"
        "⏱ ۵ دقیقه ای تحویل داده می‌شود"
    )
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
    context.user_data['waiting_receipt'] = True

def handle_receipt(update, context):
    uid = update.effective_user.id
    
    if uid == ADMIN_ID:
        return
    
    if not context.user_data.get('waiting_receipt'):
        update.message.reply_text("⚠️ ابتدا از دکمه خرید پنل نمایندگی اقدام کنید!")
        return
    
    if not update.message.photo:
        update.message.reply_text("❌ لطفاً **تصویر رسید** را ارسال کنید!")
        return
    
    order = context.user_data.get('order')
    if not order:
        update.message.reply_text("❌ خطا! دوباره تلاش کنید.")
        return
    
    photo = update.message.photo[-1].file_id
    order['receipt_photo'] = photo
    
    orders = get_orders()
    oid = new_order_id()
    orders[oid] = order
    save_orders(orders)
    
    admin_text = (
        f"🆕 **سفارش جدید**\n\n"
        f"🆔 #{oid}\n"
        f"👤 {update.effective_user.first_name} (ID: {uid})\n"
        f"📦 {order['volume']}\n"
        f"💰 {order['price']:,} تومان\n"
        f"📌 نوع: نمایندگی"
    )
    
    kb = [
        [InlineKeyboardButton("✅ تایید و شارژ", callback_data=f"ok_{oid}")],
        [InlineKeyboardButton("❌ رد", callback_data=f"no_{oid}")]
    ]
    context.bot.send_photo(
        ADMIN_ID,
        photo=photo,
        caption=admin_text,
        reply_markup=InlineKeyboardMarkup(kb),
        parse_mode='Markdown'
    )
    
    update.message.reply_text("✅ رسید شما ثبت شد!\n⏳ منتظر تایید ادمین باشید.")
    context.user_data['waiting_receipt'] = False
    context.user_data['order'] = None

# ============ دریافت کانفیگ ============
def get_config(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    users = get_users()
    bal = users.get(str(uid), {}).get("balance", 0)
    
    if bal < PRICE_PER_GB:
        text = (
            f"❌ **موجودی شما کافی نیست!**\n\n"
            f"💰 موجودی شما: {bal:,} تومان\n"
            f"📊 قیمت هر گیگابایت: {PRICE_PER_GB:,} تومان\n\n"
            "برای خرید پنل نمایندگی، روی دکمه '🛒 خرید پنل نمایندگی' کلیک کنید."
        )
        kb = [
            [InlineKeyboardButton("🛒 خرید پنل نمایندگی", callback_data="buy_agency")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
        ]
        q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
        return
    
    text = (
        f"📥 **دریافت کانفیگ**\n\n"
        f"💰 موجودی شما: {bal:,} تومان\n"
        f"📊 قیمت هر گیگابایت: {PRICE_PER_GB:,} تومان\n"
        f"📊 حداکثر حجم قابل دریافت: {int(bal/PRICE_PER_GB)} گیگابایت\n\n"
        "✏️ لطفاً حجم مورد نظر خود را به **گیگابایت** وارد کنید.\n"
        "مثال: `5` یا `10` یا `20`"
    )
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
    context.user_data['waiting_volume'] = True

def handle_volume(update, context):
    uid = update.effective_user.id
    
    if uid == ADMIN_ID:
        return
    
    if not context.user_data.get('waiting_volume'):
        return
    
    try:
        volume = int(update.message.text.strip())
        if volume <= 0:
            update.message.reply_text("❌ لطفاً یک عدد مثبت وارد کنید.")
            return
        
        users = get_users()
        bal = users.get(str(uid), {}).get("balance", 0)
        max_volume = int(bal / PRICE_PER_GB)
        
        if volume > max_volume:
            update.message.reply_text(
                f"❌ **موجودی شما کافی نیست!**\n\n"
                f"💰 موجودی شما: {bal:,} تومان\n"
                f"📊 حداکثر حجم قابل دریافت: {max_volume} گیگابایت\n"
                f"📊 حجم درخواستی: {volume} گیگابایت\n\n"
                "لطفاً حجم کمتری وارد کنید."
            )
            return
        
        price = volume * PRICE_PER_GB
        
        config_requests = get_config_requests()
        req_id = str(len(config_requests) + 1)
        config_requests[req_id] = {
            "user_id": uid,
            "volume": volume,
            "price": price,
            "status": "pending",
            "date": datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        save_config_requests(config_requests)
        
        admin_text = (
            f"📥 **درخواست کانفیگ جدید**\n\n"
            f"🆔 #{req_id}\n"
            f"👤 کاربر: {update.effective_user.first_name} (ID: {uid})\n"
            f"📦 حجم: {volume} گیگابایت\n"
            f"💰 مبلغ: {price:,} تومان\n"
            f"💰 موجودی کاربر: {bal:,} تومان\n"
            f"📊 باقیمانده پس از کسر: {bal - price:,} تومان"
        )
        
        kb = [
            [InlineKeyboardButton("✅ تایید و ارسال لینک", callback_data=f"config_ok_{req_id}")],
            [InlineKeyboardButton("❌ رد", callback_data=f"config_no_{req_id}")]
        ]
        context.bot.send_message(
            ADMIN_ID,
            admin_text,
            reply_markup=InlineKeyboardMarkup(kb),
            parse_mode='Markdown'
        )
        
        update.message.reply_text(
            f"✅ **درخواست شما ثبت شد!**\n\n"
            f"📦 حجم: {volume} گیگابایت\n"
            f"💰 مبلغ: {price:,} تومان\n\n"
            "⏳ منتظر تایید ادمین باشید.\n"
            "پس از تایید، لینک کانفیگ برای شما ارسال می‌شود."
        )
        
        context.user_data['waiting_volume'] = False
        
    except ValueError:
        update.message.reply_text("❌ لطفاً فقط عدد وارد کنید.\nمثال: `5` یا `10`")

def admin_config_approve(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    req_id = q.data.split('_')[2]
    config_requests = get_config_requests()
    
    if req_id not in config_requests:
        q.edit_message_text("❌ این درخواست قبلاً تایید یا رد شده است!")
        return
    
    if config_requests[req_id].get("status") != "pending":
        q.edit_message_text("❌ این درخواست قبلاً تایید یا رد شده است!")
        return
    
    req = config_requests[req_id]
    uid = req['user_id']
    volume = req['volume']
    price = req['price']
    
    users = get_users()
    if str(uid) in users:
        users[str(uid)]["balance"] = users[str(uid)].get("balance", 0) - price
        save_users(users)
    
    config_requests[req_id]["status"] = "approved"
    save_config_requests(config_requests)
    
    context.user_data['config_link_for'] = uid
    context.user_data['config_volume'] = volume
    context.user_data['config_req_id'] = req_id
    
    q.edit_message_text(
        f"✅ **درخواست کانفیگ تایید شد!**\n\n"
        f"🆔 #{req_id}\n"
        f"👤 کاربر: {uid}\n"
        f"📦 حجم: {volume} گیگابایت\n"
        f"💰 مبلغ کسر شده: {price:,} تومان\n"
        f"💰 موجودی باقیمانده: {users[str(uid)]['balance']:,} تومان\n\n"
        "📤 لطفاً **لینک کانفیگ** را در پیام بعدی ارسال کنید."
    )

def admin_config_reject(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    req_id = q.data.split('_')[2]
    config_requests = get_config_requests()
    
    if req_id not in config_requests:
        q.edit_message_text("❌ این درخواست قبلاً تایید یا رد شده است!")
        return
    
    if config_requests[req_id].get("status") != "pending":
        q.edit_message_text("❌ این درخواست قبلاً تایید یا رد شده است!")
        return
    
    uid = config_requests[req_id]['user_id']
    config_requests[req_id]["status"] = "rejected"
    save_config_requests(config_requests)
    
    try:
        context.bot.send_message(uid, "❌ درخواست کانفیگ شما رد شد!")
    except:
        pass
    
    q.edit_message_text("✅ درخواست کانفیگ رد شد.")

def admin_send_config_link(update, context):
    if update.effective_user.id != ADMIN_ID:
        return
    
    uid = context.user_data.get('config_link_for')
    volume = context.user_data.get('config_volume')
    req_id = context.user_data.get('config_req_id')
    
    if not uid:
        update.message.reply_text("❌ در حال تایید درخواستی نیستید!")
        return
    
    link = update.message.text
    
    try:
        context.bot.send_message(
            uid,
            f"🎉 **کانفیگ شما آماده است!**\n\n"
            f"📦 حجم: {volume} گیگابایت\n"
            f"🔗 لینک کانفیگ:\n`{link}`\n\n"
            "🌍 ۱۲ لوکیشن مختلف\n"
            "با تشکر از شما! 🌟",
            parse_mode='Markdown'
        )
        update.message.reply_text(f"✅ لینک کانفیگ به کاربر {uid} ارسال شد.")
        
        if req_id:
            config_requests = get_config_requests()
            if req_id in config_requests:
                config_requests[req_id]["status"] = "completed"
                config_requests[req_id]["link"] = link
                save_config_requests(config_requests)
        
    except Exception as e:
        update.message.reply_text(f"❌ خطا: {e}")
    
    context.user_data['config_link_for'] = None
    context.user_data['config_volume'] = None
    context.user_data['config_req_id'] = None

# ============ ادمین ============
def approve(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    oid = q.data.split('_')[1]
    orders = get_orders()
    
    if oid not in orders:
        q.edit_message_text("❌ سفارش پیدا نشد!")
        return
    
    if orders[oid].get("status") == "completed":
        q.edit_message_text("⚠️ این سفارش قبلاً تایید شده است!")
        return
    
    if orders[oid].get("status") == "rejected":
        q.edit_message_text("⚠️ این سفارش قبلاً رد شده است!")
        return
    
    order = orders[oid]
    uid = order['user_id']
    amount = order['price']
    
    users = get_users()
    if str(uid) not in users:
        users[str(uid)] = {"balance": 0}
    users[str(uid)]["balance"] = users[str(uid)].get("balance", 0) + amount
    save_users(users)
    
    order['status'] = 'completed'
    save_orders(orders)
    
    try:
        context.bot.send_message(
            uid,
            f"✅ **سفارش شما تایید شد!**\n\n"
            f"📦 حجم: {order['volume']}\n"
            f"💰 مبلغ: {amount:,} تومان\n"
            f"💰 موجودی جدید: {users[str(uid)]['balance']:,} تومان\n\n"
            f"📊 می‌توانید {int(users[str(uid)]['balance']/PRICE_PER_GB)} گیگابایت کانفیگ دریافت کنید.\n\n"
            "برای دریافت کانفیگ، روی دکمه '📥 دریافت کانفیگ' کلیک کنید.",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("📥 دریافت کانفیگ", callback_data="get_config")]])
        )
        q.edit_message_text(f"✅ سفارش #{oid} تایید شد و موجودی کاربر شارژ گردید.")
    except:
        q.edit_message_text(f"✅ سفارش #{oid} تایید شد.")

def reject(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    oid = q.data.split('_')[1]
    orders = get_orders()
    
    if oid not in orders:
        q.edit_message_text("❌ سفارش پیدا نشد!")
        return
    
    if orders[oid].get("status") == "completed":
        q.edit_message_text("⚠️ این سفارش قبلاً تایید شده است!")
        return
    
    if orders[oid].get("status") == "rejected":
        q.edit_message_text("⚠️ این سفارش قبلاً رد شده است!")
        return
    
    uid = orders[oid]['user_id']
    orders[oid]['status'] = 'rejected'
    save_orders(orders)
    
    try:
        context.bot.send_message(uid, f"❌ سفارش شما (شماره {oid}) رد شد!")
    except:
        pass
    
    q.edit_message_text(f"✅ سفارش #{oid} رد شد.")

def admin_orders(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    orders = get_orders()
    if not orders:
        q.edit_message_text("📭 هیچ سفارشی وجود ندارد!")
        return
    
    text = "📋 **لیست سفارشات**\n\n"
    for oid, o in list(orders.items())[-10:]:
        st = o.get('status', 'pending')
        emoji = {"pending": "⏳", "completed": "🎉", "rejected": "❌"}.get(st, "❓")
        text += f"{oid}. {emoji} {o['volume']} - {o['price']:,} تومان\n"
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back_admin")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def stats(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    users = get_users()
    orders = get_orders()
    config_requests = get_config_requests()
    
    total_income = sum([o.get('price', 0) for o in orders.values() if o.get('status') == 'completed'])
    pending = len([o for o in orders.values() if o.get('status') == 'pending'])
    pending_config = len([r for r in config_requests.values() if r.get('status') == 'pending'])
    
    text = (
        f"📊 **آمار ربات**\n\n"
        f"👥 کاربران: {len(users)}\n"
        f"📦 سفارشات: {len(orders)}\n"
        f"⏳ در انتظار تایید: {pending}\n"
        f"📥 درخواست کانفیگ: {pending_config}\n"
        f"💰 درآمد: {total_income:,} تومان"
    )
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back_admin")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def config_requests(update, context):
    q = update.callback_query
    q.answer()
    
    if q.from_user.id != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی ندارید!")
        return
    
    config_requests = get_config_requests()
    pending = [r for r in config_requests.values() if r.get('status') == 'pending']
    
    if not pending:
        q.edit_message_text("📭 هیچ درخواست کانفیگ در انتظاری وجود ندارد!")
        return
    
    text = "📥 **درخواست‌های کانفیگ در انتظار**\n\n"
    for req in pending[-5:]:
        text += f"🆔 کاربر: {req['user_id']}\n"
        text += f"📦 حجم: {req['volume']} گیگابایت\n"
        text += f"💰 مبلغ: {req['price']:,} تومان\n\n"
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back_admin")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def back(update, context):
    q = update.callback_query
    q.answer()
    q.edit_message_text("🏠 منوی اصلی", reply_markup=menu())

def back_admin(update, context):
    q = update.callback_query
    q.answer()
    q.edit_message_text("🏠 منوی ادمین", reply_markup=admin_menu())

# ============ اجرا ============
def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help_cmd))
    
    dp.add_handler(CallbackQueryHandler(buy_agency, pattern="^buy_agency$"))
    dp.add_handler(CallbackQueryHandler(orders_list, pattern="^orders$"))
    dp.add_handler(CallbackQueryHandler(balance, pattern="^balance$"))
    dp.add_handler(CallbackQueryHandler(get_config, pattern="^get_config$"))
    dp.add_handler(CallbackQueryHandler(help_cmd, pattern="^help$"))
    dp.add_handler(CallbackQueryHandler(back, pattern="^back$"))
    dp.add_handler(CallbackQueryHandler(back_admin, pattern="^back_admin$"))
    
    dp.add_handler(CallbackQueryHandler(admin_orders, pattern="^admin_orders$"))
    dp.add_handler(CallbackQueryHandler(stats, pattern="^stats$"))
    dp.add_handler(CallbackQueryHandler(config_requests, pattern="^config_requests$"))
    dp.add_handler(CallbackQueryHandler(approve, pattern="^ok_"))
    dp.add_handler(CallbackQueryHandler(reject, pattern="^no_"))
    
    dp.add_handler(CallbackQueryHandler(admin_config_approve, pattern="^config_ok_"))
    dp.add_handler(CallbackQueryHandler(admin_config_reject, pattern="^config_no_"))
    
    dp.add_handler(MessageHandler(Filters.photo & ~Filters.user(ADMIN_ID), handle_receipt))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.user(ADMIN_ID), handle_volume))
    dp.add_handler(MessageHandler(Filters.text & Filters.user(ADMIN_ID), admin_send_config_link))
    
    logger.info("🤖 ربات فروش پنل نمایندگی راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()