
# ربات فروش کانفیگ دستی 
#کص مادر کسی که اینو بفروشه رایگان پاب کردم عشق کنید 
#اگر پروژه ربات تلکرامی چیزی داشتید به ایدی زیر پیام بدید 
# @nothing_n89
import telebot
from telebot.apihelper import ApiTelegramException
from telebot import types
import time
import json
import os
from datetime import datetime

TOKEN = ""
CHANNEL_USERNAME = '@packagePD'
ADMIN_ID = 8290855345

bot = telebot.TeleBot(TOKEN)
user_states = {}

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

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

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

def save_products(products):
    with open('products.json', 'w', encoding='utf-8') as f:
        json.dump(products, f, ensure_ascii=False, indent=4)

def ensure_user_fields(user_data):
    defaults = {
        'referral_count': 0,
        'referrals': [],
        'referred_by': None,
        'pending_3_reward': False,
        'claimed_3': False,
        'reward_20_sent': False,
        'balance': 0,
        'products': [],
        'pending_payment': None
    }
    for key, value in defaults.items():
        if key not in user_data:
            user_data[key] = value
    if 'join_date' not in user_data:
        user_data['join_date'] = str(datetime.now())
    return user_data

def get_user(user_id, username=None, first_name=None, referrer=None):
    users = load_users()
    user_id_str = str(user_id)
    
    if user_id_str not in users:
        users[user_id_str] = {
            'user_id': user_id,
            'username': username,
            'first_name': first_name
        }
        users[user_id_str] = ensure_user_fields(users[user_id_str])
        
        if referrer and str(referrer) in users and referrer != user_id:
            users[user_id_str]['referred_by'] = referrer
            ref_user = ensure_user_fields(users[str(referrer)])
            if user_id not in ref_user['referrals']:
                ref_user['referrals'].append(user_id)
                ref_user['referral_count'] = len(ref_user['referrals'])
                
                if ref_user['referral_count'] == 3 and not ref_user['pending_3_reward'] and not ref_user['claimed_3']:
                    ref_user['pending_3_reward'] = True
                    ref_name = ref_user.get('first_name', 'کاربر')
                    try:
                        markup = types.InlineKeyboardMarkup(row_width=2)
                        markup.add(
                            types.InlineKeyboardButton("✅ تایید", callback_data=f"confirm_3reward_{referrer}", style="success"),
                            types.InlineKeyboardButton("❌ رد", callback_data=f"reject_3reward_{referrer}", style="danger")
                        )
                        bot.send_message(
                            referrer,
                            f"🎉 تبریک {ref_name} عزیز!\n\nشما ۳ زیرمجموعه تکمیل کردید!\nبا زدن دکمه تایید، ۱۰۰ مگابایت کانفیگ دریافت می‌کنید.\nدر صورت رد، تا ۲۰ زیرمجموعه صبر کنید.",
                            reply_markup=markup
                        )
                    except Exception as e:
                        print(f"Error sending 3 reward message: {e}")
                
                if ref_user['referral_count'] == 20 and not ref_user['reward_20_sent']:
                    ref_user['reward_20_sent'] = True
                    ref_name = ref_user.get('first_name', 'کاربر')
                    try:
                        request_id = f"ref20_{referrer}_{int(time.time())}"
                        markup = types.InlineKeyboardMarkup(row_width=2)
                        markup.add(
                            types.InlineKeyboardButton("✅ ارسال کانفیگ ۱ گیگ", callback_data=f"sendconfigref20_{referrer}_{request_id}", style="success"),
                            types.InlineKeyboardButton("❌ رد درخواست", callback_data=f"rejectconfigref_{referrer}_{request_id}", style="danger")
                        )
                        bot.send_message(
                            ADMIN_ID,
                            f"🏆 کاربر {ref_name} (ID: {referrer}) به ۲۰ زیرمجموعه رسید.\n\n🎁 جایزه: کانفیگ ۱ گیگابایت\n\n👇 یکی از گزینه‌ها را انتخاب کنید:",
                            reply_markup=markup
                        )
                    except Exception as e:
                        print(f"Error sending 20 reward message: {e}")
                
                users[str(referrer)] = ref_user
        
        save_users(users)
    else:
        updated = False
        users[user_id_str] = ensure_user_fields(users[user_id_str])
        
        if username and users[user_id_str].get('username') != username:
            users[user_id_str]['username'] = username
            updated = True
        if first_name and users[user_id_str].get('first_name') != first_name:
            users[user_id_str]['first_name'] = first_name
            updated = True
        
        if referrer and str(referrer) in users and not users[user_id_str].get('referred_by') and referrer != user_id:
            users[user_id_str]['referred_by'] = referrer
            ref_user = ensure_user_fields(users[str(referrer)])
            if user_id not in ref_user['referrals']:
                ref_user['referrals'].append(user_id)
                ref_user['referral_count'] = len(ref_user['referrals'])
                
                if ref_user['referral_count'] == 3 and not ref_user['pending_3_reward'] and not ref_user['claimed_3']:
                    ref_user['pending_3_reward'] = True
                    ref_name = ref_user.get('first_name', 'کاربر')
                    try:
                        markup = types.InlineKeyboardMarkup(row_width=2)
                        markup.add(
                            types.InlineKeyboardButton("✅ تایید", callback_data=f"confirm_3reward_{referrer}", style="success"),
                            types.InlineKeyboardButton("❌ رد", callback_data=f"reject_3reward_{referrer}", style="danger")
                        )
                        bot.send_message(
                            referrer,
                            f"🎉 تبریک {ref_name} عزیز!\n\nشما ۳ زیرمجموعه تکمیل کردید!\nبا زدن دکمه تایید، ۱۰۰ مگابایت کانفیگ دریافت می‌کنید.\nدر صورت رد، تا ۲۰ زیرمجموعه صبر کنید.",
                            reply_markup=markup
                        )
                    except Exception as e:
                        print(f"Error sending 3 reward message: {e}")
                
                if ref_user['referral_count'] == 20 and not ref_user['reward_20_sent']:
                    ref_user['reward_20_sent'] = True
                    ref_name = ref_user.get('first_name', 'کاربر')
                    try:
                        request_id = f"ref20_{referrer}_{int(time.time())}"
                        markup = types.InlineKeyboardMarkup(row_width=2)
                        markup.add(
                            types.InlineKeyboardButton("✅ ارسال کانفیگ ۱ گیگ", callback_data=f"sendconfigref20_{referrer}_{request_id}", style="success"),
                            types.InlineKeyboardButton("❌ رد درخواست", callback_data=f"rejectconfigref_{referrer}_{request_id}", style="danger")
                        )
                        bot.send_message(
                            ADMIN_ID,
                            f"🏆 کاربر {ref_name} (ID: {referrer}) به ۲۰ زیرمجموعه رسید.\n\n🎁 جایزه: کانفیگ ۱ گیگابایت\n\n👇 یکی از گزینه‌ها را انتخاب کنید:",
                            reply_markup=markup
                        )
                    except Exception as e:
                        print(f"Error sending 20 reward message: {e}")
                
                users[str(referrer)] = ref_user
            updated = True
        
        if updated:
            save_users(users)
    
    return users[user_id_str]

def update_user(user_id, data):
    users = load_users()
    if str(user_id) in users:
        users[str(user_id)] = ensure_user_fields(users[str(user_id)])
        users[str(user_id)].update(data)
        save_users(users)

def is_user_member(user_id):
    try:
        chat_member = bot.get_chat_member(CHANNEL_USERNAME, user_id)
        return chat_member.status not in ['left', 'kicked']
    except:
        return False

def main_menu_buttons():
    markup = types.InlineKeyboardMarkup(row_width=2)
    btn1 = types.InlineKeyboardButton("🛒 فروشگاه کانفیگ", callback_data="shop", style="primary")
    btn2 = types.InlineKeyboardButton("📦 کانفیگ‌های من", callback_data="my_products", style="primary")
    btn3 = types.InlineKeyboardButton("👤 پروفایل من", callback_data="profile", style="success")
    btn4 = types.InlineKeyboardButton("💰 شارژ کیف پول", callback_data="increase_balance", style="success")
    btn5 = types.InlineKeyboardButton("📞 پشتیبانی", callback_data="support", style="danger")
    btn6 = types.InlineKeyboardButton("👥 رفال", callback_data="referral", style="primary")
    markup.add(btn1, btn2, btn3, btn4, btn5, btn6)
    return markup

def back_button():
    markup = types.InlineKeyboardMarkup()
    back_btn = types.InlineKeyboardButton("🔙 برگشت به منوی اصلی", callback_data="back_to_menu", style="danger")
    markup.add(back_btn)
    return markup

def shop_buttons():
    products = load_products()
    markup = types.InlineKeyboardMarkup(row_width=1)
    for product_id, product in products.items():
        btn = types.InlineKeyboardButton(
            f"{product['name']} - {product['price']:,} تومان",
            callback_data=f"buy_product_{product_id}",
            style="success"
        )
        markup.add(btn)
    back = types.InlineKeyboardButton("🔙 برگشت", callback_data="back_to_menu", style="danger")
    markup.add(back)
    return markup

def admin_payment_buttons(user_id, payment_id):
    markup = types.InlineKeyboardMarkup(row_width=2)
    confirm = types.InlineKeyboardButton("✅ تایید پرداخت", callback_data=f"confirmpay_{user_id}_{payment_id}", style="success")
    reject = types.InlineKeyboardButton("❌ رد پرداخت", callback_data=f"rejectpay_{user_id}_{payment_id}", style="danger")
    markup.add(confirm, reject)
    return markup

def admin_config_buttons(user_id, request_id):
    markup = types.InlineKeyboardMarkup(row_width=2)
    confirm = types.InlineKeyboardButton("✅ ارسال کانفیگ", callback_data=f"sendconfig_{user_id}_{request_id}", style="success")
    reject = types.InlineKeyboardButton("❌ رد درخواست", callback_data=f"rejectconfig_{user_id}_{request_id}", style="danger")
    markup.add(confirm, reject)
    return markup

def admin_referral_config_buttons(user_id, request_id, reward_type):
    markup = types.InlineKeyboardMarkup(row_width=2)
    if reward_type == "3":
        confirm = types.InlineKeyboardButton("✅ ارسال کانفیگ ۱۰۰ مگ", callback_data=f"sendconfigref3_{user_id}_{request_id}", style="success")
    else:
        confirm = types.InlineKeyboardButton("✅ ارسال کانفیگ ۱ گیگ", callback_data=f"sendconfigref20_{user_id}_{request_id}", style="success")
    reject = types.InlineKeyboardButton("❌ رد درخواست", callback_data=f"rejectconfigref_{user_id}_{request_id}", style="danger")
    markup.add(confirm, reject)
    return markup

def delete_product_buttons():
    products = load_products()
    markup = types.InlineKeyboardMarkup(row_width=1)
    for product_id, product in products.items():
        btn = types.InlineKeyboardButton(
            f"🗑 {product['name']} - {product['price']:,} تومان",
            callback_data=f"delete_confirm_{product_id}",
            style="danger"
        )
        markup.add(btn)
    back = types.InlineKeyboardButton("🔙 انصراف", callback_data="cancel_delete", style="primary")
    markup.add(back)
    return markup

def confirm_delete_buttons(product_id):
    markup = types.InlineKeyboardMarkup(row_width=2)
    confirm = types.InlineKeyboardButton("✅ بله، حذف شود", callback_data=f"delete_yes_{product_id}", style="danger")
    cancel = types.InlineKeyboardButton("❌ خیر، منصرف شدم", callback_data="delete_no", style="success")
    markup.add(confirm, cancel)
    return markup

def welcome_message_for_member(first_name):
    text = f"""سلام {first_name} عزیز! 👋

به ربات فروش کانفیگ خوش آمدید.

برای استفاده از خدمات، لطفاً از منوی زیر اقدام کنید."""
    return text

@bot.message_handler(commands=['start'])
def send_welcome(message):
    user_id = message.from_user.id
    chat_id = message.chat.id
    first_name = message.from_user.first_name
    username = message.from_user.username
    referrer = None
    args = message.text.split()
    if len(args) > 1 and args[1].startswith('ref'):
        try:
            referrer = int(args[1][3:])
        except:
            pass
    
    user_data = get_user(user_id, username, first_name, referrer)
    
    if is_user_member(user_id):
        welcome_text = welcome_message_for_member(first_name)
        bot.send_message(chat_id, welcome_text, reply_markup=main_menu_buttons())
    else:
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        join_button = types.InlineKeyboardButton("🔗 عضویت در کانال", url=f"https://t.me/{CHANNEL_USERNAME[1:]}", style="primary")
        check_button = types.InlineKeyboardButton("✅ بررسی عضویت", callback_data="check_sub", style="success")
        keyboard.add(join_button, check_button)
        bot.send_message(
            chat_id,
            f"برای استفاده از ربات، ابتدا در کانال زیر عضو شوید:\n{CHANNEL_USERNAME}",
            reply_markup=keyboard
        )

@bot.message_handler(commands=['addproduct'])
def add_product_start(message):
    if message.from_user.id != ADMIN_ID:
        return
    user_states[ADMIN_ID] = {'adding_product': 'waiting_for_name'}
    bot.send_message(ADMIN_ID, "لطفاً نام محصول را وارد کنید:")

@bot.message_handler(commands=['delproduct'])
def del_product_start(message):
    if message.from_user.id != ADMIN_ID:
        return
    products = load_products()
    if not products:
        bot.send_message(ADMIN_ID, "هیچ محصولی برای حذف وجود ندارد.")
        return
    bot.send_message(ADMIN_ID, "لطفاً محصول مورد نظر برای حذف را انتخاب کنید:", reply_markup=delete_product_buttons())

@bot.message_handler(func=lambda message: user_states.get(message.from_user.id, {}).get('adding_product') == 'waiting_for_name' and message.from_user.id == ADMIN_ID)
def get_product_name(message):
    product_name = message.text.strip()
    user_states[ADMIN_ID]['product_name'] = product_name
    user_states[ADMIN_ID]['adding_product'] = 'waiting_for_price'
    bot.send_message(ADMIN_ID, "لطفاً قیمت محصول را به تومان وارد کنید:")

@bot.message_handler(func=lambda message: user_states.get(message.from_user.id, {}).get('adding_product') == 'waiting_for_price' and message.from_user.id == ADMIN_ID)
def get_product_price(message):
    try:
        price = int(message.text.strip())
        if price <= 0:
            bot.send_message(ADMIN_ID, "لطفاً یک عدد مثبت وارد کنید.")
            return
        product_name = user_states[ADMIN_ID]['product_name']
        products = load_products()
        new_id = str(len(products) + 1)
        products[new_id] = {'name': product_name, 'price': price}
        save_products(products)
        bot.send_message(ADMIN_ID, f"✅ محصول با موفقیت اضافه شد.\n\nنام: {product_name}\nقیمت: {price:,} تومان")
        del user_states[ADMIN_ID]
    except ValueError:
        bot.send_message(ADMIN_ID, "لطفاً یک عدد معتبر وارد کنید.")

@bot.callback_query_handler(func=lambda call: call.data == "check_sub")
def check_subscription(call):
    user_id = call.from_user.id
    chat_id = call.message.chat.id
    message_id = call.message.message_id
    first_name = call.from_user.first_name
    if is_user_member(user_id):
        bot.edit_message_text("✅ عضویت شما تأیید شد.", chat_id, message_id)
        bot.send_message(chat_id, welcome_message_for_member(first_name), reply_markup=main_menu_buttons())
    else:
        bot.answer_callback_query(call.id, "❌ هنوز عضو نشده‌اید!", show_alert=True)

@bot.callback_query_handler(func=lambda call: call.data == "back_to_menu")
def back_to_main_menu(call):
    chat_id = call.message.chat.id
    first_name = call.from_user.first_name
    bot.answer_callback_query(call.id)
    bot.edit_message_text(welcome_message_for_member(first_name), chat_id, call.message.message_id, reply_markup=main_menu_buttons())

@bot.callback_query_handler(func=lambda call: call.data == "shop")
def show_shop(call):
    chat_id = call.message.chat.id
    products = load_products()
    if not products:
        bot.answer_callback_query(call.id)
        bot.edit_message_text("در حال حاضر محصولی موجود نیست.", chat_id, call.message.message_id, reply_markup=back_button())
        return
    bot.answer_callback_query(call.id)
    bot.edit_message_text("🛒 فروشگاه کانفیگ\n\nلطفاً محصول مورد نظر خود را انتخاب کنید:", chat_id, call.message.message_id, reply_markup=shop_buttons())

@bot.callback_query_handler(func=lambda call: call.data.startswith("buy_product_"))
def buy_product(call):
    user_id = call.from_user.id
    chat_id = call.message.chat.id
    product_id = call.data.split("_")[2]
    products = load_products()
    product = products.get(product_id)
    
    if not product:
        bot.answer_callback_query(call.id, "محصول مورد نظر یافت نشد.", show_alert=True)
        return
    
    user_data = get_user(user_id)
    balance = user_data.get('balance', 0)
    
    if balance >= product['price']:
        new_balance = balance - product['price']
        update_user(user_id, {'balance': new_balance})
        
        products_list = user_data.get('products', [])
        products_list.append(f"{product['name']} - {datetime.now().strftime('%Y-%m-%d %H:%M')}")
        update_user(user_id, {'products': products_list})
        
        request_id = f"{user_id}_{int(time.time())}"
        
        bot.answer_callback_query(call.id, "خرید با موفقیت ثبت شد.", show_alert=True)
        bot.edit_message_text(
            f"✅ خرید شما ثبت شد.\n\n📦 محصول: {product['name']}\n💰 مبلغ: {product['price']:,} تومان\n💵 موجودی باقی‌مانده: {new_balance:,} تومان\n\n⏳ در انتظار ارسال کانفیگ از طرف ادمین...",
            chat_id,
            call.message.message_id,
            reply_markup=back_button()
        )
        
        admin_text = (
            f"🔔 درخواست کانفیگ جدید (خرید)\n\n"
            f"👤 نام: {call.from_user.first_name}\n"
            f"🆔 آیدی: {user_id}\n"
            f"📛 یوزرنیم: @{call.from_user.username or 'ندارد'}\n"
            f"📦 محصول: {product['name']}\n"
            f"💰 قیمت: {product['price']:,} تومان\n"
            f"💵 موجودی پس از خرید: {new_balance:,} تومان\n\n"
            f"👇 یکی از گزینه‌ها را انتخاب کنید:"
        )
        
        bot.send_message(
            ADMIN_ID,
            admin_text,
            reply_markup=admin_config_buttons(user_id, request_id)
        )
    else:
        bot.answer_callback_query(call.id, f"❌ موجودی کافی نیست.\nموجودی فعلی: {balance:,} تومان", show_alert=True)

@bot.callback_query_handler(func=lambda call: call.data.startswith("sendconfig_"))
def ask_for_config_link(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    parts = call.data.split("_")
    user_id = int(parts[1])
    request_id = parts[2]
    
    bot.answer_callback_query(call.id)
    
    user_states[ADMIN_ID] = {
        'waiting_for_reply_config': True,
        'target_user_id': user_id,
        'request_id': request_id,
        'original_message_id': call.message.message_id,
        'original_chat_id': call.message.chat.id,
        'type': 'purchase'
    }
    
    bot.send_message(
        ADMIN_ID,
        f"✍️ لطفاً لینک کانفیگ را برای کاربر {user_id} ارسال کنید.\n\n⚠️ می‌توانید متن، عکس یا فایل ارسال کنید.\n🔹 روی این پیام ریپلای کنید (Reply) و سپس ارسال کنید.",
        reply_to_message_id=call.message.message_id
    )

@bot.callback_query_handler(func=lambda call: call.data.startswith("rejectconfig_"))
def reject_config_request(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    parts = call.data.split("_")
    user_id = int(parts[1])
    request_id = parts[2]
    
    bot.answer_callback_query(call.id, "درخواست رد شد.", show_alert=True)
    
    bot.edit_message_text(
        f"❌ درخواست کاربر {user_id} رد شد.",
        call.message.chat.id,
        call.message.message_id
    )
    
    try:
        bot.send_message(
            user_id,
            "❌ درخواست خرید شما رد شد.\n\nلطفاً با پشتیبانی تماس بگیرید."
        )
    except:
        pass

@bot.message_handler(func=lambda message: message.reply_to_message and user_states.get(ADMIN_ID, {}).get('waiting_for_reply_config') and message.from_user.id == ADMIN_ID)
def send_config_to_specific_user(message):
    target_user_id = user_states[ADMIN_ID]['target_user_id']
    request_id = user_states[ADMIN_ID]['request_id']
    original_msg_id = user_states[ADMIN_ID]['original_message_id']
    original_chat_id = user_states[ADMIN_ID]['original_chat_id']
    
    try:
        if message.text:
            bot.send_message(target_user_id, f"🔐 کانفیگ شما:\n\n{message.text}")
        elif message.document:
            bot.send_document(target_user_id, message.document.file_id, caption="🔐 فایل کانفیگ شما")
        elif message.photo:
            bot.send_photo(target_user_id, message.photo[-1].file_id, caption="🔐 تصویر کانفیگ شما")
        else:
            bot.send_message(ADMIN_ID, "❌ نوع فایل پشتیبانی نمی‌شود. فقط متن، عکس یا فایل ارسال کنید.")
            return
        
        bot.edit_message_text(
            f"✅ کانفیگ برای کاربر {target_user_id} ارسال شد.",
            original_chat_id,
            original_msg_id
        )
        
        bot.send_message(ADMIN_ID, f"✅ کانفیگ با موفقیت به کاربر {target_user_id} ارسال شد.")
        
        del user_states[ADMIN_ID]
        
    except Exception as e:
        bot.send_message(ADMIN_ID, f"❌ خطا در ارسال: {str(e)}")

@bot.callback_query_handler(func=lambda call: call.data == "my_products")
def show_my_products(call):
    user_id = call.from_user.id
    chat_id = call.message.chat.id
    user_data = get_user(user_id)
    products = user_data.get('products', [])
    
    if products:
        products_text = "\n".join([f"• {p}" for p in products])
        text = f"📦 کانفیگ‌های خریداری شده\n\n{products_text}"
    else:
        text = "❌ شما تاکنون کانفیگی خریداری نکرده‌اید.\n\nبرای خرید به فروشگاه مراجعه کنید."
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(text, chat_id, call.message.message_id, reply_markup=back_button())

@bot.callback_query_handler(func=lambda call: call.data == "profile")
def show_profile(call):
    user_id = call.from_user.id
    chat_id = call.message.chat.id
    first_name = call.from_user.first_name
    user_data = get_user(user_id)
    balance = user_data.get('balance', 0)
    join_date = user_data.get('join_date', 'نامشخص')
    products_count = len(user_data.get('products', []))
    ref_count = user_data.get('referral_count', 0)
    
    text = f"""👤 پروفایل کاربری

👤 نام: {first_name}
🆔 آیدی: {user_id}
📛 یوزرنیم: @{call.from_user.username or 'ندارد'}
💰 موجودی: {balance:,} تومان
📦 تعداد خرید: {products_count} عدد
👥 زیرمجموعه: {ref_count} نفر
📅 عضویت: {join_date.split()[0] if ' ' in join_date else join_date}
✅ وضعیت: فعال"""
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(text, chat_id, call.message.message_id, reply_markup=back_button())

@bot.callback_query_handler(func=lambda call: call.data == "increase_balance")
def increase_balance(call):
    chat_id = call.message.chat.id
    user_id = call.from_user.id
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(
        f"💰 شارژ کیف پول\n\n💳 اطلاعات کارت:\nکارت: 6037-****-****-1234\nبه نام: شرکت نمونه\n\nپس از واریز، تصویر فیش را ارسال کنید.\n\nحداقل شارژ: 10,000 تومان",
        chat_id,
        call.message.message_id,
        reply_markup=back_button()
    )
    
    user_states[user_id] = {'waiting_for_payment_image': True, 'menu_message_id': call.message.message_id}

@bot.message_handler(content_types=['photo'])
def handle_payment_image(message):
    user_id = message.from_user.id
    chat_id = message.chat.id
    
    if user_states.get(user_id, {}).get('waiting_for_payment_image'):
        username = message.from_user.username or 'ندارد'
        first_name = message.from_user.first_name
        photo_id = message.photo[-1].file_id
        payment_id = str(int(time.time()))
        
        update_user(user_id, {'pending_payment': payment_id})
        
        bot.send_message(
            ADMIN_ID,
            f"💳 درخواست شارژ کیف پول\n\n👤 نام: {first_name}\n🆔 آیدی: {user_id}\n📛 یوزرنیم: @{username}\n🔢 کد پیگیری: {payment_id}",
            reply_markup=admin_payment_buttons(user_id, payment_id)
        )
        bot.send_photo(ADMIN_ID, photo_id, caption=f"فیش واریز از {first_name} (ID: {user_id})")
        
        bot.send_message(
            chat_id,
            f"✅ فیش واریز دریافت شد.\n\nدرخواست شما به ادمین ارسال شد.\nپس از تأیید، موجودی شما افزایش می‌یابد.",
            reply_markup=back_button()
        )
        
        del user_states[user_id]

@bot.callback_query_handler(func=lambda call: call.data.startswith("confirmpay_"))
def confirm_payment(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    data_parts = call.data.split("_")
    user_id = int(data_parts[1])
    payment_id = data_parts[2]
    
    bot.answer_callback_query(call.id)
    
    bot.send_message(
        ADMIN_ID,
        f"💰 لطفاً مبلغ واریزی کاربر {user_id} را به تومان وارد کنید:"
    )
    
    user_states[ADMIN_ID] = {'waiting_for_amount': user_id, 'payment_id': payment_id}

@bot.callback_query_handler(func=lambda call: call.data.startswith("rejectpay_"))
def reject_payment(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    data_parts = call.data.split("_")
    user_id = int(data_parts[1])
    payment_id = data_parts[2]
    
    bot.answer_callback_query(call.id, "پرداخت رد شد.", show_alert=True)
    
    update_user(user_id, {'pending_payment': None})
    
    try:
        bot.send_message(
            user_id,
            "❌ پرداخت شما رد شد.\n\nلطفاً مجدداً اقدام کنید."
        )
    except:
        pass
    
    bot.send_message(ADMIN_ID, f"❌ پرداخت کاربر {user_id} رد شد.")

@bot.message_handler(func=lambda message: user_states.get(message.from_user.id, {}).get('waiting_for_amount') and message.from_user.id == ADMIN_ID)
def get_amount_and_add_balance(message):
    admin_id = message.from_user.id
    user_id = user_states[admin_id]['waiting_for_amount']
    payment_id = user_states[admin_id]['payment_id']
    
    try:
        amount = int(message.text.strip())
        
        if amount <= 0:
            bot.send_message(admin_id, "❌ لطفاً یک عدد مثبت وارد کنید.")
            return
        
        user_data = get_user(user_id)
        current_balance = user_data.get('balance', 0)
        new_balance = current_balance + amount
        update_user(user_id, {'balance': new_balance, 'pending_payment': None})
        
        try:
            bot.send_message(
                user_id,
                f"✅ کیف پول شما شارژ شد.\n\n💰 مبلغ: {amount:,} تومان\n💵 موجودی جدید: {new_balance:,} تومان"
            )
        except:
            pass
        
        bot.send_message(
            admin_id,
            f"✅ موجودی کاربر {user_id} به مقدار {amount:,} تومان افزایش یافت.\n💰 موجودی جدید: {new_balance:,} تومان"
        )
        
        del user_states[admin_id]
        
    except ValueError:
        bot.send_message(admin_id, "❌ لطفاً یک عدد معتبر وارد کنید.")

@bot.callback_query_handler(func=lambda call: call.data.startswith("delete_confirm_"))
def delete_product_confirm(call):
    if call.from_user.id != ADMIN_ID:
        return
    
    product_id = call.data.split("_")[2]
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(
        "❓ آیا از حذف این محصول اطمینان دارید؟",
        call.message.chat.id,
        call.message.message_id,
        reply_markup=confirm_delete_buttons(product_id)
    )

@bot.callback_query_handler(func=lambda call: call.data.startswith("delete_yes_"))
def delete_product_yes(call):
    if call.from_user.id != ADMIN_ID:
        return
    
    product_id = call.data.split("_")[2]
    
    products = load_products()
    if product_id in products:
        product_name = products[product_id]['name']
        del products[product_id]
        
        new_products = {}
        counter = 1
        for key, value in products.items():
            new_products[str(counter)] = value
            counter += 1
        
        save_products(new_products)
        
        bot.edit_message_text(
            f"✅ محصول {product_name} با موفقیت حذف شد.",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=back_button()
        )
    else:
        bot.edit_message_text(
            "❌ محصول مورد نظر یافت نشد.",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=back_button()
        )

@bot.callback_query_handler(func=lambda call: call.data == "delete_no")
def delete_product_no(call):
    if call.from_user.id != ADMIN_ID:
        return
    
    bot.answer_callback_query(call.id, "عملیات حذف لغو شد.", show_alert=True)
    bot.edit_message_text(
        "عملیات حذف لغو شد.",
        call.message.chat.id,
        call.message.message_id,
        reply_markup=back_button()
    )

@bot.callback_query_handler(func=lambda call: call.data == "cancel_delete")
def cancel_delete(call):
    if call.from_user.id != ADMIN_ID:
        return
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(
        "عملیات لغو شد.",
        call.message.chat.id,
        call.message.message_id,
        reply_markup=back_button()
    )

@bot.callback_query_handler(func=lambda call: call.data == "support")
def show_support(call):
    chat_id = call.message.chat.id
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(
        f"📞 پشتیبانی\n\n🆔 آیدی پشتیبان: {ADMIN_ID}\n\nبرای ارتباط با پشتیبان، به آیدی بالا پیام دهید.",
        chat_id,
        call.message.message_id,
        reply_markup=back_button()
    )

@bot.callback_query_handler(func=lambda call: call.data == "referral")
def show_referral(call):
    user_id = call.from_user.id
    chat_id = call.message.chat.id
    user_data = get_user(user_id)
    ref_count = user_data.get('referral_count', 0)
    bot_username = bot.get_me().username
    ref_link = f"https://t.me/{bot_username}?start=ref{user_id}"
    
    text = f"""👥 سیستم زیرمجموعه‌گیری

🔗 لینک دعوت شما:
{ref_link}

👥 تعداد زیرمجموعه: {ref_count} نفر

🎁 جوایز:
• ۳ زیرمجموعه: ۱۰۰ مگابایت کانفیگ (با تأیید شما)
• ۲۰ زیرمجموعه: ۱ گیگابایت کانفیگ (ادمین برات ارسال می‌کنه)

📌 لینک رو برای دوستانت بفرست تا زیرمجموعه تو بشن."""
    
    markup = types.InlineKeyboardMarkup(row_width=1)
    share_btn = types.InlineKeyboardButton("🔗 ارسال لینک", url=f"https://t.me/share/url?url={ref_link}", style="primary")
    back_btn = types.InlineKeyboardButton("🔙 برگشت", callback_data="back_to_menu", style="danger")
    markup.add(share_btn, back_btn)
    
    bot.answer_callback_query(call.id)
    bot.edit_message_text(text, chat_id, call.message.message_id, reply_markup=markup)

# ربات فروش کانفیگ دستی 
#کص مادر کسی که اینو بفروشه رایگان پاب کردم عشق کنید 
#اگر پروژه ربات تلکرامی چیزی داشتید به ایدی زیر پیام بدید 
# @nothing_n89
@bot.callback_query_handler(func=lambda call: call.data.startswith("confirm_3reward_"))
def confirm_3reward(call):
    user_id = int(call.data.split("_")[2])
    users = load_users()
    user_str = str(user_id)
    
    if user_str in users:
        users[user_str] = ensure_user_fields(users[user_str])
        if users[user_str].get('pending_3_reward'):
            users[user_str]['pending_3_reward'] = False
            users[user_str]['claimed_3'] = True
            save_users(users)
            
            request_id = f"ref3_{user_id}_{int(time.time())}"
            
            bot.answer_callback_query(call.id, "✅ درخواست شما به ادمین ارسال شد.", show_alert=True)
            bot.edit_message_text(
                "✅ درخواست ۱۰۰ مگابایت کانفیگ ثبت شد.\nمنتظر ارسال از طرف ادمین باشید.",
                call.message.chat.id,
                call.message.message_id
            )
            
            user_name = users[user_str].get('first_name', 'کاربر')
            username = users[user_str].get('username', 'ندارد')
            
            admin_text = (
                f"🎁 درخواست کانفیگ رفال (۳ زیرمجموعه)\n\n"
                f"👤 نام: {user_name}\n"
                f"🆔 آیدی: {user_id}\n"
                f"📛 یوزرنیم: @{username}\n"
                f"🎁 جایزه: کانفیگ ۱۰۰ مگابایت\n"
                f"👥 زیرمجموعه: ۳ نفر\n\n"
                f"👇 یکی از گزینه‌ها را انتخاب کنید:"
            )
            
            bot.send_message(
                ADMIN_ID,
                admin_text,
                reply_markup=admin_referral_config_buttons(user_id, request_id, "3")
            )
    else:
        bot.answer_callback_query(call.id, "❌ درخواست معتبر نیست.", show_alert=True)

@bot.callback_query_handler(func=lambda call: call.data.startswith("reject_3reward_"))
def reject_3reward(call):
    user_id = int(call.data.split("_")[2])
    users = load_users()
    user_str = str(user_id)
    
    if user_str in users:
        users[user_str] = ensure_user_fields(users[user_str])
        if users[user_str].get('pending_3_reward'):
            users[user_str]['pending_3_reward'] = False
            save_users(users)
            
            bot.answer_callback_query(call.id, "❌ جایزه ۱۰۰ مگابایتی رد شد.", show_alert=True)
            bot.edit_message_text(
                "❌ شما جایزه ۱۰۰ مگابایتی را رد کردید.\n\nبا ۲۰ زیرمجموعه، ادمین برات ۱ گیگابایت ارسال می‌کنه.",
                call.message.chat.id,
                call.message.message_id
            )
    else:
        bot.answer_callback_query(call.id, "❌ درخواست معتبر نیست.", show_alert=True)

@bot.callback_query_handler(func=lambda call: call.data.startswith("sendconfigref3_"))
def ask_for_ref3_config_link(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    parts = call.data.split("_")
    user_id = int(parts[1])
    request_id = parts[2]
    
    bot.answer_callback_query(call.id)
    
    user_states[ADMIN_ID] = {
        'waiting_for_reply_config': True,
        'target_user_id': user_id,
        'request_id': request_id,
        'original_message_id': call.message.message_id,
        'original_chat_id': call.message.chat.id,
        'type': 'ref3'
    }
    
    bot.edit_message_text(
        f"✍️ لطفاً لینک کانفیگ ۱۰۰ مگابایت را برای کاربر {user_id} ارسال کنید.\n\n🔹 روی این پیام ریپلای کنید (Reply) و سپس ارسال کنید.",
        call.message.chat.id,
        call.message.message_id
    )

@bot.callback_query_handler(func=lambda call: call.data.startswith("sendconfigref20_"))
def ask_for_ref20_config_link(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    parts = call.data.split("_")
    user_id = int(parts[1])
    request_id = parts[2]
    
    bot.answer_callback_query(call.id)
    
    user_states[ADMIN_ID] = {
        'waiting_for_reply_config': True,
        'target_user_id': user_id,
        'request_id': request_id,
        'original_message_id': call.message.message_id,
        'original_chat_id': call.message.chat.id,
        'type': 'ref20'
    }
    
    bot.edit_message_text(
        f"✍️ لطفاً لینک کانفیگ ۱ گیگابایت را برای کاربر {user_id} ارسال کنید.\n\n🔹 روی این پیام ریپلای کنید (Reply) و سپس ارسال کنید.",
        call.message.chat.id,
        call.message.message_id
    )


@bot.callback_query_handler(func=lambda call: call.data.startswith("rejectconfigref_"))
def reject_referral_config_request(call):
    if call.from_user.id != ADMIN_ID:
        bot.answer_callback_query(call.id, "شما دسترسی ندارید.", show_alert=True)
        return
    
    parts = call.data.split("_")
    user_id = int(parts[1])
    request_id = parts[2]
    
    bot.answer_callback_query(call.id, "درخواست رد شد.", show_alert=True)
    
    bot.edit_message_text(
        f"❌ درخواست رفال کاربر {user_id} رد شد.",
        call.message.chat.id,
        call.message.message_id
    )
    
    try:
        bot.send_message(
            user_id,
            "❌ متأسفانه درخواست جایزه رفال شما رد شد.\n\nلطفاً با پشتیبانی تماس بگیرید."
        )
    except:
        pass

print("✅ ربات با موفقیت روشن شد...")
bot.infinity_polling()



# ربات فروش کانفیگ دستی 
#کص مادر کسی که اینو بفروشه رایگان پاب کردم عشق کنید 
#اگر پروژه ربات تلکرامی چیزی داشتید به ایدی زیر پیام بدید 
# @nothing_n89