import telebot
from telebot import types
import sqlite3
import random
import time
import re
import logging
from datetime import datetime, timedelta
import json
import requests

# ========== تنظیمات ==========
BOT_TOKEN = "8949659568:AAGbG-wOKhYPT54543IJGPi442JNSyry9FA"
ADMIN_IDS = [6268481597, 701891386, 797326835]
MASTER_ADMIN = 6268481597
CHANNEL_USERNAME = "@voidi_vpn"
CHANNEL_LINK = "https://t.me/voidi_vpn"
TON_ADDRESS = "UQA5tjCJuOPyYATJL7sknnUjpi40dkM4tV6zGCCdzXEOhfTv"

# ========== تنظیمات پنل پاسارگارد ==========
PANEL_API_URL = "https://void.ramcoder.ir:8000/api/"
PANEL_API_TOKEN = "pg_key_3d1e0fc1-19d5-4f4c-a250-0b0f53681d43"
PANEL_GROUP_ID = 1

logging.basicConfig(level=logging.INFO)
bot = telebot.TeleBot(BOT_TOKEN)

# ========== دیتابیس ==========
conn = sqlite3.connect('vpn_bot.db', check_same_thread=False, isolation_level=None)
c = conn.cursor()

c.execute('''CREATE TABLE IF NOT EXISTS users (
    user_id INTEGER PRIMARY KEY,
    username TEXT,
    first_name TEXT,
    join_date TEXT,
    is_blocked INTEGER DEFAULT 0
)''')

c.execute('''CREATE TABLE IF NOT EXISTS orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    tracking_code TEXT,
    service_type TEXT,
    title TEXT,
    price INTEGER,
    quantity INTEGER,
    details TEXT,
    status TEXT,
    created_at TEXT,
    updated_at TEXT,
    admin_note TEXT,
    screenshot_file_id TEXT
)''')

c.execute('''CREATE TABLE IF NOT EXISTS admins (
    user_id INTEGER PRIMARY KEY,
    username TEXT,
    first_name TEXT,
    added_by INTEGER,
    added_at TEXT
)''')

c.execute('''CREATE TABLE IF NOT EXISTS tickets (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,
    message TEXT,
    admin_response TEXT,
    status TEXT,
    created_at TEXT,
    updated_at TEXT
)''')

# اضافه کردن ادمین‌های پیش‌فرض
for admin_id in ADMIN_IDS:
    c.execute('INSERT OR IGNORE INTO admins (user_id) VALUES (?)', (admin_id,))
conn.commit()

def db_query(query, params=(), fetch_one=False, fetch_all=False, commit=False):
    try:
        c.execute(query, params)
        if commit:
            conn.commit()
            return None
        elif fetch_one:
            return c.fetchone()
        elif fetch_all:
            return c.fetchall()
        return None
    except Exception as e:
        logging.error(f"Database error: {e}")
        return None

def generate_tracking_code():
    return str(random.randint(10000000, 99999999))

def format_price(price):
    return f"{price:,}".replace(',', ',')

def is_admin(user_id):
    result = db_query('SELECT user_id FROM admins WHERE user_id = ?', (user_id,), fetch_one=True)
    return result is not None

def is_master_admin(user_id):
    return user_id == MASTER_ADMIN

def check_membership(user_id):
    try:
        member = bot.get_chat_member(CHANNEL_USERNAME, user_id)
        return member.status in ['member', 'administrator', 'creator']
    except:
        return False

def delete_previous_message(user_id, message_id):
    try:
        bot.delete_message(user_id, message_id)
    except:
        pass

def is_user_blocked(user_id):
    result = db_query('SELECT is_blocked FROM users WHERE user_id = ?', (user_id,), fetch_one=True)
    return result and result[0] == 1

def create_config_on_panel(username, volume, duration_days):
    """ساخت کانفیگ روی پنل پاسارگارد"""
    try:
        headers = {
            'X-Api-Key': PANEL_API_TOKEN,
            'Content-Type': 'application/json'
        }
        
        # ساخت کاربر جدید
        user_data = {
            'username': username,
            'group_id': PANEL_GROUP_ID,
            'data_limit': volume * 1073741824,  # تبدیل گیگ به بایت
            'expire_duration': duration_days * 86400,  # تبدیل روز به ثانیه
            'status': 'active'
        }
        
        response = requests.post(
            f"{PANEL_API_URL}users",
            headers=headers,
            json=user_data,
            timeout=10
        )
        
        if response.status_code == 200 or response.status_code == 201:
            result = response.json()
            # دریافت لینک اشتراک
            user_id = result.get('id')
            if user_id:
                sub_response = requests.get(
                    f"{PANEL_API_URL}users/{user_id}/subscription",
                    headers=headers,
                    timeout=10
                )
                if sub_response.status_code == 200:
                    sub_data = sub_response.json()
                    return sub_data.get('url', f"https://void.ramcoder.ir:8000/sub/{user_id}")
        return None
    except Exception as e:
        logging.error(f"Error creating config: {e}")
        return None

user_temp_data = {}
last_message_ids = {}

def save_last_message(user_id, message_id):
    last_message_ids[user_id] = message_id

def send_menu(user_id, text, keyboard, new_message=True):
    if new_message and user_id in last_message_ids:
        try:
            bot.delete_message(user_id, last_message_ids[user_id])
        except:
            pass
    msg = bot.send_message(user_id, text, parse_mode=None, reply_markup=keyboard)
    save_last_message(user_id, msg.message_id)
    return msg

def main_menu(message):
    user_id = message.chat.id
    if is_user_blocked(user_id):
        bot.send_message(user_id, "🚫 شما توسط ادمین مسدود شده‌اید!")
        return
    
    if not check_membership(user_id):
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        keyboard.add(
            types.InlineKeyboardButton("📢 عضویت در کانال", url=CHANNEL_LINK, style='primary'),
            types.InlineKeyboardButton("✅ عضو شدم", callback_data='check_membership', style='success')
        )
        send_menu(user_id, f"⚠️ سلام {message.from_user.first_name} عزیز!\n\nلطفا برای استفاده از خدمات عضو کانال ما بشید و سپس دکمه عضو شدم را بزنید\n\n📢 @voidi_vpn", keyboard)
        return
    
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("🛒 خرید کانفیگ", callback_data='buy_config', style='primary')
    )
    
    if is_admin(user_id):
        keyboard.add(types.InlineKeyboardButton("🛠️ ساخت کانفیگ سریع", callback_data='quick_config', style='success'))
        if is_master_admin(user_id):
            keyboard.add(types.InlineKeyboardButton("🔐 پنل ادمین", callback_data='admin_panel', style='primary'))
    
    keyboard.add(
        types.InlineKeyboardButton("📞 پشتیبانی", callback_data='support', style='primary'),
        types.InlineKeyboardButton("ℹ️ درباره ما", callback_data='about_us', style='primary')
    )
    
    send_menu(user_id, "🏠 **منوی اصلی**\n\nلطفاً یکی از گزینه‌های زیر را انتخاب کنید:", keyboard)

def admin_panel_menu(message):
    user_id = message.chat.id
    if not is_master_admin(user_id):
        bot.send_message(user_id, "❌ شما دسترسی ندارید!")
        return
    
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("🛒 مدیریت سفارشات", callback_data='admin_orders', style='primary'),
        types.InlineKeyboardButton("👥 مدیریت کاربران", callback_data='admin_users', style='primary'),
        types.InlineKeyboardButton("🧑‍💼 مدیریت ادمین‌ها", callback_data='admin_admins', style='primary'),
        types.InlineKeyboardButton("📢 ارسال همگانی", callback_data='admin_broadcast', style='primary'),
        types.InlineKeyboardButton("🚪 خروج", callback_data='back_main', style='danger')
    )
    send_menu(user_id, "🔐 **پنل مدیریت**\n\n📌 لطفاً یکی از گزینه‌های زیر را انتخاب کنید:", keyboard)

def admin_admins_menu(message):
    user_id = message.chat.id
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("📋 لیست ادمین‌ها", callback_data='admin_admins_list', style='primary'),
        types.InlineKeyboardButton("➕ افزودن ادمین", callback_data='admin_admins_add', style='success'),
        types.InlineKeyboardButton("❌ حذف ادمین", callback_data='admin_admins_remove', style='danger'),
        types.InlineKeyboardButton("🔙 بازگشت", callback_data='admin_panel', style='danger')
    )
    send_menu(user_id, "🧑‍💼 **مدیریت ادمین‌ها**\n\nلطفاً یکی از گزینه‌های زیر را انتخاب کنید:", keyboard)

def buy_config_menu(message):
    user_id = message.chat.id
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("📡 حجم نامحدود (ماهانه)", callback_data='buy_unlimited', style='primary'),
        types.InlineKeyboardButton("📊 حجمی (زمان نامحدود)", callback_data='buy_volume', style='primary'),
        types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')
    )
    send_menu(user_id, "🛒 **خرید کانفیگ**\n\nلطفاً نوع کانفیگ را انتخاب کنید:", keyboard)

def unlimited_menu(message):
    user_id = message.chat.id
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("📆 ۱ ماه - ۴۰۰,۰۰۰", callback_data='unlimited_1', style='primary'),
        types.InlineKeyboardButton("📆 ۲ ماه - ۷۰۰,۰۰۰", callback_data='unlimited_2', style='primary'),
        types.InlineKeyboardButton("📆 ۳ ماه - ۹۵۰,۰۰۰", callback_data='unlimited_3', style='primary'),
        types.InlineKeyboardButton("🔙 بازگشت", callback_data='buy_config', style='danger')
    )
    send_menu(user_id, "📡 **کانفیگ حجم نامحدود**\n\nلطفاً مدت مورد نظر را انتخاب کنید:", keyboard)

def quick_config_menu(message):
    user_id = message.chat.id
    keyboard = types.InlineKeyboardMarkup(row_width=1)
    keyboard.add(
        types.InlineKeyboardButton("📡 حجم نامحدود (ماهانه)", callback_data='quick_unlimited', style='success'),
        types.InlineKeyboardButton("📊 حجمی (زمان نامحدود)", callback_data='quick_volume', style='success'),
        types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')
    )
    send_menu(user_id, "🛠️ **ساخت کانفیگ سریع**\n\n📌 نوع کانفیگ را انتخاب کنید:", keyboard)

# ========== شروع ==========
@bot.message_handler(commands=['start'])
def start(message):
    user_id = message.chat.id
    db_query('INSERT OR IGNORE INTO users (user_id, username, first_name, join_date) VALUES (?, ?, ?, ?)', 
             (user_id, message.from_user.username, message.from_user.first_name, datetime.now().isoformat()), commit=True)
    main_menu(message)

# ========== کالبک‌ها ==========
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    user_id = call.from_user.id
    data = call.data

    if data == 'check_membership':
        if check_membership(user_id):
            bot.delete_message(user_id, call.message.message_id)
            start(call.message)
        else:
            keyboard = types.InlineKeyboardMarkup(row_width=1)
            keyboard.add(
                types.InlineKeyboardButton("📢 عضویت در کانال", url=CHANNEL_LINK, style='primary'),
                types.InlineKeyboardButton("✅ عضو شدم", callback_data='check_membership', style='success')
            )
            bot.edit_message_text("❌ شما هنوز عضو کانال نشدید!", user_id, call.message.message_id, parse_mode=None, reply_markup=keyboard)
        return

    if data == 'back_main':
        main_menu(call.message)
        return

    if data == 'buy_config':
        buy_config_menu(call.message)
        return

    if data == 'buy_unlimited':
        unlimited_menu(call.message)
        return

    if data == 'buy_volume':
        msg = bot.send_message(user_id, "📊 **کانفیگ حجمی (زمان نامحدود)**\n\n💰 قیمت هر گیگ = ۲,۵۰۰ تومان\n📊 حداقل خرید = ۱۰ گیگ\n⏳ زمان استفاده = نامحدود\n\n✏️ تعداد گیگ مورد نظر را وارد کنید (فقط عدد):")
        bot.register_next_step_handler(msg, process_volume_order)
        return

    if data == 'quick_config':
        if not is_admin(user_id):
            bot.answer_callback_query(call.id, "❌ شما دسترسی ندارید!", show_alert=True)
            return
        quick_config_menu(call.message)
        return

    if data == 'quick_unlimited':
        if not is_admin(user_id):
            return
        msg = bot.send_message(user_id, "🛠️ **ساخت کانفیگ نامحدود**\n\n📌 مدت مورد نظر را وارد کنید:\n1️⃣ ۱ ماه\n2️⃣ ۲ ماه\n3️⃣ ۳ ماه\n\n✏️ عدد ۱، ۲ یا ۳ را وارد کنید:")
        bot.register_next_step_handler(msg, process_quick_unlimited)
        return

    if data == 'quick_volume':
        if not is_admin(user_id):
            return
        msg = bot.send_message(user_id, "🛠️ **ساخت کانفیگ حجمی**\n\n📌 تعداد گیگ را وارد کنید (حداقل ۱۰):")
        bot.register_next_step_handler(msg, process_quick_volume)
        return

    if data == 'support':
        last_ticket = db_query('SELECT created_at FROM tickets WHERE user_id = ? ORDER BY created_at DESC LIMIT 1', (user_id,), fetch_one=True)
        if last_ticket:
            try:
                last_time = datetime.strptime(last_ticket[0], '%Y-%m-%d %H:%M:%S.%f')
                now = datetime.now()
                diff = (now - last_time).total_seconds()
                if diff < 3600:
                    remaining = int(3600 - diff)
                    minutes = remaining // 60
                    seconds = remaining % 60
                    bot.answer_callback_query(call.id, f"⏳ لطفاً {minutes} دقیقه و {seconds} ثانیه دیگر صبر کنید.", show_alert=True)
                    return
            except:
                pass
        
        bot.delete_message(user_id, call.message.message_id)
        msg = bot.send_message(user_id, "📞 **پشتیبانی**\n\n📌 لطفاً پیام خود را بنویسید:\n📝 حداکثر ۲۰۰ کاراکتر\n⏳ هر ۱ ساعت یک بار\n\n✏️ پیام خود را وارد کنید:")
        bot.register_next_step_handler(msg, process_ticket)
        return

    if data == 'about_us':
        keyboard = types.InlineKeyboardMarkup()
        keyboard.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger'))
        text = """💎 **درباره تیم VOIDI VPN** 💎

ما یک تیم حرفه‌ای در حوزه ارائه خدمات VPN و کانفیگ‌های V2Ray هستیم.

🔥 **چرا VOIDI VPN؟**

🔒 **امنیت بالا**
⚡ **سرعت و پایداری**
🛡️ **پشتیبانی ۲۴ ساعته**
💰 **قیمت‌های مناسب**

📢 **کانال ما:** @voidi_vpn

🔙 بازگشت"""
        bot.delete_message(user_id, call.message.message_id)
        send_menu(user_id, text, keyboard)
        return

    if data == 'admin_panel':
        if not is_master_admin(user_id):
            bot.answer_callback_query(call.id, "❌ شما دسترسی ندارید!", show_alert=True)
            return
        admin_panel_menu(call.message)
        return

    if data == 'admin_admins':
        if not is_master_admin(user_id):
            return
        admin_admins_menu(call.message)
        return

    if data == 'admin_admins_list':
        if not is_master_admin(user_id):
            return
        admins = db_query('SELECT user_id, username FROM admins', fetch_all=True)
        if not admins:
            bot.send_message(user_id, "📋 هیچ ادمینی ثبت نشده است!")
            return
        text = "📋 **لیست ادمین‌ها**\n\n"
        for admin in admins:
            text += f"🆔 {admin[0]}\n👤 {admin[1] or 'ندارد'}\n\n"
        bot.send_message(user_id, text, parse_mode=None)
        return

    if data == 'admin_admins_add':
        if not is_master_admin(user_id):
            return
        msg = bot.send_message(user_id, "➕ **افزودن ادمین جدید**\n\n📌 آیدی عددی ادمین جدید را وارد کنید:")
        bot.register_next_step_handler(msg, process_add_admin)
        return

    if data == 'admin_admins_remove':
        if not is_master_admin(user_id):
            return
        msg = bot.send_message(user_id, "❌ **حذف ادمین**\n\n📌 آیدی عددی ادمین را وارد کنید:")
        bot.register_next_step_handler(msg, process_remove_admin)
        return

    if data == 'admin_broadcast':
        if not is_master_admin(user_id):
            return
        msg = bot.send_message(user_id, "📢 **ارسال همگانی**\n\n📌 لطفاً پیام خود را وارد کنید:")
        bot.register_next_step_handler(msg, process_broadcast)
        return

    if data == 'admin_orders':
        if not is_master_admin(user_id):
            return
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        keyboard.add(
            types.InlineKeyboardButton("⏳ سفارشات در انتظار", callback_data='admin_orders_pending', style='primary'),
            types.InlineKeyboardButton("📋 همه سفارشات", callback_data='admin_orders_all', style='primary'),
            types.InlineKeyboardButton("🔙 بازگشت", callback_data='admin_panel', style='danger')
        )
        send_menu(user_id, "🛒 **مدیریت سفارشات**\n\nلطفاً یکی از گزینه‌ها را انتخاب کنید:", keyboard)
        return

    if data == 'admin_orders_pending':
        if not is_master_admin(user_id):
            return
        orders = db_query('SELECT id, user_id, tracking_code, title, price, details, created_at FROM orders WHERE status = "pending" ORDER BY id DESC LIMIT 20', fetch_all=True)
        if not orders:
            bot.send_message(user_id, "✅ هیچ سفارش در انتظاری وجود ندارد!")
            return
        for order in orders:
            keyboard = types.InlineKeyboardMarkup(row_width=2)
            keyboard.add(
                types.InlineKeyboardButton("✅ تایید", callback_data=f'approve_{order[0]}', style='success'),
                types.InlineKeyboardButton("❌ رد", callback_data=f'reject_{order[0]}', style='danger')
            )
            bot.send_message(user_id, f"🆔 {order[0]}\n👤 {order[1]}\n🔑 {order[2]}\n📋 {order[3]}\n💰 {format_price(order[4])} تومان\n📝 {order[5]}\n📅 {order[6]}", reply_markup=keyboard)
        return

    if data == 'admin_orders_all':
        if not is_master_admin(user_id):
            return
        orders = db_query('SELECT tracking_code, user_id, title, price, status, created_at FROM orders ORDER BY id DESC LIMIT 20', fetch_all=True)
        if not orders:
            bot.send_message(user_id, "📋 هیچ سفارشی یافت نشد!")
            return
        text = "📋 **آخرین سفارشات**\n\n"
        status_emoji = {'pending': '⏳', 'approved': '✅', 'rejected': '❌'}
        for order in orders:
            text += f"🔑 {order[0]}\n👤 {order[1]}\n📋 {order[2]}\n💰 {format_price(order[3])} تومان\n📊 {status_emoji.get(order[4], '❓')}\n📅 {order[5]}\n\n"
        bot.send_message(user_id, text, parse_mode=None)
        return

    if data == 'admin_users':
        if not is_master_admin(user_id):
            return
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        keyboard.add(
            types.InlineKeyboardButton("📋 لیست کاربران", callback_data='admin_users_list', style='primary'),
            types.InlineKeyboardButton("🔍 جستجوی کاربر", callback_data='admin_users_search', style='primary'),
            types.InlineKeyboardButton("🔙 بازگشت", callback_data='admin_panel', style='danger')
        )
        send_menu(user_id, "👥 **مدیریت کاربران**\n\nلطفاً یکی از گزینه‌ها را انتخاب کنید:", keyboard)
        return

    if data == 'admin_users_list':
        if not is_master_admin(user_id):
            return
        users = db_query('SELECT user_id, username, first_name, join_date FROM users ORDER BY user_id DESC LIMIT 20', fetch_all=True)
        if not users:
            bot.send_message(user_id, "📋 هیچ کاربری یافت نشد!")
            return
        text = "📋 **لیست کاربران (۲۰ مورد اخیر)**\n\n"
        for user in users:
            text += f"🆔 {user[0]}\n👤 {user[1] or 'ندارد'}\n📛 {user[2]}\n📅 {user[3]}\n\n"
        bot.send_message(user_id, text, parse_mode=None)
        return

    if data == 'admin_users_search':
        if not is_master_admin(user_id):
            return
        msg = bot.send_message(user_id, "🔍 **جستجوی کاربر**\n\n📌 آیدی عددی کاربر را وارد کنید:")
        bot.register_next_step_handler(msg, process_search_user)
        return

    if data.startswith('approve_'):
        if not is_master_admin(user_id):
            return
        order_id = int(data.replace('approve_', ''))
        order = db_query('SELECT user_id, title FROM orders WHERE id = ?', (order_id,), fetch_one=True)
        if order:
            # ساخت کانفیگ روی پنل
            username = f"user_{order[0]}_{random.randint(1000, 9999)}"
            config_link = create_config_on_panel(username, 50, 30)  # پیش‌فرض ۵۰ گیگ، ۳۰ روز
            if config_link:
                db_query('UPDATE orders SET status = "approved", updated_at = ? WHERE id = ?', (datetime.now().isoformat(), order_id), commit=True)
                bot.send_message(order[0], f"✅ **سفارش شما تایید شد!** 🎉\n\n📋 {order[1]}\n\n📥 **لینک کانفیگ:**\n{config_link}\n\n📌 کانفیگ را در برنامه مربوطه وارد کنید.")
                bot.send_message(user_id, f"✅ سفارش {order_id} تایید و کانفیگ ارسال شد!")
            else:
                bot.send_message(user_id, f"❌ خطا در ساخت کانفیگ برای سفارش {order_id}!")
        return

    if data.startswith('reject_'):
        if not is_master_admin(user_id):
            return
        order_id = int(data.replace('reject_', ''))
        msg = bot.send_message(user_id, f"❌ **رد سفارش**\n\n📌 دلیل رد را وارد کنید:")
        bot.register_next_step_handler(msg, lambda m: process_reject_order(m, order_id))
        return

    if data.startswith('unlimited_'):
        months = int(data.split('_')[1])
        prices = {1: 400000, 2: 700000, 3: 950000}
        price = prices[months]
        user_temp_data[user_id] = {'order_type': 'unlimited', 'months': months, 'price': price, 'title': f'{months} ماه نامحدود'}
        bot.delete_message(user_id, call.message.message_id)
        send_menu(user_id, f"🛒 **خرید کانفیگ {months} ماه نامحدود**\n\n💰 مبلغ: {format_price(price)} تومان\n\n💎 **آدرس کیف پول TON:**\n`{TON_ADDRESS}`\n\n🟢 پرداخت کردم\n🔴 بازگشت", types.InlineKeyboardMarkup().add(
            types.InlineKeyboardButton("🟢 پرداخت کردم", callback_data='payment_done_unlimited', style='success'),
            types.InlineKeyboardButton("🔴 بازگشت", callback_data='buy_config', style='danger')
        ))
        return

    if data == 'payment_done_unlimited':
        user_temp_data[user_id]['step'] = 'waiting_screenshot'
        bot.delete_message(user_id, call.message.message_id)
        send_menu(user_id, "📸 لطفاً تصویر اسکرین‌شات واریز را ارسال کنید.", types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')))
        return

def process_volume_order(message):
    user_id = message.chat.id
    try:
        gb = int(message.text.strip())
        if gb < 10:
            bot.send_message(user_id, "❌ حداقل خرید ۱۰ گیگ است!")
            return
        if gb > 500:
            bot.send_message(user_id, "❌ حداکثر خرید ۵۰۰ گیگ است!")
            return
        
        price = gb * 2500
        user_temp_data[user_id] = {'order_type': 'volume', 'gb': gb, 'price': price, 'title': f'{gb} گیگ حجمی'}
        bot.delete_message(user_id, message.message_id)
        send_menu(user_id, f"🛒 **خرید کانفیگ {gb} گیگ**\n\n💰 مبلغ: {format_price(price)} تومان\n\n💎 **آدرس کیف پول TON:**\n`{TON_ADDRESS}`\n\n🟢 پرداخت کردم\n🔴 بازگشت", types.InlineKeyboardMarkup().add(
            types.InlineKeyboardButton("🟢 پرداخت کردم", callback_data='payment_done_volume', style='success'),
            types.InlineKeyboardButton("🔴 بازگشت", callback_data='buy_config', style='danger')
        ))
    except:
        bot.send_message(user_id, "❌ لطفاً فقط عدد وارد کنید!")

def process_quick_unlimited(message):
    user_id = message.chat.id
    try:
        months = int(message.text.strip())
        if months not in [1, 2, 3]:
            bot.send_message(user_id, "❌ لطفاً عدد ۱، ۲ یا ۳ را وارد کنید!")
            return
        
        duration_days = months * 30
        volume = 0  # نامحدود
        username = f"admin_{user_id}_{random.randint(1000, 9999)}"
        
        config_link = create_config_on_panel(username, 999999, duration_days)  # حجم بسیار بالا برای نامحدود
        if config_link:
            bot.delete_message(user_id, message.message_id)
            send_menu(user_id, f"✅ **کانفیگ ساخته شد!** 🎉\n\n📋 نوع: {months} ماه نامحدود\n📥 لینک: {config_link}", types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')))
        else:
            bot.send_message(user_id, "❌ خطا در ساخت کانفیگ! لطفاً دوباره تلاش کنید.")
    except:
        bot.send_message(user_id, "❌ لطفاً فقط عدد وارد کنید!")

def process_quick_volume(message):
    user_id = message.chat.id
    try:
        gb = int(message.text.strip())
        if gb < 10:
            bot.send_message(user_id, "❌ حداقل ۱۰ گیگ!")
            return
        if gb > 500:
            bot.send_message(user_id, "❌ حداکثر ۵۰۰ گیگ!")
            return
        
        username = f"admin_{user_id}_{random.randint(1000, 9999)}"
        config_link = create_config_on_panel(username, gb, 365)  # ۱ سال برای حجمی
        if config_link:
            bot.delete_message(user_id, message.message_id)
            send_menu(user_id, f"✅ **کانفیگ ساخته شد!** 🎉\n\n📋 نوع: {gb} گیگ حجمی\n📥 لینک: {config_link}", types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')))
        else:
            bot.send_message(user_id, "❌ خطا در ساخت کانفیگ! لطفاً دوباره تلاش کنید.")
    except:
        bot.send_message(user_id, "❌ لطفاً فقط عدد وارد کنید!")

def process_ticket(message):
    user_id = message.chat.id
    text = message.text.strip()
    
    if len(text) > 200:
        bot.send_message(user_id, "❌ پیام شما بیشتر از ۲۰۰ کاراکتر است!")
        return
    
    db_query('INSERT INTO tickets (user_id, message, status, created_at) VALUES (?, ?, ?, ?)', 
             (user_id, text, 'open', datetime.now().isoformat()), commit=True)
    
    bot.delete_message(user_id, message.message_id)
    send_menu(user_id, "✅ پیام شما ارسال شد! به زودی پاسخ داده می‌شود.", types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')))
    
    for admin in ADMIN_IDS:
        try:
            bot.send_message(admin, f"📩 **تیکت جدید**\n\n👤 {user_id}\n📝 {text}")
        except:
            pass

def process_add_admin(message):
    user_id = message.chat.id
    try:
        new_admin = int(message.text.strip())
        if is_admin(new_admin):
            bot.send_message(user_id, "❌ این کاربر قبلاً ادمین است!")
            return
        
        db_query('INSERT INTO admins (user_id, added_by, added_at) VALUES (?, ?, ?)', 
                 (new_admin, user_id, datetime.now().isoformat()), commit=True)
        bot.send_message(user_id, f"✅ ادمین {new_admin} با موفقیت اضافه شد!")
        try:
            bot.send_message(new_admin, "✅ شما به عنوان ادمین ربات اضافه شدید!")
        except:
            pass
    except:
        bot.send_message(user_id, "❌ لطفاً یک آیدی عددی معتبر وارد کنید!")

def process_remove_admin(message):
    user_id = message.chat.id
    try:
        admin_id = int(message.text.strip())
        if admin_id == MASTER_ADMIN:
            bot.send_message(user_id, "❌ نمی‌توانید ادمین اصلی را حذف کنید!")
            return
        if not is_admin(admin_id):
            bot.send_message(user_id, "❌ این کاربر ادمین نیست!")
            return
        
        db_query('DELETE FROM admins WHERE user_id = ?', (admin_id,), commit=True)
        bot.send_message(user_id, f"✅ ادمین {admin_id} با موفقیت حذف شد!")
    except:
        bot.send_message(user_id, "❌ لطفاً یک آیدی عددی معتبر وارد کنید!")

def process_broadcast(message):
    user_id = message.chat.id
    text = message.text.strip()
    users = db_query('SELECT user_id FROM users', fetch_all=True)
    count = 0
    for user in users:
        try:
            bot.send_message(user[0], f"📢 **پیام همگانی**\n\n{text}")
            count += 1
            time.sleep(0.05)
        except:
            pass
    bot.send_message(user_id, f"✅ پیام به {count} نفر ارسال شد!")

def process_search_user(message):
    user_id = message.chat.id
    try:
        target_id = int(message.text.strip())
        user = db_query('SELECT user_id, username, first_name, join_date FROM users WHERE user_id = ?', (target_id,), fetch_one=True)
        if not user:
            bot.send_message(user_id, "❌ کاربری یافت نشد!")
            return
        text = f"👤 **اطلاعات کاربر**\n\n🆔 {user[0]}\n👤 {user[1] or 'ندارد'}\n📛 {user[2]}\n📅 {user[3]}"
        bot.send_message(user_id, text, parse_mode=None)
    except:
        bot.send_message(user_id, "❌ لطفاً یک آیدی عددی معتبر وارد کنید!")

def process_reject_order(message, order_id):
    user_id = message.chat.id
    reason = message.text.strip()
    db_query('UPDATE orders SET status = "rejected", admin_note = ?, updated_at = ? WHERE id = ?', (reason, datetime.now().isoformat(), order_id), commit=True)
    order = db_query('SELECT user_id, title FROM orders WHERE id = ?', (order_id,), fetch_one=True)
    if order:
        bot.send_message(order[0], f"❌ **سفارش شما رد شد!**\n\n📋 {order[1]}\n\n🔍 دلیل: {reason}")
    bot.send_message(user_id, f"✅ سفارش {order_id} رد شد!")

@bot.message_handler(content_types=['photo'])
def handle_screenshot(message):
    user_id = message.chat.id
    data = user_temp_data.get(user_id, {})
    step = data.get('step')
    
    if step != 'waiting_screenshot':
        bot.send_message(user_id, "❌ لطفاً از دکمه‌ها استفاده کنید!")
        return
    
    photo = message.photo[-1]
    tracking = generate_tracking_code()
    order_type = data.get('order_type', 'unknown')
    title = data.get('title', 'سفارش')
    price = data.get('price', 0)
    details = ''
    
    if order_type == 'unlimited':
        details = f'{data.get("months")} ماه نامحدود'
    elif order_type == 'volume':
        details = f'{data.get("gb")} گیگ حجمی'
    
    db_query('INSERT INTO orders (user_id, tracking_code, service_type, title, price, quantity, details, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)',
             (user_id, tracking, order_type, title, price, 1, details, 'pending', datetime.now().isoformat()), commit=True)
    
    for admin in ADMIN_IDS:
        try:
            bot.send_photo(admin, photo.file_id, caption=f"📩 **سفارش جدید!**\n\n👤 {user_id}\n📋 {title}\n💰 {format_price(price)} تومان\n🔑 {tracking}\n📝 {details}")
        except:
            pass
    
    bot.delete_message(user_id, message.message_id)
    send_menu(user_id, f"✅ اسکرین‌شات شما دریافت شد!\n\n🔑 **کد پیگیری:** {tracking}\n\n🔄 در حال بررسی توسط ادمین...", types.InlineKeyboardMarkup().add(types.InlineKeyboardButton("🔙 بازگشت", callback_data='back_main', style='danger')))
    del user_temp_data[user_id]

@bot.message_handler(func=lambda message: True)
def handle_messages(message):
    user_id = message.chat.id
    text = message.text
    
    if text == "🔙 بازگشت به منو اصلی":
        main_menu(message)
        return

if __name__ == '__main__':
    print("🤖 ربات VOIDI VPN در حال اجراست...")
    while True:
        try:
            bot.polling(none_stop=True, interval=0, timeout=20)
        except Exception as e:
            print(f"❌ خطا: {e}")
            time.sleep(5)