import asyncio
from datetime import datetime, timedelta
from telegram import (
    Update, ReplyKeyboardMarkup, InlineKeyboardButton,
    InlineKeyboardMarkup, Bot
)
from telegram.ext import (
    Application, CommandHandler, MessageHandler, CallbackQueryHandler,
    ContextTypes, filters
)
from telegram.constants import ChatMemberStatus
import sqlite3
import os

# ========== تنظیمات ==========
ADMIN_IDS = [2144744835, 8535529811]
TOKEN = "8963125128:AAGfNrNKU1gtgDmLa4zZKKhZs5zqMxMmET4"
CHANNEL_ID = "@Cyber_akant1"
CHANNEL_LINK = "https://t.me/Cyber_akant1"
GAP_ID = "@ethad_cyber1"
GAP_LINK = "https://t.me/ethad_cyber1"
DB_NAME = "bot_database.db"

# ========== دیتابیس ==========
def get_db():
    conn = sqlite3.connect(DB_NAME, timeout=30)
    conn.execute("PRAGMA journal_mode=WAL")
    return conn

def init_db():
    conn = get_db()
    c = conn.cursor()
    
    c.execute('''CREATE TABLE IF NOT EXISTS users (
        user_id INTEGER PRIMARY KEY,
        username TEXT,
        balance REAL DEFAULT 0,
        referrer_id INTEGER,
        is_vip INTEGER DEFAULT 0,
        vip_expire TEXT,
        is_banned INTEGER DEFAULT 0,
        joined_at TEXT
    )''')
    
    c.execute('''CREATE TABLE IF NOT EXISTS configs (
        config_id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        plan TEXT,
        config_data TEXT,
        is_free INTEGER DEFAULT 0,
        is_vip INTEGER DEFAULT 0,
        created_at TEXT
    )''')
    
    c.execute('''CREATE TABLE IF NOT EXISTS orders (
        order_id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        plan TEXT,
        amount REAL,
        receipt_path TEXT,
        status TEXT DEFAULT 'pending',
        config_data TEXT,
        is_vip_order INTEGER DEFAULT 0,
        created_at TEXT
    )''')
    
    c.execute('''CREATE TABLE IF NOT EXISTS settings (
        key TEXT PRIMARY KEY,
        value TEXT
    )''')
    
    c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('sale_active', '1')")
    c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('free_config_active', '1')")
    c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('referral_active', '1')")
    c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('normal_price_per_gig', '210000')")
    c.execute("INSERT OR IGNORE INTO settings (key, value) VALUES ('vip_price_per_gig', '190000')")
    
    conn.commit()
    conn.close()

def is_admin(user_id):
    return user_id in ADMIN_IDS

def format_balance(amount):
    return f"{int(amount):,}"

def is_user_banned(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT is_banned FROM users WHERE user_id=?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result and result[0] == 1

def ban_user(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, balance, joined_at) VALUES (?, ?, ?)",
              (user_id, 0, datetime.now().isoformat()))
    c.execute("UPDATE users SET is_banned=1 WHERE user_id=?", (user_id,))
    conn.commit()
    conn.close()

def unban_user(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("UPDATE users SET is_banned=0 WHERE user_id=?", (user_id,))
    conn.commit()
    conn.close()

def is_user_vip(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT is_vip, vip_expire FROM users WHERE user_id=?", (user_id,))
    result = c.fetchone()
    conn.close()
    
    if not result or not result[0]:
        return False
    
    if result[1]:
        try:
            expire_date = datetime.fromisoformat(result[1])
            if datetime.now() > expire_date:
                conn = get_db()
                c = conn.cursor()
                c.execute("UPDATE users SET is_vip=0, vip_expire=NULL WHERE user_id=?", (user_id,))
                conn.commit()
                conn.close()
                return False
        except:
            pass
        return True
    return False

def get_vip_expire(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT vip_expire FROM users WHERE user_id=?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result[0] if result and result[0] else None

def activate_vip(user_id):
    expire = (datetime.now() + timedelta(days=30)).isoformat()
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, balance, joined_at) VALUES (?, ?, ?)",
              (user_id, 0, datetime.now().isoformat()))
    c.execute("UPDATE users SET is_vip=1, vip_expire=? WHERE user_id=?", (expire, user_id))
    conn.commit()
    conn.close()

def get_normal_price():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT value FROM settings WHERE key='normal_price_per_gig'")
    result = c.fetchone()
    conn.close()
    return float(result[0]) if result else 210000

def get_vip_price():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT value FROM settings WHERE key='vip_price_per_gig'")
    result = c.fetchone()
    conn.close()
    return float(result[0]) if result else 190000

def get_price_per_gig(user_id):
    if is_user_vip(user_id):
        return get_vip_price()
    return get_normal_price()

def is_free_config_active():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT value FROM settings WHERE key='free_config_active'")
    result = c.fetchone()
    conn.close()
    return result and result[0] == '1'

def is_referral_active():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT value FROM settings WHERE key='referral_active'")
    result = c.fetchone()
    conn.close()
    return result and result[0] == '1'

# ========== کیبورد اصلی ==========
MAIN_KEYBOARD = ReplyKeyboardMarkup([
    ["🛒 خرید سرویس", "🎁 کانفیگ رایگان", "👑 اشتراک VIP"],
    ["🌟 سرویس VIP", "👤 حساب کاربری", "💰 کیف پول"],
    ["📦 سرویس‌های من", "👥 زیرمجموعه‌گیری", "📞 پشتیبانی"]
], resize_keyboard=True)

# ========== توابع دیتابیس ==========
def is_sale_active():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT value FROM settings WHERE key='sale_active'")
    result = c.fetchone()
    conn.close()
    return result and result[0] == '1'

def get_user_balance(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT balance FROM users WHERE user_id=?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result[0] if result else 0

def add_balance(user_id, amount):
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, balance, joined_at) VALUES (?, ?, ?)",
              (user_id, 0, datetime.now().isoformat()))
    c.execute("UPDATE users SET balance = balance + ? WHERE user_id=?", (amount, user_id))
    conn.commit()
    conn.close()

def deduct_balance(user_id, amount):
    conn = get_db()
    c = conn.cursor()
    c.execute("UPDATE users SET balance = balance - ? WHERE user_id=? AND balance >= ?",
              (amount, user_id, amount))
    success = c.rowcount > 0
    conn.commit()
    conn.close()
    return success

def save_order(user_id, plan, amount, is_vip_order=0):
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT INTO orders (user_id, plan, amount, is_vip_order, created_at) VALUES (?, ?, ?, ?, ?)",
              (user_id, plan, amount, is_vip_order, datetime.now().isoformat()))
    order_id = c.lastrowid
    conn.commit()
    conn.close()
    return order_id

def update_order_status(order_id, status, config_data=None):
    conn = get_db()
    c = conn.cursor()
    if config_data:
        c.execute("UPDATE orders SET status=?, config_data=? WHERE order_id=?",
                  (status, config_data, order_id))
    else:
        c.execute("UPDATE orders SET status=? WHERE order_id=?", (status, order_id))
    conn.commit()
    conn.close()

def get_order(order_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT * FROM orders WHERE order_id=?", (order_id,))
    result = c.fetchone()
    conn.close()
    return result

def save_config(user_id, plan, config_data, is_free=0, is_vip=0):
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT INTO configs (user_id, plan, config_data, is_free, is_vip, created_at) VALUES (?, ?, ?, ?, ?, ?)",
              (user_id, plan, config_data, is_free, is_vip, datetime.now().isoformat()))
    conn.commit()
    conn.close()

def get_user_configs(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT config_id, user_id, plan, config_data, is_free, is_vip, created_at FROM configs WHERE user_id=? ORDER BY created_at DESC", (user_id,))
    results = c.fetchall()
    conn.close()
    return results

def get_all_users():
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT user_id FROM users")
    results = c.fetchall()
    conn.close()
    return [r[0] for r in results]

def get_user_id_by_username(username):
    conn = get_db()
    c = conn.cursor()
    clean = username.replace("@", "").strip().lower()
    c.execute("SELECT user_id FROM users WHERE LOWER(username)=?", (clean,))
    result = c.fetchone()
    conn.close()
    return result[0] if result else None

def user_exists(user_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT 1 FROM users WHERE user_id=?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result is not None

def set_referrer(user_id, referrer_id):
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, balance, joined_at) VALUES (?, ?, ?)",
              (user_id, 0, datetime.now().isoformat()))
    c.execute("SELECT referrer_id FROM users WHERE user_id=?", (user_id,))
    row = c.fetchone()
    if row and row[0] is not None:
        conn.close()
        return False
    c.execute("UPDATE users SET referrer_id=? WHERE user_id=?", (referrer_id, user_id))
    conn.commit()
    conn.close()
    return True

# ========== عضویت ==========
async def check_membership(user_id, context):
    try:
        member = await context.bot.get_chat_member(chat_id=CHANNEL_ID, user_id=user_id)
        if member.status in [ChatMemberStatus.LEFT, ChatMemberStatus.BANNED]:
            return False
        if GAP_ID:
            mg = await context.bot.get_chat_member(chat_id=GAP_ID, user_id=user_id)
            if mg.status in [ChatMemberStatus.LEFT, ChatMemberStatus.BANNED]:
                return False
        return True
    except:
        return False

async def require_membership(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    if not await check_membership(user.id, context):
        keyboard = []
        if GAP_ID:
            keyboard.append([InlineKeyboardButton("💬 عضویت در گروه", url=GAP_LINK)])
        keyboard.append([InlineKeyboardButton("📢 عضویت در کانال", url=CHANNEL_LINK)])
        keyboard.append([InlineKeyboardButton("🔄 بررسی عضویت", callback_data="check_join")])
        
        channels_text = f"کانال {CHANNEL_ID}"
        if GAP_ID:
            channels_text += f" و گروه {GAP_ID}"
        
        await update.message.reply_text(
            f"❌ شما هنوز در {channels_text} عضو نشده‌اید!\n\n"
            f"لطفاً ابتدا عضو شوید سپس دکمه بررسی عضویت را بزنید.",
            reply_markup=InlineKeyboardMarkup(keyboard)
        )
        return False
    return True

async def check_banned(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    if is_user_banned(user.id):
        await update.message.reply_text("⛔ شما از ربات بن شده‌اید.")
        return True
    return False

# ========== استارت ==========
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    
    if is_user_banned(user.id):
        await update.message.reply_text("⛔ شما از ربات بن شده‌اید.")
        return
    
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, username, joined_at) VALUES (?, ?, ?)",
              (user.id, user.username, datetime.now().isoformat()))
    c.execute("UPDATE users SET username=? WHERE user_id=?", (user.username, user.id))
    conn.commit()
    conn.close()
    
    if update.message and update.message.text:
        parts = update.message.text.split()
        if len(parts) > 1:
            try:
                referrer_id = int(parts[1])
                if referrer_id != user.id:
                    if is_referral_active():
                        if set_referrer(user.id, referrer_id):
                            add_balance(referrer_id, 10000)
                            
                            conn = get_db()
                            c = conn.cursor()
                            c.execute("SELECT COUNT(*) FROM users WHERE referrer_id=?", (referrer_id,))
                            count = c.fetchone()[0]
                            conn.close()
                            
                            try:
                                await context.bot.send_message(
                                    chat_id=referrer_id,
                                    text=f"🎉 یک نفر از طریق لینک دعوت شما وارد ربات شد!\n"
                                         f"💰 10,000 تومان به کیف پول شما اضافه شد.\n"
                                         f"👥 تعداد دعوت‌شده‌ها: {count} نفر\n\n"
                                         f"🎁 با ۲۰ دعوت → ۱ گیگ کانفیگ رایگان!"
                                )
                            except:
                                pass
                            
                            if count >= 20 and count % 20 == 0:
                                save_config(referrer_id, "1G", "🎁 کانفیگ ۱ گیگ رایگان (هدیه ۲۰ دعوت)", is_free=1)
                                try:
                                    await context.bot.send_message(
                                        chat_id=referrer_id,
                                        text="🎁 <b>تبریک!</b> شما ۲۰ نفر رو دعوت کردید!\n\n"
                                             "📦 <b>۱ گیگ کانفیگ رایگان</b> به سرویس‌های شما اضافه شد.\n"
                                             "از بخش \"📦 سرویس‌های من\" می‌تونید مشاهده کنید.\n\n"
                                             "⚠️ لطفاً با پشتیبانی تماس بگیرید تا کانفیگ براتون فعال بشه.",
                                        parse_mode='HTML'
                                    )
                                except:
                                    pass
                    else:
                        conn = get_db()
                        c = conn.cursor()
                        c.execute("INSERT OR IGNORE INTO users (user_id, balance, joined_at) VALUES (?, ?, ?)",
                                  (user.id, 0, datetime.now().isoformat()))
                        c.execute("UPDATE users SET referrer_id=? WHERE user_id=? AND referrer_id IS NULL",
                                  (referrer_id, user.id))
                        conn.commit()
                        conn.close()
            except ValueError:
                pass
    
    if not await check_membership(user.id, context):
        keyboard = []
        if GAP_ID:
            keyboard.append([InlineKeyboardButton("💬 عضویت در گروه", url=GAP_LINK)])
        keyboard.append([InlineKeyboardButton("📢 عضویت در کانال", url=CHANNEL_LINK)])
        keyboard.append([InlineKeyboardButton("🔄 بررسی عضویت", callback_data="check_join")])
        
        channels_text = f"کانال {CHANNEL_ID}"
        if GAP_ID:
            channels_text += f" و گروه {GAP_ID}"
        
        await update.message.reply_text(
            f"👋 سلام {user.first_name}!\n\n"
            f"برای استفاده از ربات، لطفاً در {channels_text} عضو شوید.",
            reply_markup=InlineKeyboardMarkup(keyboard)
        )
        return
    
    await update.message.reply_text(
        f"👋 سلام {user.first_name}!\n✨ به ربات فروش کانفیگ خوش آمدید.\n\n"
        f"لطفاً از منوی زیر گزینه مورد نظر را انتخاب کنید:",
        reply_markup=MAIN_KEYBOARD
    )

async def check_join_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    
    try:
        await query.answer()
    except:
        pass
    
    if is_user_banned(query.from_user.id):
        try:
            await query.answer("⛔ شما بن شده‌اید!", show_alert=True)
        except:
            pass
        return
    
    if await check_membership(query.from_user.id, context):
        try:
            await query.message.delete()
        except:
            pass
        await query.message.reply_text(
            f"👋 سلام {query.from_user.first_name}!\n✨ به ربات خوش آمدید.\n\n"
            f"لطفاً از منوی زیر گزینه مورد نظر را انتخاب کنید:",
            reply_markup=MAIN_KEYBOARD
        )
    else:
        channels_text = f"کانال {CHANNEL_ID}"
        if GAP_ID:
            channels_text += f" و گروه {GAP_ID}"
        try:
            await query.answer(f"❌ هنوز در {channels_text} عضو نشده‌اید!", show_alert=True)
        except:
            pass

# ========== خرید سرویس عادی ==========
async def buy_service(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    if not is_sale_active():
        await update.message.reply_text("❌ در حال حاضر کانفیگ موجود نمی‌باشد.", reply_markup=MAIN_KEYBOARD)
        return
    
    price_per_gig = get_price_per_gig(update.effective_user.id)
    context.user_data['buying_vip_service'] = False
    
    plans = []
    for i in range(1, 11):
        plans.append((f"{i} گیگ - {format_balance(i * price_per_gig)} تومان", f"{i}G"))
    
    keyboard = []
    for text, plan in plans:
        keyboard.append([InlineKeyboardButton(text, callback_data=f"plan_{plan}")])
    keyboard.append([InlineKeyboardButton("✏️ گیگ دلخواه", callback_data="custom_gig")])
    keyboard.append([InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")])
    
    await update.message.reply_text(
        f"📦 پلن مورد نظر را انتخاب کنید:\n\n✅ تمام سرویس‌ها نامحدود\n💰 قیمت هر گیگ: {format_balance(price_per_gig)} تومان",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== خرید سرویس VIP ==========
async def buy_vip_service(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    if not is_sale_active():
        await update.message.reply_text("❌ در حال حاضر کانفیگ موجود نمی‌باشد.", reply_markup=MAIN_KEYBOARD)
        return
    
    if not is_user_vip(update.effective_user.id):
        await update.message.reply_text(
            "❌ شما اشتراک VIP ندارید!\n\n"
            "برای خرید سرویس VIP باید ابتدا اشتراک VIP را خریداری کنید.\n"
            "از منوی اصلی گزینه \"👑 اشتراک VIP\" را انتخاب کنید.",
            reply_markup=MAIN_KEYBOARD
        )
        return
    
    price_per_gig = get_vip_price()
    context.user_data['buying_vip_service'] = True
    
    plans = []
    for i in range(1, 11):
        plans.append((f"{i} گیگ - {format_balance(i * price_per_gig)} تومان", f"{i}G"))
    
    keyboard = []
    for text, plan in plans:
        keyboard.append([InlineKeyboardButton(text, callback_data=f"plan_{plan}")])
    keyboard.append([InlineKeyboardButton("✏️ گیگ دلخواه", callback_data="custom_gig")])
    keyboard.append([InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")])
    
    await update.message.reply_text(
        f"🌟 پلن VIP مورد نظر را انتخاب کنید:\n\n✅ تمام سرویس‌ها نامحدود\n💰 قیمت هر گیگ: {format_balance(price_per_gig)} تومان",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== خرید اشتراک VIP ==========
async def buy_vip_subscription(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    if is_user_vip(update.effective_user.id):
        expire = get_vip_expire(update.effective_user.id)
        expire_text = expire[:10] if expire else "نامشخص"
        vip_price = format_balance(get_vip_price())
        await update.message.reply_text(
            f"✅ شما قبلاً اشتراک VIP دارید!\n\n"
            f"📅 تاریخ انقضا: {expire_text}\n"
            f"💰 قیمت هر گیگ VIP: {vip_price} تومان\n\n"
            f"پس از اتمام اشتراک می‌توانید دوباره خریداری کنید.",
            reply_markup=MAIN_KEYBOARD
        )
        return
    
    context.user_data['buying_vip'] = True
    context.user_data['selected_plan'] = 'VIP_1M'
    context.user_data['selected_amount'] = 300000
    
    vip_price = format_balance(get_vip_price())
    normal_price = format_balance(get_normal_price())
    
    await update.message.reply_text(
        f"👑 <b>اشتراک VIP یک ماهه</b>\n\n"
        f"📅 مدت: ۳۰ روز\n"
        f"💰 قیمت: ۳۰۰,۰۰۰ تومان\n\n"
        f"✨ <b>مزایای VIP:</b>\n"
        f"🔹 قیمت هر گیگ: {vip_price} تومان (به جای {normal_price})\n"
        f"🔹 دسترسی به بخش خرید سرویس VIP\n"
        f"🔹 صرفه‌جویی {format_balance(get_normal_price() - get_vip_price())} تومان در هر گیگ\n\n"
        f"سفارش شما آماده پرداخت است.",
        parse_mode='HTML',
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💳 کارت به کارت", callback_data="card_pay")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")]
        ])
    )

# ========== گیگ دلخواه ==========
async def custom_gig_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    context.user_data['awaiting_custom_gig'] = True
    context.user_data.pop('awaiting_receipt', None)
    
    is_vip = context.user_data.get('buying_vip_service', False)
    price = get_vip_price() if is_vip else get_price_per_gig(query.from_user.id)
    
    try:
        await query.edit_message_text(
            f"✏️ <b>انتخاب گیگ دلخواه</b>\n\n"
            f"لطفاً مقدار گیگ مورد نظر خود را وارد کنید (مثلاً ۱۱):\n\n"
            f"💰 قیمت هر گیگ: {format_balance(price)} تومان\n"
            f"📅 مدت اعتبار: نامحدود",
            parse_mode='HTML',
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
            ])
        )
    except:
        pass

async def handle_custom_gig(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    
    if not update.message or not update.message.text:
        return
    
    text = update.message.text.strip()
    
    try:
        gig = int(text)
        if gig <= 0:
            await update.message.reply_text(
                "❌ لطفاً یک عدد مثبت وارد کنید.",
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
                ])
            )
            return
    except ValueError:
        await update.message.reply_text(
            "❌ لطفاً فقط عدد وارد کنید (مثلاً ۱۱).",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
            ])
        )
        return
    
    is_vip = context.user_data.get('buying_vip_service', False)
    price_per_gig = get_vip_price() if is_vip else get_price_per_gig(user.id)
    amount = gig * price_per_gig
    plan = f"{gig}G"
    
    context.user_data['selected_plan'] = plan
    context.user_data['selected_amount'] = amount
    context.user_data['awaiting_custom_gig'] = False
    context.user_data['custom_gig'] = gig
    
    await update.message.reply_text(
        f"🧾 <b>پیش‌فاکتور</b>\n\n"
        f"📦 سرویس: {gig} گیگ (دلخواه)\n"
        f"📅 مدت اعتبار: نامحدود\n"
        f"💾 حجم: {gig} گیگ\n\n"
        f"💰 مبلغ: {format_balance(amount)} تومان\n\n"
        f"سفارش شما آماده پرداخت است.",
        parse_mode='HTML',
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💳 کارت به کارت", callback_data="card_pay")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
        ])
    )

async def plan_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if not is_sale_active():
        await query.edit_message_text("❌ فروش غیرفعال است.")
        return
    
    plan = query.data.replace("plan_", "")
    is_vip = context.user_data.get('buying_vip_service', False)
    price_per_gig = get_vip_price() if is_vip else get_price_per_gig(query.from_user.id)
    
    plans_info = {}
    for i in range(1, 11):
        plans_info[f"{i}G"] = (f"{i} گیگ", i * price_per_gig)
    
    plan_name, amount = plans_info[plan]
    context.user_data['selected_plan'] = plan
    context.user_data['selected_amount'] = amount
    context.user_data.pop('awaiting_custom_gig', None)
    context.user_data.pop('custom_gig', None)
    
    await query.edit_message_text(
        f"🧾 پیش‌فاکتور\n\n📦 سرویس: {plan_name}\n📅 مدت: نامحدود\n💾 حجم: {plan_name}\n\n"
        f"💰 مبلغ: {format_balance(amount)} تومان\n\nسفارش شما آماده پرداخت است.",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💳 کارت به کارت", callback_data="card_pay")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
        ])
    )

async def card_pay_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    amount = context.user_data.get('selected_amount', 0)
    plan = context.user_data.get('selected_plan', '')
    custom_gig = context.user_data.get('custom_gig', None)
    
    if plan == 'VIP_1M':
        plan_name = "اشتراک VIP یک ماهه"
    elif custom_gig:
        plan_name = f"{custom_gig} گیگ (دلخواه)"
    else:
        try:
            g = int(plan.replace("G", ""))
            plan_name = f"{g} گیگ"
        except:
            plan_name = plan
    
    await query.edit_message_text(
        f"💳 <b>پرداخت</b>\n\n📦 {plan_name}\n💰 {format_balance(amount)} تومان\n\n"
        f"شماره کارت:\n<code>5859831225049732</code>\nبه نام: <b>امیر مهدی</b>\n\n"
        f"🟢 اعتبار یک ساعت\n🔴 مسئولیت واریز اشتباهی با شماست.\n🟡 بعد از واریز دکمه ادامه رو بزنید.",
        parse_mode='HTML',
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("📤 ادامه (ارسال رسید)", callback_data="send_receipt")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_invoice")]
        ])
    )

async def send_receipt_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data['awaiting_receipt'] = True
    context.user_data.pop('awaiting_custom_gig', None)
    context.user_data.pop('awaiting_broadcast', None)
    
    await query.edit_message_text(
        "📤 لطفاً تصویر رسید پرداخت خود را ارسال کنید.",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_card")]
        ])
    )

async def handle_receipt(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    
    if is_admin(user.id) and context.user_data.get('awaiting_broadcast'):
        await handle_broadcast(update, context)
        return
    
    if not context.user_data.get('awaiting_receipt'):
        return
    
    photo = update.message.photo[-1]
    plan = context.user_data.get('selected_plan')
    amount = context.user_data.get('selected_amount', 0)
    is_vip_order = 1 if plan == 'VIP_1M' else (1 if context.user_data.get('buying_vip_service') else 0)
    
    file = await context.bot.get_file(photo.file_id)
    os.makedirs("receipts", exist_ok=True)
    receipt_path = f"receipts/{user.id}_{datetime.now().timestamp()}.jpg"
    await file.download_to_drive(receipt_path)
    
    order_id = save_order(user.id, plan, amount, is_vip_order)
    context.user_data['awaiting_receipt'] = False
    
    username_text = f"@{user.username}" if user.username else "بدون یوزرنیم"
    
    for admin_id in ADMIN_IDS:
        try:
            plan_display = plan
            if plan == 'VIP_1M':
                plan_display = "اشتراک VIP یک ماهه"
            else:
                try:
                    g = int(plan.replace("G", ""))
                    plan_display = f"{g} گیگ"
                except:
                    pass
            
            await context.bot.send_photo(
                chat_id=admin_id,
                photo=open(receipt_path, 'rb'),
                caption=f"📮 سفارش جدید\n\n"
                        f"👤 {username_text}\n"
                        f"🆔 <code>{user.id}</code>\n"
                        f"📦 {plan_display}\n"
                        f"💰 {format_balance(amount)} تومان\n\n"
                        f"⏳ در انتظار تایید",
                parse_mode='HTML',
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("✅ تایید رسید", callback_data=f"approve_{order_id}")],
                    [InlineKeyboardButton("❌ رد رسید", callback_data=f"reject_{order_id}")]
                ])
            )
        except:
            continue
    
    await update.message.reply_text("✅ رسید دریافت شد.\n⏳ منتظر تایید ادمین باشید.", reply_markup=MAIN_KEYBOARD)

async def handle_text_input(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not update.message or not update.message.text:
        return
    
    user = update.effective_user
    text = update.message.text
    
    if context.user_data.get('awaiting_custom_gig'):
        await handle_custom_gig(update, context)
        return
    
    if not is_admin(user.id) and context.user_data.get('awaiting_receipt'):
        await update.message.reply_text(
            "❌ لطفاً <b>عکس</b> رسید را ارسال کنید، نه متن.",
            parse_mode='HTML',
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 بازگشت", callback_data="back_card")]
            ])
        )
        return
    
    if not is_admin(user.id):
        return
    
    if context.user_data.get('awaiting_broadcast'):
        await handle_broadcast(update, context)
        return
    
    if context.user_data.get('awaiting_config_for_order'):
        order_id = context.user_data.pop('awaiting_config_for_order')
        config_data = text
        order = get_order(order_id)
        if order:
            user_id_order = order[1]
            plan = order[2]
            is_vip_order = order[6]
            
            if plan == 'VIP_1M':
                activate_vip(user_id_order)
                update_order_status(order_id, 'completed', 'VIP_ACTIVATED')
                vip_price = format_balance(get_vip_price())
                try:
                    expire = get_vip_expire(user_id_order)
                    await context.bot.send_message(
                        chat_id=user_id_order,
                        text=f"✅ اشتراک VIP شما فعال شد!\n\n"
                             f"📅 تاریخ انقضا: {expire[:10] if expire else '30 روز دیگر'}\n"
                             f"💰 قیمت هر گیگ: {vip_price} تومان\n\n"
                             f"از بخش \"🌟 سرویس VIP\" می‌توانید خرید کنید.",
                        parse_mode='HTML'
                    )
                except:
                    pass
                try:
                    await update.message.delete()
                except:
                    pass
                await update.message.reply_text("✅ اشتراک VIP با موفقیت برای کاربر فعال شد.")
                return
            
            save_config(user_id_order, plan, config_data, is_vip=is_vip_order)
            update_order_status(order_id, 'completed', config_data)
            
            try:
                g = int(plan.replace("G", ""))
                plan_name = f"{g} گیگ"
            except:
                plan_name = plan
            
            try:
                await context.bot.send_message(
                    chat_id=user_id_order,
                    text=f"✅ کاربر گرامی سفارش شما تایید شد\n\n📦 {plan_name}\n\n"
                         f"ساب لینک:\n<code>{config_data}</code>\n\n"
                         f"لطفا بدون فیلترشکن این لینک رو داخل گوگل سرچ کنید و کانفیگ رو دریافت کنید♥️",
                    parse_mode='HTML'
                )
            except:
                pass
            
            try:
                await update.message.delete()
            except:
                pass
            
            if context.user_data.get('last_approve_msg_id'):
                try:
                    await context.bot.delete_message(
                        chat_id=user.id,
                        message_id=context.user_data.pop('last_approve_msg_id')
                    )
                except:
                    pass
            
            await update.message.reply_text("✅ کانفیگ با موفقیت برای کاربر ارسال شد.")
        return
    
    if context.user_data.get('free_config_for_user'):
        user_id_free = context.user_data.pop('free_config_for_user')
        config_data = text
        save_config(user_id_free, "1G", config_data, is_free=1)
        
        try:
            await context.bot.send_message(
                chat_id=user_id_free,
                text=f"🎁 کانفیگ ۱ گیگ رایگان شما:\n\n<code>{config_data}</code>\n\n"
                     f"لطفا بدون فیلترشکن این لینک رو داخل گوگل سرچ کنید و کانفیگ رو دریافت کنید♥️",
                parse_mode='HTML'
            )
        except:
            pass
        
        try:
            await update.message.delete()
        except:
            pass
        
        if context.user_data.get('last_free_msg_id'):
            try:
                await context.bot.delete_message(
                    chat_id=user.id,
                    message_id=context.user_data.pop('last_free_msg_id')
                )
            except:
                pass
        
        await update.message.reply_text("✅ کانفیگ ۱ گیگ رایگان با موفقیت ارسال شد.")
        return

# ========== تایید/رد سفارش ==========
async def approve_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    
    try:
        await query.answer()
    except:
        pass
    
    if not is_admin(query.from_user.id):
        return
    
    order_id = int(query.data.replace("approve_", ""))
    
    order = get_order(order_id)
    if order and order[2] == 'VIP_1M':
        update_order_status(order_id, 'approved')
        activate_vip(order[1])
        update_order_status(order_id, 'completed', 'VIP_ACTIVATED')
        vip_price = format_balance(get_vip_price())
        
        try:
            expire = get_vip_expire(order[1])
            await context.bot.send_message(
                chat_id=order[1],
                text=f"✅ اشتراک VIP شما فعال شد!\n\n"
                     f"📅 تاریخ انقضا: {expire[:10] if expire else '30 روز دیگر'}\n"
                     f"💰 قیمت هر گیگ: {vip_price} تومان\n\n"
                     f"از بخش \"🌟 سرویس VIP\" می‌توانید خرید کنید.",
                parse_mode='HTML'
            )
        except:
            pass
        
        try:
            await query.edit_message_caption(
                caption=f"{query.message.caption}\n\n✅ تایید و فعال شد",
                reply_markup=None
            )
        except:
            pass
        await query.message.reply_text("✅ اشتراک VIP فعال شد.")
        return
    
    update_order_status(order_id, 'approved')
    context.user_data['awaiting_config_for_order'] = order_id
    context.user_data.pop('free_config_for_user', None)
    context.user_data.pop('awaiting_broadcast', None)
    
    context.user_data['last_approve_msg_id'] = query.message.message_id
    
    try:
        await query.edit_message_caption(
            caption=f"{query.message.caption}\n\n✅ تایید شد - لطفاً کانفیگ را ارسال کنید",
            reply_markup=None
        )
    except:
        pass
    
    msg = await query.message.reply_text(
        f"✅ رسید سفارش #{order_id} تایید شد!\n📥 لطفاً کانفیگ را وارد کنید:"
    )
    context.user_data['last_approve_msg_id'] = msg.message_id

async def reject_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    
    try:
        await query.answer()
    except:
        pass
    
    if not is_admin(query.from_user.id):
        return
    
    order_id = int(query.data.replace("reject_", ""))
    update_order_status(order_id, 'rejected')
    
    order = get_order(order_id)
    if order:
        try:
            await context.bot.send_message(
                chat_id=order[1],
                text="❌ متاسفانه رسید پرداخت شما تایید نشد.\nلطفاً با پشتیبانی تماس بگیرید."
            )
        except:
            pass
    
    try:
        await query.edit_message_caption(
            caption=f"{query.message.caption}\n\n❌ رد شد",
            reply_markup=None
        )
    except:
        pass

# ========== کانفیگ رایگان ==========
async def free_config(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    if not is_free_config_active():
        await update.message.reply_text(
            "🔄 <b>دریافت کانفیگ رایگان موقتاً غیرفعال است</b>\n\n"
            "⚠️ نگران نباشید! این قابلیت <b>دوباره روشن خواهد شد.</b>\n\n"
            "👥 <b>همین الان زیرمجموعه‌گیری کن!</b>\n"
            "🎁 با دعوت ۲۰ نفر = ۱ گیگ کانفیگ رایگان\n"
            "💰 یا ۲۰۰,۰۰۰ تومان از کیف پول پرداخت کن\n\n"
            "📊 وقتی روشن شد، تو از بقیه جلوتری!\n"
            "🏃 پس معطل نکن - همین حالا شروع کن!",
            parse_mode='HTML',
            reply_markup=MAIN_KEYBOARD
        )
        return
    
    user = update.effective_user
    balance = get_user_balance(user.id)
    
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT COUNT(*) FROM users WHERE referrer_id=?", (user.id,))
    count = c.fetchone()[0]
    conn.close()
    
    remaining = max(0, 20 - count)
    
    await update.message.reply_text(
        f"🎁 <b>دریافت ۱ گیگ کانفیگ رایگان</b>\n\n"
        f"📦 حجم: ۱ گیگ\n"
        f"💰 هزینه: ۲۰۰,۰۰۰ تومان از کیف پول\n\n"
        f"💳 موجودی فعلی: <b>{format_balance(balance)} تومان</b>\n\n"
        f"👥 یا با دعوت ۲۰ نفر → <b>رایگان</b>\n"
        f"📊 تعداد دعوت‌شده‌ها: {count} نفر\n"
        f"⏳ باقی‌مانده تا ۲۰ نفر: {remaining} نفر\n\n"
        f"برای افزایش موجودی از بخش زیرمجموعه‌گیری استفاده کنید.",
        parse_mode='HTML',
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💳 پرداخت از کیف پول (۲۰۰,۰۰۰ تومان)", callback_data="pay_wallet_1G")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")]
        ])
    )

async def pay_wallet_1G(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if not is_free_config_active():
        await query.answer("❌ کانفیگ رایگان غیرفعال است!", show_alert=True)
        return
    
    user = query.from_user
    
    if deduct_balance(user.id, 200000):
        username_text = f"@{user.username}" if user.username else "بدون یوزرنیم"
        
        for admin_id in ADMIN_IDS:
            try:
                await context.bot.send_message(
                    chat_id=admin_id,
                    text=f"🎁 درخواست کانفیگ ۱ گیگ رایگان\n\n"
                         f"👤 {username_text}\n"
                         f"🆔 <code>{user.id}</code>\n"
                         f"💰 کسر از کیف پول: ۲۰۰,۰۰۰ تومان",
                    parse_mode='HTML',
                    reply_markup=InlineKeyboardMarkup([
                        [InlineKeyboardButton("📥 کانفیگ را وارد کنید", callback_data=f"freecfg_{user.id}")]
                    ])
                )
            except:
                continue
        
        await query.edit_message_text("✅ پرداخت موفق.\n⏳ منتظر بمانید تا کانفیگ ارسال شود.", reply_markup=None)
    else:
        await query.edit_message_text(
            "❌ موجودی کافی نیست!\n\nاز بخش زیرمجموعه‌گیری موجودی را افزایش دهید.",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")]
            ])
        )

async def free_config_enter(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if not is_admin(query.from_user.id):
        return
    
    user_id = int(query.data.replace("freecfg_", ""))
    context.user_data['free_config_for_user'] = user_id
    context.user_data.pop('awaiting_config_for_order', None)
    context.user_data.pop('awaiting_broadcast', None)
    
    await query.edit_message_text(
        f"🎁 درخواست کانفیگ ۱ گیگ رایگان\n\n👤 کاربر: <code>{user_id}</code>\n✅ آماده ارسال",
        parse_mode='HTML',
        reply_markup=None
    )
    
    msg = await query.message.reply_text(
        f"📥 لطفاً کانفیگ ۱ گیگ را برای کاربر <code>{user_id}</code> ارسال کنید:",
        parse_mode='HTML'
    )
    context.user_data['last_free_msg_id'] = msg.message_id

# ========== زیرمجموعه‌گیری ==========
async def referral(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    if not is_referral_active():
        await update.message.reply_text(
            "🔴 <b>زیرمجموعه‌گیری موقتاً غیرفعال است</b>\n\n"
            "⚠️ نگران نباشید! به‌زودی دوباره فعال می‌شود.\n\n"
            "💰 موجودی کیف پول شما محفوظ است و می‌توانید بعداً برداشت کنید.",
            parse_mode='HTML',
            reply_markup=MAIN_KEYBOARD
        )
        return
    
    user = update.effective_user
    bot_username = (await context.bot.get_me()).username
    link = f"https://t.me/{bot_username}?start={user.id}"
    
    await update.message.reply_text(
        f"👥 <b>دعوت از دوستان</b>\n\n"
        f"🔗 لینک اختصاصی شما:\n<code>{link}</code>\n\n"
        f"💰 با دعوت هر نفر، <b>10,000 تومان</b> به کیف پول شما اضافه می‌شود.\n"
        f"🎁 با دعوت ۲۰ نفر، <b>۱ گیگ کانفیگ رایگان</b> دریافت کنید!\n\n"
        f"📊 با به اشتراک گذاشتن لینک، درآمد خود را افزایش دهید!",
        parse_mode='HTML',
        reply_markup=MAIN_KEYBOARD
    )

# ========== پشتیبانی ==========
async def support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(
        "📞 <b>پشتیبانی</b>\n\nبرای پیگیری سفارشات و سوالات:\n\n🆔 @amir_cyber1\n\n⏰ همه روزه",
        parse_mode='HTML',
        reply_markup=MAIN_KEYBOARD
    )

# ========== کیف پول ==========
async def wallet(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    user = update.effective_user
    balance = get_user_balance(user.id)
    
    await update.message.reply_text(
        f"💰 <b>کیف پول شما</b>\n\n"
        f"موجودی فعلی: <b>{format_balance(balance)} تومان</b>\n\n"
        f"💡 برای افزایش موجودی از بخش زیرمجموعه‌گیری استفاده کنید.",
        parse_mode='HTML',
        reply_markup=MAIN_KEYBOARD
    )

# ========== حساب کاربری ==========
async def account_info(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    user = update.effective_user
    balance = get_user_balance(user.id)
    vip_active = is_user_vip(user.id)
    vip_expire = get_vip_expire(user.id)
    
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT joined_at FROM users WHERE user_id=?", (user.id,))
    result = c.fetchone()
    c.execute("SELECT COUNT(*) FROM users WHERE referrer_id=?", (user.id,))
    referrals_count = c.fetchone()[0]
    conn.close()
    
    join_date = result[0][:10] if result and result[0] else "نامشخص"
    vip_status = "✅ فعال" if vip_active else "❌ غیرفعال"
    vip_expire_text = vip_expire[:10] if vip_expire else "---"
    username_text = f"@{user.username}" if user.username else "تنظیم نشده"
    
    normal_price = format_balance(get_normal_price())
    vip_price = format_balance(get_vip_price())
    
    await update.message.reply_text(
        f"👤 <b>حساب کاربری</b>\n\n"
        f"👤 یوزرنیم: {username_text}\n"
        f"🆔 آیدی: <code>{user.id}</code>\n\n"
        f"👑 وضعیت VIP: <b>{vip_status}</b>\n"
        f"📅 انقضا VIP: {vip_expire_text}\n"
        f"💰 قیمت هر گیگ (عادی): {normal_price} تومان\n"
        f"🌟 قیمت هر گیگ (VIP): {vip_price} تومان\n\n"
        f"💳 موجودی کیف پول: <b>{format_balance(balance)} تومان</b>\n"
        f"👥 زیرمجموعه: {referrals_count} نفر\n"
        f"📅 عضویت: {join_date}",
        parse_mode='HTML',
        reply_markup=MAIN_KEYBOARD
    )

# ========== سرویس‌های من ==========
async def my_services(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if await check_banned(update, context):
        return
    if not await require_membership(update, context):
        return
    
    user = update.effective_user
    configs = get_user_configs(user.id)
    
    if not configs:
        await update.message.reply_text("📦 شما هنوز سرویسی خریداری نکرده‌اید.", reply_markup=MAIN_KEYBOARD)
        return
    
    text = "📦 <b>سرویس‌های شما:</b>\n\n"
    for config in configs:
        plan = config[2]
        is_free = config[4]
        is_vip = config[5]
        config_text = config[3] if config[3] else "---"
        created_at = config[6]
        
        free_text = " (رایگان)" if is_free else ""
        vip_text = " (VIP)" if is_vip else ""
        
        try:
            g = int(plan.replace("G", ""))
            plan_display = f"{g} گیگ"
        except:
            plan_display = plan
            
        text += f"🔹 <b>{plan_display}{free_text}{vip_text}</b>\n"
        text += f"   📅 تاریخ: {created_at[:10] if created_at else '---'}\n"
        text += f"   🔗 <code>{config_text}</code>\n\n"
    
    await update.message.reply_text(text, parse_mode='HTML', reply_markup=MAIN_KEYBOARD)

# ========== پنل ادمین ==========
async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    sale_status = "✅ فعال" if is_sale_active() else "❌ غیرفعال"
    free_config_status = "✅ فعال" if is_free_config_active() else "❌ غیرفعال"
    referral_status = "✅ فعال" if is_referral_active() else "❌ غیرفعال"
    normal_price = format_balance(get_normal_price())
    vip_price = format_balance(get_vip_price())
    
    await update.message.reply_text(
        f"👑 <b>پنل مدیریت</b>\n\n"
        f"وضعیت فروش: {sale_status}\n"
        f"کانفیگ رایگان: {free_config_status}\n"
        f"زیرمجموعه‌گیری: {referral_status}\n\n"
        f"💰 قیمت هر گیگ عادی: {normal_price} تومان\n"
        f"🌟 قیمت هر گیگ VIP: {vip_price} تومان\n\n"
        f"دستورات:\n"
        f"📢 /broadcast - پیام همگانی\n"
        f"🔄 /toggle_sale - روشن/خاموش فروش\n"
        f"🎁 /toggle_free - روشن/خاموش کانفیگ رایگان\n"
        f"👥 /toggle_referral - روشن/خاموش زیرمجموعه‌گیری\n"
        f"💰 /set_normal [قیمت] - تنظیم قیمت هر گیگ عادی\n"
        f"🌟 /set_vip [قیمت] - تنظیم قیمت هر گیگ VIP\n"
        f"💳 /add_balance @user amount - شارژ کیف پول\n"
        f"👤 /user_info @user - اطلاعات کاربر\n"
        f"⛔ /ban @user - بن کردن کاربر\n"
        f"✅ /unban @user - آنبن کردن کاربر",
        parse_mode='HTML'
    )

async def toggle_sale(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    conn = get_db()
    c = conn.cursor()
    current = is_sale_active()
    new_value = '0' if current else '1'
    c.execute("UPDATE settings SET value=? WHERE key='sale_active'", (new_value,))
    conn.commit()
    conn.close()
    
    status = "✅ فعال" if new_value == '1' else "❌ غیرفعال"
    await update.message.reply_text(f"وضعیت فروش: {status}")

async def toggle_free_config(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    conn = get_db()
    c = conn.cursor()
    current = is_free_config_active()
    new_value = '0' if current else '1'
    c.execute("UPDATE settings SET value=? WHERE key='free_config_active'", (new_value,))
    conn.commit()
    conn.close()
    
    status = "✅ فعال" if new_value == '1' else "❌ غیرفعال"
    await update.message.reply_text(f"کانفیگ رایگان: {status}")

async def toggle_referral(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    conn = get_db()
    c = conn.cursor()
    current = is_referral_active()
    new_value = '0' if current else '1'
    c.execute("UPDATE settings SET value=? WHERE key='referral_active'", (new_value,))
    conn.commit()
    conn.close()
    
    status = "✅ فعال" if new_value == '1' else "❌ غیرفعال"
    await update.message.reply_text(f"زیرمجموعه‌گیری: {status}")

async def set_normal_price_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args:
        await update.message.reply_text(
            "❌ فرمت: <code>/set_normal 210000</code>",
            parse_mode='HTML'
        )
        return
    
    try:
        price = int(context.args[0])
        if price <= 0:
            await update.message.reply_text("❌ قیمت باید بیشتر از صفر باشد.")
            return
    except:
        await update.message.reply_text("❌ قیمت باید عدد باشد.")
        return
    
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR REPLACE INTO settings (key, value) VALUES ('normal_price_per_gig', ?)", (str(price),))
    conn.commit()
    conn.close()
    
    await update.message.reply_text(f"✅ قیمت هر گیگ عادی: <b>{format_balance(price)} تومان</b>", parse_mode='HTML')

async def set_vip_price_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args:
        await update.message.reply_text(
            "❌ فرمت: <code>/set_vip 190000</code>",
            parse_mode='HTML'
        )
        return
    
    try:
        price = int(context.args[0])
        if price <= 0:
            await update.message.reply_text("❌ قیمت باید بیشتر از صفر باشد.")
            return
    except:
        await update.message.reply_text("❌ قیمت باید عدد باشد.")
        return
    
    conn = get_db()
    c = conn.cursor()
    c.execute("INSERT OR REPLACE INTO settings (key, value) VALUES ('vip_price_per_gig', ?)", (str(price),))
    conn.commit()
    conn.close()
    
    await update.message.reply_text(f"✅ قیمت هر گیگ VIP: <b>{format_balance(price)} تومان</b>", parse_mode='HTML')

async def ban_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args:
        await update.message.reply_text(
            "❌ فرمت:\n<code>/ban @username</code>\n<code>/ban 123456789</code>",
            parse_mode='HTML'
        )
        return
    
    target = context.args[0]
    
    if target.startswith("@"):
        user_id = get_user_id_by_username(target)
        if not user_id:
            await update.message.reply_text(f"❌ کاربر <b>{target}</b> یافت نشد.", parse_mode='HTML')
            return
    else:
        try:
            user_id = int(target)
        except:
            await update.message.reply_text("❌ آیدی باید عدد باشد.")
            return
    
    if not user_exists(user_id):
        await update.message.reply_text("❌ کاربر یافت نشد.")
        return
    
    if is_admin(user_id):
        await update.message.reply_text("❌ نمی‌توانید ادمین را بن کنید!")
        return
    
    if is_user_banned(user_id):
        await update.message.reply_text("⚠️ کاربر قبلاً بن شده است.")
        return
    
    ban_user(user_id)
    
    try:
        await context.bot.send_message(chat_id=user_id, text="⛔ شما از ربات بن شده‌اید.")
    except:
        pass
    
    await update.message.reply_text(f"✅ کاربر <code>{user_id}</code> بن شد.", parse_mode='HTML')

async def unban_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args:
        await update.message.reply_text(
            "❌ فرمت:\n<code>/unban @username</code>\n<code>/unban 123456789</code>",
            parse_mode='HTML'
        )
        return
    
    target = context.args[0]
    
    if target.startswith("@"):
        user_id = get_user_id_by_username(target)
        if not user_id:
            await update.message.reply_text(f"❌ کاربر <b>{target}</b> یافت نشد.", parse_mode='HTML')
            return
    else:
        try:
            user_id = int(target)
        except:
            await update.message.reply_text("❌ آیدی باید عدد باشد.")
            return
    
    if not user_exists(user_id):
        await update.message.reply_text("❌ کاربر یافت نشد.")
        return
    
    if not is_user_banned(user_id):
        await update.message.reply_text("⚠️ کاربر بن نشده است.")
        return
    
    unban_user(user_id)
    
    try:
        await context.bot.send_message(chat_id=user_id, text="✅ شما آنبن شدید و می‌توانید از ربات استفاده کنید.")
    except:
        pass
    
    await update.message.reply_text(f"✅ کاربر <code>{user_id}</code> آنبن شد.", parse_mode='HTML')

async def add_balance_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args or len(context.args) < 2:
        await update.message.reply_text("❌ فرمت: <code>/add_balance @username 100000</code>", parse_mode='HTML')
        return
    
    target = context.args[0]
    try:
        amount = float(context.args[1])
        if amount <= 0:
            await update.message.reply_text("❌ مبلغ باید بیشتر از صفر باشد.")
            return
    except:
        await update.message.reply_text("❌ مبلغ باید عدد باشد.")
        return
    
    if target.startswith("@"):
        user_id = get_user_id_by_username(target)
        if not user_id:
            await update.message.reply_text(f"❌ کاربر <b>{target}</b> یافت نشد.", parse_mode='HTML')
            return
    else:
        try:
            user_id = int(target)
        except:
            await update.message.reply_text("❌ آیدی باید عدد باشد.")
            return
    
    if not user_exists(user_id):
        await update.message.reply_text("❌ کاربر یافت نشد.")
        return
    
    add_balance(user_id, amount)
    new_balance = get_user_balance(user_id)
    
    try:
        await context.bot.send_message(
            chat_id=user_id,
            text=f"💰 <b>شارژ کیف پول</b>\n\n"
                 f"مبلغ <b>{format_balance(amount)} تومان</b> اضافه شد.\n"
                 f"موجودی: <b>{format_balance(new_balance)} تومان</b>",
            parse_mode='HTML'
        )
    except:
        pass
    
    await update.message.reply_text(
        f"✅ {format_balance(amount)} تومان به کاربر <code>{user_id}</code> اضافه شد.",
        parse_mode='HTML'
    )

async def user_info_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    if not context.args:
        await update.message.reply_text("❌ <code>/user_info @username</code>", parse_mode='HTML')
        return
    
    target = context.args[0]
    if target.startswith("@"):
        user_id = get_user_id_by_username(target)
    else:
        try:
            user_id = int(target)
        except:
            await update.message.reply_text("❌ فرمت نامعتبر.")
            return
    
    if not user_id or not user_exists(user_id):
        await update.message.reply_text("❌ کاربر یافت نشد.")
        return
    
    conn = get_db()
    c = conn.cursor()
    c.execute("SELECT * FROM users WHERE user_id=?", (user_id,))
    user = c.fetchone()
    if user:
        c.execute("SELECT COUNT(*) FROM configs WHERE user_id=?", (user_id,))
        config_count = c.fetchone()[0]
        c.execute("SELECT COUNT(*) FROM users WHERE referrer_id=?", (user_id,))
        referrals_count = c.fetchone()[0]
        
        user_id_val = user[0] if len(user) > 0 else "---"
        username_val = f"@{user[1]}" if len(user) > 1 and user[1] else "ندارد"
        balance_val = format_balance(user[2]) if len(user) > 2 else "0"
        referrer_val = user[3] if len(user) > 3 and user[3] else "ندارد"
        is_vip_val = user[4] if len(user) > 4 else 0
        vip_expire_val = user[5][:10] if len(user) > 5 and user[5] else "---"
        is_banned_val = user[6] if len(user) > 6 else 0
        joined_val = user[7][:10] if len(user) > 7 and user[7] else "---"
        
        vip_status = "✅ فعال" if is_vip_val else "❌ غیرفعال"
        ban_status = "⛔ بن شده" if is_banned_val else "✅ آزاد"
        
        await update.message.reply_text(
            f"👤 <b>اطلاعات کاربر</b>\n\n"
            f"🆔 آیدی: <code>{user_id_val}</code>\n"
            f"👤 یوزرنیم: {username_val}\n"
            f"💰 موجودی: <b>{balance_val} تومان</b>\n"
            f"👑 VIP: {vip_status} (انقضا: {vip_expire_val})\n"
            f"🚫 وضعیت بن: {ban_status}\n"
            f"🔗 دعوت‌کننده: <code>{referrer_val}</code>\n"
            f"📅 عضویت: {joined_val}\n"
            f"📦 سرویس‌ها: {config_count}\n"
            f"👥 زیرمجموعه: {referrals_count}",
            parse_mode='HTML'
        )
    conn.close()

# ========== پیام همگانی ==========
async def broadcast_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    
    context.user_data['awaiting_broadcast'] = True
    context.user_data.pop('awaiting_config_for_order', None)
    context.user_data.pop('free_config_for_user', None)
    
    await update.message.reply_text("📢 پیام همگانی را بفرست.\n/cancel_broadcast - لغو")

async def cancel_broadcast(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    context.user_data.pop('awaiting_broadcast', None)
    await update.message.reply_text("❌ لغو شد.")

async def handle_broadcast(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not is_admin(update.effective_user.id):
        return
    if not context.user_data.get('awaiting_broadcast'):
        return
    
    users = get_all_users()
    success, failed = 0, 0
    
    for user_id in users:
        try:
            if update.message.photo:
                await context.bot.send_photo(
                    chat_id=user_id,
                    photo=update.message.photo[-1].file_id,
                    caption=update.message.caption or "",
                    parse_mode='HTML'
                )
            elif update.message.text:
                await context.bot.send_message(
                    chat_id=user_id,
                    text=update.message.text,
                    parse_mode='HTML'
                )
            success += 1
        except:
            failed += 1
    
    context.user_data.pop('awaiting_broadcast', None)
    await update.message.reply_text(f"📊 گزارش ارسال:\n✅ موفق: {success}\n❌ ناموفق: {failed}")

# ========== بازگشت‌ها ==========
async def back_main_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data.clear()
    try:
        await query.edit_message_text("به منوی اصلی بازگشتید.")
    except:
        pass
    await query.message.reply_text("منوی اصلی:", reply_markup=MAIN_KEYBOARD)

async def back_plans_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data.pop('selected_plan', None)
    context.user_data.pop('selected_amount', None)
    context.user_data.pop('awaiting_receipt', None)
    context.user_data.pop('awaiting_custom_gig', None)
    context.user_data.pop('custom_gig', None)
    
    is_vip = context.user_data.get('buying_vip_service', False)
    price_per_gig = get_vip_price() if is_vip else get_price_per_gig(query.from_user.id)
    
    plans = []
    for i in range(1, 11):
        plans.append((f"{i} گیگ - {format_balance(i * price_per_gig)} تومان", f"{i}G"))
    
    keyboard = []
    for text, plan in plans:
        keyboard.append([InlineKeyboardButton(text, callback_data=f"plan_{plan}")])
    keyboard.append([InlineKeyboardButton("✏️ گیگ دلخواه", callback_data="custom_gig")])
    keyboard.append([InlineKeyboardButton("🔙 بازگشت", callback_data="back_main")])
    
    await query.edit_message_text(
        f"📦 پلن مورد نظر را انتخاب کنید:\n\n✅ تمام سرویس‌ها نامحدود\n💰 قیمت هر گیگ: {format_balance(price_per_gig)} تومان",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

async def back_invoice_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    plan = context.user_data.get('selected_plan')
    amount = context.user_data.get('selected_amount', 0)
    custom_gig = context.user_data.get('custom_gig', None)
    
    if plan == 'VIP_1M':
        plan_name = "اشتراک VIP یک ماهه"
    elif custom_gig:
        plan_name = f"{custom_gig} گیگ (دلخواه)"
    else:
        try:
            g = int(plan.replace("G", ""))
            plan_name = f"{g} گیگ"
        except:
            plan_name = plan
    
    await query.edit_message_text(
        f"🧾 پیش‌فاکتور\n\n📦 {plan_name}\n📅 نامحدود\n\n💰 {format_balance(amount)} تومان\n\nآماده پرداخت.",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💳 کارت به کارت", callback_data="card_pay")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_plans")]
        ])
    )

async def back_card_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    amount = context.user_data.get('selected_amount', 0)
    plan = context.user_data.get('selected_plan', '')
    custom_gig = context.user_data.get('custom_gig', None)
    
    if plan == 'VIP_1M':
        plan_name = "اشتراک VIP یک ماهه"
    elif custom_gig:
        plan_name = f"{custom_gig} گیگ (دلخواه)"
    else:
        try:
            g = int(plan.replace("G", ""))
            plan_name = f"{g} گیگ"
        except:
            plan_name = plan
    context.user_data['awaiting_receipt'] = False
    
    await query.edit_message_text(
        f"💳 <b>پرداخت</b>\n\n📦 {plan_name}\n💰 {format_balance(amount)} تومان\n\n"
        f"شماره کارت:\n<code>5859831225049732</code>\nبه نام: <b>امیر مهدی</b>\n\n"
        f"🔝 بعد از واریز دکمه ادامه رو بزن.",
        parse_mode='HTML',
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("📤 ادامه (ارسال رسید)", callback_data="send_receipt")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_invoice")]
        ])
    )

# ========== پاک کردن webhook ==========
async def delete_webhook_on_start():
    bot = Bot(TOKEN)
    await bot.delete_webhook(drop_pending_updates=True)

# ========== اصلی ==========
def main():
    init_db()
    
    try:
        asyncio.run(delete_webhook_on_start())
    except:
        pass
    
    app = Application.builder().token(TOKEN).build()
    
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("admin", admin_panel))
    app.add_handler(CommandHandler("toggle_sale", toggle_sale))
    app.add_handler(CommandHandler("toggle_free", toggle_free_config))
    app.add_handler(CommandHandler("toggle_referral", toggle_referral))
    app.add_handler(CommandHandler("set_normal", set_normal_price_command))
    app.add_handler(CommandHandler("set_vip", set_vip_price_command))
    app.add_handler(CommandHandler("broadcast", broadcast_start))
    app.add_handler(CommandHandler("cancel_broadcast", cancel_broadcast))
    app.add_handler(CommandHandler("add_balance", add_balance_command))
    app.add_handler(CommandHandler("user_info", user_info_command))
    app.add_handler(CommandHandler("ban", ban_command))
    app.add_handler(CommandHandler("unban", unban_command))
    
    app.add_handler(MessageHandler(filters.Text("🛒 خرید سرویس"), buy_service))
    app.add_handler(MessageHandler(filters.Text("🌟 سرویس VIP"), buy_vip_service))
    app.add_handler(MessageHandler(filters.Text("👑 اشتراک VIP"), buy_vip_subscription))
    app.add_handler(MessageHandler(filters.Text("🎁 کانفیگ رایگان"), free_config))
    app.add_handler(MessageHandler(filters.Text("👥 زیرمجموعه‌گیری"), referral))
    app.add_handler(MessageHandler(filters.Text("👤 حساب کاربری"), account_info))
    app.add_handler(MessageHandler(filters.Text("📞 پشتیبانی"), support))
    app.add_handler(MessageHandler(filters.Text("💰 کیف پول"), wallet))
    app.add_handler(MessageHandler(filters.Text("📦 سرویس‌های من"), my_services))
    
    app.add_handler(MessageHandler(filters.PHOTO, handle_receipt))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text_input))
    
    app.add_handler(CallbackQueryHandler(check_join_callback, pattern="check_join"))
    app.add_handler(CallbackQueryHandler(plan_callback, pattern=r"plan_\w+"))
    app.add_handler(CallbackQueryHandler(custom_gig_callback, pattern="custom_gig"))
    app.add_handler(CallbackQueryHandler(card_pay_callback, pattern="card_pay"))
    app.add_handler(CallbackQueryHandler(send_receipt_callback, pattern="send_receipt"))
    app.add_handler(CallbackQueryHandler(approve_order, pattern=r"approve_\d+"))
    app.add_handler(CallbackQueryHandler(reject_order, pattern=r"reject_\d+"))
    app.add_handler(CallbackQueryHandler(pay_wallet_1G, pattern="pay_wallet_1G"))
    app.add_handler(CallbackQueryHandler(free_config_enter, pattern=r"freecfg_\d+"))
    app.add_handler(CallbackQueryHandler(back_main_callback, pattern="back_main"))
    app.add_handler(CallbackQueryHandler(back_plans_callback, pattern="back_plans"))
    app.add_handler(CallbackQueryHandler(back_invoice_callback, pattern="back_invoice"))
    app.add_handler(CallbackQueryHandler(back_card_callback, pattern="back_card"))
    
    app.run_polling(drop_pending_updates=True)

if __name__ == "__main__":
    main()