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

# --- تنظیمات ---
TOKEN = "8533551456:AAG9guJy4dpWKt52HJOvossvHzqCpTQ2Fh0"  # توکن خودتون رو جایگزین کنید
ADMIN_ID = 8438594855  # شناسه ادمین رو جایگزین کنید

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

# قیمت‌ها (هر گیگابایت = ۱,۰۰۰ تومان)
PRICE_PER_GB = 1000

# اطلاعات کارت بانکی
BANK_CARD_NUMBER = "6219861924855975"
BANK_CARD_HOLDER = "طاهره مروتی"

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

# --- مدیریت داده ---
def load_orders():
    if os.path.exists(ORDERS_FILE):
        with open(ORDERS_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

def save_orders(orders):
    with open(ORDERS_FILE, 'w', encoding='utf-8') as f:
        json.dump(orders, f, ensure_ascii=False, indent=2)

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

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

def add_user(user_id, username, first_name):
    users = load_users()
    if str(user_id) not in users:
        users[str(user_id)] = {
            'username': username,
            'first_name': first_name,
            'joined_date': datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        save_users(users)
        return True
    return False

def generate_order_id():
    orders = load_orders()
    return str(len(orders) + 1)

# --- هندلرهای اصلی ---
def start(update, context):
    user = update.effective_user
    user_id = user.id
    username = user.username or "ندارد"
    first_name = user.first_name
    
    add_user(user_id, username, first_name)
    
    welcome_text = (
        f"👋 سلام {user.first_name}!\n"
        "به ربات فروش کانفیگ خوش آمدید.\n\n"
        "📌 لطفاً یکی از گزینه‌های زیر را انتخاب کنید:\n"
    )
    keyboard = [
        [InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")],
        [InlineKeyboardButton("📋 وضعیت سفارشات", callback_data="my_orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    
    if user_id == ADMIN_ID:
        keyboard.append([InlineKeyboardButton("📊 آمار ربات", callback_data="admin_stats")])
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(welcome_text, reply_markup=reply_markup)

def help_command(update, context):
    query = update.callback_query
    if query:
        query.answer()
        message = query.message
        edit = True
    else:
        message = update.message
        edit = False
    
    help_text = (
        "📌 **راهنمای استفاده از ربات**\n\n"
        "💡 **چگونه کانفیگ بگیریم؟**\n\n"
        "1️⃣ روی دکمه '🛒 خرید کانفیگ' کلیک کنید.\n"
        "2️⃣ حجم مورد نظر خود را به **گیگابایت** وارد کنید.\n"
        "   مثال: `5` یا `10` یا `20`\n"
        "3️⃣ ربات مبلغ را محاسبه کرده و شماره کارت را به شما نشان می‌دهد.\n"
        "4️⃣ مبلغ را به شماره کارت زیر واریز کنید:\n"
        f"   🏦 **شماره کارت:** `{BANK_CARD_NUMBER}`\n"
        f"   👤 **بنام:** {BANK_CARD_HOLDER}\n"
        "5️⃣ **تصویر رسید** را در ربات ارسال کنید.\n"
        "6️⃣ منتظر تأیید ادمین باشید.\n"
        "7️⃣ پس از تأیید، لینک اشتراک برای شما ارسال می‌شود.\n\n"
        "📊 **قیمت‌ها:**\n"
        f"• هر گیگابایت = {PRICE_PER_GB:,} تومان\n\n"
        "🌍 **سرویس‌ها:**\n"
        "• ۱۲ لوکیشن مختلف\n"
        "• باساب پرسرعت\n"
        "• پشتیبانی ۲۴/۷\n\n"
        "✅ با خیال راحت خرید کنید!"
    )
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    if edit:
        query.edit_message_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')
    else:
        message.reply_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')

def my_orders(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    orders = load_orders()
    user_orders = [o for o in orders.values() if o.get("user_id") == user_id]
    
    if not user_orders:
        text = "📭 **شما هیچ سفارشی ندارید!**\n\nبرای ثبت سفارش جدید، روی دکمه 'خرید کانفیگ' کلیک کنید."
        keyboard = [[InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")]]
        reply_markup = InlineKeyboardMarkup(keyboard)
        query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
        return
    
    text = "📋 **لیست سفارشات شما:**\n\n"
    status_emoji = {
        "pending": "⏳",
        "approved": "✅",
        "rejected": "❌",
        "completed": "🎉"
    }
    status_text = {
        "pending": "در انتظار تأیید",
        "approved": "تأیید شده - در انتظار لینک",
        "rejected": "رد شده",
        "completed": "تکمیل شده"
    }
    
    for i, order in enumerate(user_orders, 1):
        status = order.get('status', 'pending')
        emoji = status_emoji.get(status, '❓')
        text += (
            f"{i}. 📦 **حجم:** {order['volume']}\n"
            f"   💰 **مبلغ:** {order['price']:,} تومان\n"
            f"   {emoji} **وضعیت:** {status_text.get(status, 'نامشخص')}\n"
            f"   📅 **تاریخ:** {order.get('date', 'نامشخص')}\n"
        )
        if status == 'completed' and 'subscription_link' in order:
            text += f"   🔗 **لینک:** `{order['subscription_link']}`\n"
        text += "\n"
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')

def buy_config(update, context):
    query = update.callback_query
    query.answer()
    
    text = (
        "📊 **خرید کانفیگ**\n\n"
        "لطفاً حجم مورد نظر خود را به **گیگابایت** وارد کنید.\n"
        f"💰 قیمت هر گیگابایت: {PRICE_PER_GB:,} تومان\n\n"
        "مثال: `5` یا `10` یا `20`\n\n"
        "⚠️ فقط عدد وارد کنید."
    )
    keyboard = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
    
    context.user_data['awaiting_volume'] = True

def handle_volume(update, context):
    """دریافت حجم از کاربر"""
    if update.effective_user.id == ADMIN_ID:
        return
    
    if not context.user_data.get('awaiting_volume'):
        return
    
    try:
        volume = int(update.message.text.strip())
        if volume <= 0:
            update.message.reply_text("❌ لطفاً یک عدد مثبت وارد کنید.")
            return
        
        price = volume * PRICE_PER_GB
        user_id = update.effective_user.id
        
        context.user_data['order'] = {
            'volume': f"{volume} گیگابایت",
            'price': price,
            'user_id': user_id,
            'status': 'pending',
            'status_text': 'در انتظار پرداخت',
            'date': datetime.now().strftime("%Y-%m-%d %H:%M")
        }
        
        text = (
            f"📦 **حجم انتخابی:** {volume} گیگابایت\n"
            f"💰 **مبلغ قابل پرداخت:** {price:,} تومان\n\n"
            f"💳 لطفاً مبلغ را به شماره کارت زیر واریز کنید:\n"
            f"🏦 **شماره کارت:** `{BANK_CARD_NUMBER}`\n"
            f"👤 **بنام:** {BANK_CARD_HOLDER}\n\n"
            "✅ پس از واریز، **تصویر رسید** را در همینجا ارسال کنید.\n\n"
            "⚠️ لطفاً فقط یکبار رسید را ارسال کنید."
        )
        keyboard = [[InlineKeyboardButton("🔙 بازگشت", callback_data="buy_config")]]
        reply_markup = InlineKeyboardMarkup(keyboard)
        update.message.reply_text(text, reply_markup=reply_markup, parse_mode='Markdown')
        
        context.user_data['awaiting_volume'] = False
        context.user_data['awaiting_receipt'] = True
        
    except ValueError:
        update.message.reply_text("❌ لطفاً فقط عدد وارد کنید.\nمثال: `5` یا `10`")

def handle_receipt(update, context):
    """دریافت تصویر رسید از کاربر"""
    if update.effective_user.id == ADMIN_ID:
        return
    
    if not context.user_data.get('awaiting_receipt'):
        update.message.reply_text(
            "⚠️ در حال حاضر درخواست خرید فعالی ندارید.\n"
            "لطفاً از منوی اصلی شروع کنید."
        )
        return
    
    user = update.effective_user
    user_id = user.id
    order = context.user_data.get('order')
    
    if not order:
        update.message.reply_text("❌ خطا در اطلاعات سفارش. لطفاً دوباره تلاش کنید.")
        return
    
    if not update.message.photo:
        update.message.reply_text("❌ لطفاً **تصویر رسید** خود را ارسال کنید.")
        return
    
    photo = update.message.photo[-1].file_id
    order['receipt_photo'] = photo
    order['status'] = 'pending'
    order['status_text'] = 'در انتظار تأیید ادمین'
    
    orders = load_orders()
    order_id = generate_order_id()
    orders[order_id] = order
    save_orders(orders)
    
    # ارسال به ادمین با تصویر
    admin_text = (
        f"🆕 **سفارش جدید دریافت شد!**\n\n"
        f"🆔 **شماره سفارش:** {order_id}\n"
        f"👤 **کاربر:** {user.first_name} (ID: {user_id})\n"
        f"📦 **حجم:** {order['volume']}\n"
        f"💰 **مبلغ:** {order['price']:,} تومان\n"
        f"📅 **تاریخ:** {order['date']}\n\n"
        "📸 تصویر رسید را مشاهده کنید.\n"
        "لطفاً رسید را بررسی کنید."
    )
    
    keyboard = [
        [InlineKeyboardButton("✅ تأیید سفارش", callback_data=f"approve_{order_id}")],
        [InlineKeyboardButton("❌ رد سفارش", callback_data=f"reject_{order_id}")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    context.bot.send_photo(
        chat_id=ADMIN_ID,
        photo=photo,
        caption=admin_text,
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )
    
    update.message.reply_text(
        "✅ تصویر رسید شما با موفقیت ثبت شد.\n"
        "⏳ منتظر تأیید ادمین باشید.\n"
        "پس از تأیید، لینک اشتراک برای شما ارسال می‌شود."
    )
    
    context.user_data['awaiting_receipt'] = False

# --- مدیریت ادمین ---
def admin_stats(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    users = load_users()
    orders = load_orders()
    
    total_orders = len(orders)
    pending_orders = len([o for o in orders.values() if o.get('status') == 'pending'])
    completed_orders = len([o for o in orders.values() if o.get('status') == 'completed'])
    rejected_orders = len([o for o in orders.values() if o.get('status') == 'rejected'])
    
    total_income = sum([o.get('price', 0) for o in orders.values() if o.get('status') == 'completed'])
    
    stats_text = (
        "📊 **آمار ربات**\n\n"
        f"👥 **تعداد کل کاربران:** {len(users)}\n"
        f"📦 **تعداد کل سفارشات:** {total_orders}\n"
        f"⏳ **سفارشات در انتظار:** {pending_orders}\n"
        f"✅ **سفارشات تکمیل شده:** {completed_orders}\n"
        f"❌ **سفارشات رد شده:** {rejected_orders}\n"
        f"💰 **کل درآمد:** {total_income:,} تومان\n\n"
        "📋 **لیست کاربران:**\n"
    )
    
    for i, (user_id, user_data) in enumerate(list(users.items())[:10], 1):
        stats_text += (
            f"{i}. {user_data.get('first_name', 'نامشخص')} "
            f"(@{user_data.get('username', 'ندارد')}) - {user_data.get('joined_date', '')}\n"
        )
    
    if len(users) > 10:
        stats_text += f"\nو {len(users) - 10} کاربر دیگر..."
    
    keyboard = [[InlineKeyboardButton("🔙 بازگشت به منو", callback_data="back_to_main")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(stats_text, reply_markup=reply_markup, parse_mode='Markdown')

def admin_approve(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    order_id = query.data.split("_")[1]
    orders = load_orders()
    
    if order_id not in orders:
        query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    order = orders[order_id]
    order['status'] = 'approved'
    order['status_text'] = 'تأیید شده - در انتظار ارسال لینک'
    save_orders(orders)
    
    # اطلاع به کاربر
    try:
        context.bot.send_message(
            chat_id=order['user_id'],
            text=f"✅ سفارش شما (شماره {order_id}) تأیید شد!\n"
                 "⏳ لطفاً منتظر ارسال لینک اشتراک باشید."
        )
    except:
        pass
    
    query.edit_message_text(
        f"✅ **سفارش #{order_id} تأیید شد.**\n\n"
        f"👤 **کاربر:** {order['user_id']}\n"
        f"📦 **حجم:** {order['volume']}\n\n"
        "📤 لطفاً **لینک اشتراک** را در پیام بعدی ارسال کنید\n"
        "تا به کاربر تحویل داده شود.",
        parse_mode='Markdown'
    )
    
    context.user_data['sending_link_for'] = order_id

def admin_reject(update, context):
    query = update.callback_query
    query.answer()
    
    if update.effective_user.id != ADMIN_ID:
        query.edit_message_text("❌ شما دسترسی به این بخش ندارید.")
        return
    
    order_id = query.data.split("_")[1]
    orders = load_orders()
    
    if order_id not in orders:
        query.edit_message_text("❌ سفارش یافت نشد.")
        return
    
    order = orders[order_id]
    user_id = order['user_id']
    order['status'] = 'rejected'
    order['status_text'] = 'رد شده توسط ادمین'
    save_orders(orders)
    
    try:
        context.bot.send_message(
            chat_id=user_id,
            text=f"❌ متأسفیم! سفارش شما (شماره {order_id}) رد شد.\n"
                 "لطفاً برای اطلاعات بیشتر با پشتیبانی تماس بگیرید."
        )
    except Exception as e:
        logger.error(f"خطا در ارسال پیام به کاربر: {e}")
    
    query.edit_message_text(f"✅ سفارش #{order_id} رد شد.")

def admin_send_subscription(update, context):
    if update.effective_user.id != ADMIN_ID:
        return
    
    order_id = context.user_data.get('sending_link_for')
    if not order_id:
        update.message.reply_text(
            "❌ در حال تأیید سفارشی نیستید.\n"
            "لطفاً ابتدا یک سفارش را تأیید کنید."
        )
        return
    
    orders = load_orders()
    if order_id not in orders:
        update.message.reply_text("❌ سفارش یافت نشد.")
        context.user_data['sending_link_for'] = None
        return
    
    order = orders[order_id]
    user_id = order['user_id']
    subscription_link = update.message.text
    
    try:
        context.bot.send_message(
            chat_id=user_id,
            text=(
                f"🎉 **تبریک! سفارش شما تأیید شد!**\n\n"
                f"🆔 **شماره سفارش:** {order_id}\n"
                f"📦 **حجم:** {order['volume']}\n"
                f"🔗 **لینک اشتراک شما:**\n"
                f"`{subscription_link}`\n\n"
                "🌍 **سرویس‌ها:**\n"
                "• ۱۲ لوکیشن مختلف\n"
                "• باساب پرسرعت\n"
                "• پشتیبانی ۲۴/۷\n\n"
                "با تشکر از خرید شما! 🌟"
            ),
            parse_mode='Markdown'
        )
        
        order['status'] = 'completed'
        order['status_text'] = 'تکمیل شده'
        order['subscription_link'] = subscription_link
        save_orders(orders)
        
        update.message.reply_text(
            f"✅ لینک اشتراک برای سفارش #{order_id} ارسال شد.\n"
            f"👤 کاربر: {user_id}"
        )
        
    except Exception as e:
        update.message.reply_text(f"❌ خطا در ارسال لینک: {e}")
    
    context.user_data['sending_link_for'] = None

def back_to_main(update, context):
    query = update.callback_query
    query.answer()
    
    user_id = update.effective_user.id
    
    keyboard = [
        [InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")],
        [InlineKeyboardButton("📋 وضعیت سفارشات", callback_data="my_orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    
    if user_id == ADMIN_ID:
        keyboard.append([InlineKeyboardButton("📊 آمار ربات", callback_data="admin_stats")])
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(
        "🏠 **به صفحه اصلی بازگشتید.**\n"
        "لطفاً یکی از گزینه‌های زیر را انتخاب کنید:",
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )

def error_handler(update, context):
    logger.error(f"Update {update} caused error {context.error}")

# --- اجرای اصلی ---
def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    
    # دستورات
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help_command))
    
    # کالبک‌ها - بدون Filters
    dp.add_handler(CallbackQueryHandler(buy_config, pattern='^buy_config$'))
    dp.add_handler(CallbackQueryHandler(back_to_main, pattern='^back_to_main$'))
    dp.add_handler(CallbackQueryHandler(my_orders, pattern='^my_orders$'))
    dp.add_handler(CallbackQueryHandler(help_command, pattern='^help$'))
    dp.add_handler(CallbackQueryHandler(admin_stats, pattern='^admin_stats$'))
    dp.add_handler(CallbackQueryHandler(admin_approve, pattern='^approve_'))
    dp.add_handler(CallbackQueryHandler(admin_reject, pattern='^reject_'))
    
    # هندلرهای پیام
    dp.add_handler(MessageHandler(Filters.text & Filters.user(ADMIN_ID), admin_send_subscription))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.user(ADMIN_ID), handle_volume))
    dp.add_handler(MessageHandler(Filters.photo & ~Filters.user(ADMIN_ID), handle_receipt))
    
    dp.add_error_handler(error_handler)
    
    logger.info("🤖 ربات فروش کانفیگ راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()