from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ContextTypes
import json
import os
import random
from datetime import datetime, timedelta

TOKEN = "8606797519:AAH_HA11-Rw3QhBU4Axuin59oMvvbNJsX1U"
ADMIN_ID = 8833140617  # آیدی عددی خودت

# فایل‌های ذخیره‌سازی
CONFIGS_FILE = "configs.json"
USERS_FILE = "users.json"
ORDERS_FILE = "orders.json"

CARD_NUMBER = "6219861924855975"
CARD_OWNER = "طاهره مروتی"

# ========== توابع مدیریت فایل ==========
def load_json(file):
    if os.path.exists(file):
        with open(file, 'r') as f:
            return json.load(f)
    return {}

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

# ========== پنل مدیریت ==========
async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.from_user.id != ADMIN_ID:
        await update.message.reply_text("⛔ فقط مدیر دسترسی داره.")
        return
    
    keyboard = [
        [InlineKeyboardButton("📊 آمار کاربران", callback_data='admin_stats')],
        [InlineKeyboardButton("➕ اضافه کردن کانفیگ فروشی", callback_data='admin_add_config')],
        [InlineKeyboardButton("🎁 دادن تست رایگان", callback_data='admin_add_test')],
        [InlineKeyboardButton("📋 لیست کانفیگ‌ها", callback_data='admin_list_configs')],
        [InlineKeyboardButton("📦 سفارشات", callback_data='admin_orders')],
    ]
    await update.message.reply_text(
        "🔐 **پنل مدیریت**\n\n"
        "یکی از گزینه‌ها رو انتخاب کن:",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode='Markdown'
    )

# ========== اضافه کردن کانفیگ فروشی ==========
async def add_config(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data['admin_action'] = 'add_config'
    await query.edit_message_text(
        "📝 **اضافه کردن کانفیگ جدید**\n\n"
        "فرمت ارسال:\n"
        "`/addconfig قیمت_تومان توضیحات`\n\n"
        "مثال:\n"
        "`/addconfig 15000 پلن ۵ گیگ`\n\n"
        "بعد از ارسال، کانفیگ رو به صورت متن بفرست."
    )

# ========== لیست کانفیگ‌ها ==========
async def list_configs(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    configs = load_json(CONFIGS_FILE)
    
    if not configs:
        await query.edit_message_text("📭 هیچ کانفیگی وجود نداره.")
        return
    
    text = "📋 **لیست کانفیگ‌های فروشی:**\n\n"
    for id, cfg in configs.items():
        text += f"🆔 `{id}` - {cfg['name']} - {cfg['price']} تومان\n"
    
    await query.edit_message_text(text, parse_mode='Markdown')

# ========== دادن تست رایگان ==========
async def give_test(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data['admin_action'] = 'give_test'
    await query.edit_message_text(
        "🎁 **دادن تست رایگان**\n\n"
        "فرمت ارسال:\n"
        "`/givetest user_id تعداد_تست`\n\n"
        "مثال:\n"
        "`/givetest 123456789 3`\n\n"
        "هر تست شامل ۱ گیگ حجم و ۲۴ ساعت زمان هست."
    )

# ========== شروع کاربر ==========
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.message.from_user.id)
    username = update.message.from_user.username or "بدون یوزر"
    
    # ثبت کاربر
    users = load_json(USERS_FILE)
    if user_id not in users:
        users[user_id] = {
            'username': username,
            'tests': 0,
            'test_used': 0,
            'test_expire': None,
            'orders': []
        }
        save_json(USERS_FILE, users)
    
    keyboard = [
        [InlineKeyboardButton("🆓 تست رایگان", callback_data='get_test')],
        [InlineKeyboardButton("💰 خرید کانفیگ", callback_data='buy_config')],
        [InlineKeyboardButton("📞 پشتیبانی", callback_data='support')],
    ]
    await update.message.reply_text(
        f"🚀 **سلام {username}!**\n\n"
        f"به ربات فروش کانفیگ خوش اومدی.\n\n"
        f"🔹 اگر تست رایگان داری، از دکمه تست استفاده کن.\n"
        f"🔹 برای خرید، دکمه خرید رو بزن.",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode='Markdown'
    )

# ========== دریافت تست رایگان ==========
async def get_test(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    user_id = str(query.from_user.id)
    users = load_json(USERS_FILE)
    
    if user_id not in users:
        await query.edit_message_text("❌ کاربر یافت نشد.")
        return
    
    user = users[user_id]
    
    # چک کردن تست موجود
    if user['tests'] <= 0:
        await query.edit_message_text(
            "❌ **تستی برای شما موجود نیست.**\n\n"
            "برای خرید کانفیگ از دکمه خرید استفاده کن."
        )
        return
    
    # چک کردن انقضای تست قبلی
    if user['test_expire']:
        expire = datetime.fromisoformat(user['test_expire'])
        if expire > datetime.now():
            await query.edit_message_text(
                f"⏳ **تست شما هنوز فعاله!**\n"
                f"⏰ تا {expire.strftime('%Y-%m-%d %H:%M')} اعتبار داره."
            )
            return
    
    # کاهش تست
    user['tests'] -= 1
    user['test_used'] += 1
    user['test_expire'] = (datetime.now() + timedelta(hours=24)).isoformat()
    save_json(USERS_FILE, users)
    
    # ارسال کانفیگ تست
    test_config = f"vless://test-config-{random.randint(1000,9999)}"
    await query.edit_message_text(
        "✅ **تست رایگان فعال شد!**\n\n"
        f"📤 **کانفیگ تست:**\n```\n{test_config}\n```\n\n"
        f"⏰ ۲۴ ساعت اعتبار داره.\n"
        f"📊 {1} گیگ حجم.\n\n"
        f"🔹 برای خرید کانفیگ دائم از دکمه خرید استفاده کن.",
        parse_mode='Markdown'
    )

# ========== خرید کانفیگ ==========
async def buy_config(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    configs = load_json(CONFIGS_FILE)
    
    if not configs:
        await query.edit_message_text("❌ هیچ کانفیگی برای فروش موجود نیست.")
        return
    
    keyboard = []
    for id, cfg in configs.items():
        keyboard.append([InlineKeyboardButton(
            f"📶 {cfg['name']} - {cfg['price']} تومان",
            callback_data=f'select_config_{id}'
        )])
    keyboard.append([InlineKeyboardButton("🔙 بازگشت", callback_data='back')])
    
    await query.edit_message_text(
        "📊 **پلن‌های موجود:**\n\n"
        "یکی رو انتخاب کن:",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== انتخاب کانفیگ ==========
async def select_config(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    config_id = query.data.split('_')[2]
    configs = load_json(CONFIGS_FILE)
    
    if config_id not in configs:
        await query.edit_message_text("❌ کانفیگ یافت نشد.")
        return
    
    cfg = configs[config_id]
    context.user_data['selected_config'] = config_id
    
    keyboard = [
        [InlineKeyboardButton("✅ پرداخت کردم، رسید میفرستم", callback_data='send_receipt')],
        [InlineKeyboardButton("🔙 بازگشت", callback_data='buy_config')],
    ]
    
    await query.edit_message_text(
        f"💰 **پلن انتخاب شده:** {cfg['name']}\n"
        f"💳 **مبلغ:** {cfg['price']} تومان\n\n"
        f"🏦 **شماره کارت:**\n`{CARD_NUMBER}`\n"
        f"👤 **صاحب حساب:** {CARD_OWNER}\n\n"
        f"⬇️ پس از واریز، دکمه زیر رو بزن و رسید رو بفرست.",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode='Markdown'
    )

# ========== دریافت رسید ==========
async def send_receipt(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    context.user_data['waiting_for_receipt'] = True
    await query.edit_message_text(
        "📸 **لطفاً رسید واریز رو به‌صورت عکس بفرست.**\n\n"
        "⚠️ **هشدار:** رسید فیک نفرست! در صورت تشخیص، مسدود میشی."
    )

# ========== هندل رسید ==========
async def handle_receipt(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.message.from_user
    user_id = str(user.id)
    username = user.username or "بدون یوزر"
    
    if not context.user_data.get('waiting_for_receipt'):
        await update.message.reply_text("❌ لطفاً اول از دکمه خرید استفاده کن.")
        return
    
    if not context.user_data.get('selected_config'):
        await update.message.reply_text("❌ لطفاً اول یک پلن انتخاب کن.")
        return
    
    if not update.message.photo:
        await update.message.reply_text("❌ لطفاً یک **عکس** از رسید بفرست.")
        return
    
    config_id = context.user_data['selected_config']
    configs = load_json(CONFIGS_FILE)
    cfg = configs.get(config_id, {})
    
    photo = update.message.photo[-1]
    file_id = photo.file_id
    
    # ذخیره سفارش
    orders = load_json(ORDERS_FILE)
    order_id = str(int(datetime.now().timestamp()))
    orders[order_id] = {
        'user_id': user_id,
        'username': username,
        'config_id': config_id,
        'config_name': cfg.get('name', 'نامشخص'),
        'price': cfg.get('price', 'نامشخص'),
        'file_id': file_id,
        'status': 'pending',
        'date': datetime.now().isoformat()
    }
    save_json(ORDERS_FILE, orders)
    
    await update.message.reply_text(
        "✅ **رسید شما دریافت شد!**\n"
        "⏳ منتظر تایید مدیر باشید..."
    )
    
    # ارسال به مدیر
    keyboard = [
        [InlineKeyboardButton("✅ تایید و ارسال", callback_data=f'confirm_order_{order_id}')],
        [InlineKeyboardButton("❌ رد", callback_data=f'reject_order_{order_id}')],
    ]
    
    await context.bot.send_photo(
        chat_id=ADMIN_ID,
        photo=file_id,
        caption=f"📩 **سفارش جدید**\n"
                f"👤 کاربر: @{username}\n"
                f"🆔 آیدی: `{user_id}`\n"
                f"📦 پلن: {cfg.get('name', 'نامشخص')}\n"
                f"💰 مبلغ: {cfg.get('price', 'نامشخص')} تومان\n"
                f"🆔 سفارش: `{order_id}`",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode='Markdown'
    )
    
    context.user_data['waiting_for_receipt'] = False
    context.user_data['selected_config'] = None

# ========== تایید سفارش ==========
async def confirm_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if query.from_user.id != ADMIN_ID:
        await query.edit_message_text("⛔ شما دسترسی ندارید.")
        return
    
    order_id = query.data.split('_')[2]
    orders = load_json(ORDERS_FILE)
    
    if order_id not in orders:
        await query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    order = orders[order_id]
    configs = load_json(CONFIGS_FILE)
    config_id = order['config_id']
    
    if config_id not in configs:
        await query.edit_message_text("❌ کانفیگ مربوطه یافت نشد.")
        return
    
    # ارسال خودکار کانفیگ به کاربر
    config_text = configs[config_id]['config']
    await context.bot.send_message(
        chat_id=int(order['user_id']),
        text=f"✅ **پرداخت شما تایید شد!**\n\n"
             f"📤 **کانفیگ {order['config_name']}:**\n\n"
             f"```\n{config_text}\n```\n\n"
             f"🔐 از کانفیگ درست استفاده کن.",
        parse_mode='Markdown'
    )
    
    orders[order_id]['status'] = 'confirmed'
    save_json(ORDERS_FILE, orders)
    
    await query.edit_message_text(f"✅ سفارش `{order_id}` تایید و کانفیگ ارسال شد.")

# ========== رد سفارش ==========
async def reject_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if query.from_user.id != ADMIN_ID:
        await query.edit_message_text("⛔ شما دسترسی ندارید.")
        return
    
    order_id = query.data.split('_')[2]
    orders = load_json(ORDERS_FILE)
    
    if order_id not in orders:
        await query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    orders[order_id]['status'] = 'rejected'
    save_json(ORDERS_FILE, orders)
    
    await context.bot.send_message(
        chat_id=int(orders[order_id]['user_id']),
        text="❌ متاسفیم! پرداخت شما تایید نشد.\n"
             "📞 لطفاً با پشتیبانی تماس بگیرید."
    )
    await query.edit_message_text(f"❌ سفارش `{order_id}` رد شد.")

# ========== دستورات مدیریتی ==========
async def admin_add_config_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.from_user.id != ADMIN_ID:
        return
    
    try:
        price = context.args[0]
        name = ' '.join(context.args[1:])
        context.user_data['new_config'] = {'price': price, 'name': name}
        await update.message.reply_text(
            f"✅ قیمت و نام ثبت شد.\n"
            f"💰 قیمت: {price} تومان\n"
            f"📦 نام: {name}\n\n"
            f"📤 حالا کانفیگ رو به صورت متن بفرست."
        )
        context.user_data['waiting_for_config'] = True
    except:
        await update.message.reply_text("❌ دستور: `/addconfig قیمت نام_پلن`")

async def admin_give_test_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.from_user.id != ADMIN_ID:
        return
    
    try:
        user_id = context.args[0]
        count = int(context.args[1])
        users = load_json(USERS_FILE)
        if user_id not in users:
            users[user_id] = {'username': 'کاربر جدید', 'tests': 0, 'test_used': 0, 'test_expire': None, 'orders': []}
        users[user_id]['tests'] += count
        save_json(USERS_FILE, users)
        await update.message.reply_text(f"✅ {count} تست به کاربر `{user_id}` اضافه شد.")
    except:
        await update.message.reply_text("❌ دستور: `/givetest user_id تعداد`")

async def handle_config_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.from_user.id != ADMIN_ID:
        return
    if not context.user_data.get('waiting_for_config'):
        return
    
    config_text = update.message.text
    new_config = context.user_data.get('new_config', {})
    configs = load_json(CONFIGS_FILE)
    
    config_id = str(int(datetime.now().timestamp()))
    configs[config_id] = {
        'name': new_config.get('name', 'بدون نام'),
        'price': new_config.get('price', '۰'),
        'config': config_text,
        'date': datetime.now().isoformat()
    }
    save_json(CONFIGS_FILE, configs)
    
    await update.message.reply_text(f"✅ کانفیگ با موفقیت اضافه شد!\n🆔 شناسه: `{config_id}`")
    context.user_data['waiting_for_config'] = False

# ========== پشتیبانی و بازگشت ==========
async def support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    await query.edit_message_text(
        "📞 **پشتیبانی:**\n\n"
        "برای راهنمایی بیشتر با مدیر تماس بگیر:\n"
        "@amir12jsjs"
    )

async def back(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    await start(update, context)

# ========== اجرا ==========
def main():
    app = Application.builder().token(TOKEN).build()
    
    # دستورات
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("admin", admin_panel))
    app.add_handler(CommandHandler("addconfig", admin_add_config_cmd))
    app.add_handler(CommandHandler("givetest", admin_give_test_cmd))
    
    # دکمه‌ها
    app.add_handler(CallbackQueryHandler(get_test, pattern='get_test'))
    app.add_handler(CallbackQueryHandler(buy_config, pattern='buy_config'))
    app.add_handler(CallbackQueryHandler(select_config, pattern='select_config_'))
    app.add_handler(CallbackQueryHandler(send_receipt, pattern='send_receipt'))
    app.add_handler(CallbackQueryHandler(support, pattern='support'))
    app.add_handler(CallbackQueryHandler(back, pattern='back'))
    app.add_handler(CallbackQueryHandler(admin_panel, pattern='admin_'))
    app.add_handler(CallbackQueryHandler(add_config, pattern='admin_add_config'))
    app.add_handler(CallbackQueryHandler(give_test, pattern='admin_add_test'))
    app.add_handler(CallbackQueryHandler(list_configs, pattern='admin_list_configs'))
    app.add_handler(CallbackQueryHandler(confirm_order, pattern='confirm_order_'))
    app.add_handler(CallbackQueryHandler(reject_order, pattern='reject_order_'))
    
    # پیام‌ها
    app.add_handler(MessageHandler(filters.PHOTO, handle_receipt))
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_config_text))
    
    print("🤖 ربات فروش کانفیگ روشن شد!")
    app.run_polling()

if __name__ == "__main__":
    main()