#!/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

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

ORDERS_FILE = "orders.json"

# قیمت‌ها (هر گیگابایت = ۵۰,۰۰۰ میو پوینت)
PRICES = {
    "1G": 50000,
    "5G": 2500000G": 500000,
    "20G": 1000000,
    "50G": 2500000,
}

MIU_CARD_NUMBER = "924899704940"

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 generate_order_id():
    orders = load_orders()
    return str(len(orders) + 1)

# --- هندلرهای اصلی ---
def start(update, context):
    user = update.effective_user
    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")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(welcome_text, reply_markup=reply_markup)

def help_command(update, context):
    if update.callback_query:
        query = update.callback_query
        query.answer()
        message = query.message
        edit = True
    else:
        message = update.message
        edit = False
    
    help_text = (
        "📌 **راهنمای استفاده از ربات**\n\n"
        "💡 **چگونه کانفیگ بگیریم؟**\n"
        "1️⃣ روی دکمه '🛒 خرید کانفیگ' کلیک کنید.\n"
        "2️⃣ حجم مورد نظر خود را انتخاب کنید.\n"
        "3️⃣ مبلغ میو پوینت را به شماره کارت زیر واریز کنید:\n"
        f"   🏦 شماره کارت میویی: `{MIU_CARD_NUMBER}`\n\n"
        "4️⃣ رسید را به صورت **متن** در ربات ارسال کنید.\n"
        "5️⃣ منتظر تأیید ادمین باشید.\n"
        "6️⃣ پس از تأیید، لینک اشتراک برای شما ارسال می‌شود.\n\n"
        "📊 **قیمت‌ها:**\n"
        "• 1 گیگابایت = ۵۰,۰۰۰ میو پوینت\n"
        "• 5 گیگابایت = ۲۵۰,۰۰۰ میو پوینت\n"
        "• 10 گیگابایت = ۵۰۰,۰۰۰ میو پوینت\n"
        "• 20 گیگابایت = ۱,۰۰۰,۰۰۰ میو پوینت\n"
        "• 50 گیگابایت = ۲,۵۰۰,۰۰۰ میو پوینت\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()
    
    keyboard = [
        [InlineKeyboardButton("📶 1 گیگابایت - ۵۰,۰۰۰ میو پوینت", callback_data="vol_1G")],
        [InlineKeyboardButton("📶 5 گیگابایت - ۲۵۰,۰۰۰ میو پوینت", callback_data="vol_5G")],
        [InlineKeyboardButton("📶 10 گیگابایت - ۵۰۰,۰۰۰ میو پوینت", callback_data="vol_10G")],
        [InlineKeyboardButton("📶 20 گیگابایت - ۱,۰۰۰,۰۰۰ میو پوینت", callback_data="vol_20G")],
        [InlineKeyboardButton("📶 50 گیگابایت - ۲,۵۰۰,۰۰۰ میو پوینت", callback_data="vol_50G")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_main")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(
        "📊 **لطفاً حجم مورد نظر خود را انتخاب کنید:**",
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )

def select_volume(update, context):
    query = update.callback_query
    query.answer()
    
    volume = query.data.split("_")[1]
    price = PRICES[volume]
    user_id = update.effective_user.id
    
    context.user_data['order'] = {
        'volume': 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"🏦 **شماره کارت:** `{MIU_CARD_NUMBER}`\n\n"
        "✅ پس از واریز، **رسید را به صورت متن** در همینجا ارسال کنید.\n"
        "مثال: مبلغ ۵۰,۰۰۰ میو پوینت به شماره کارت ... واریز شد. کد پیگیری: ۱۲۳۴۵\n\n"
        "⚠️ لطفاً فقط یکبار رسید را ارسال کنید."
    )
    keyboard = [[InlineKeyboardButton("🔙 بازگشت", callback_data="buy_config")]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text(text, reply_markup=reply_markup, parse_mode='Markdown')
    
    context.user_data['awaiting_receipt'] = True

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.text:
        update.message.reply_text("❌ لطفاً رسید خود را به صورت متن ارسال کنید.")
        return
    
    receipt_text = update.message.text
    order['receipt'] = receipt_text
    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"📝 **رسید:** {receipt_text}\n"
        f"📅 **تاریخ:** {order['date']}\n\n"
        "لطفاً رسید را بررسی کنید."
    )
    
    keyboard = [
        [InlineKeyboardButton("✅ تأیید سفارش", callback_data=f"approve_{order_id}")],
        [InlineKeyboardButton("❌ رد سفارش", callback_data=f"reject_{order_id}")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    context.bot.send_message(
        chat_id=ADMIN_ID,
        text=admin_text,
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )
    
    update.message.reply_text(
        "✅ رسید شما با موفقیت ثبت شد.\n"
        "⏳ منتظر تأیید ادمین باشید.\n"
        "پس از تأیید، لینک اشتراک برای شما ارسال می‌شود."
    )
    
    context.user_data['awaiting_receipt'] = False

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)
    
    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"
                "با تشکر از خرید شما! 🌟"
            ),
            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()
    
    keyboard = [
        [InlineKeyboardButton("🛒 خرید کانفیگ", callback_data="buy_config")],
        [InlineKeyboardButton("📋 وضعیت سفارشات", callback_data="my_orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")]
    ]
    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))
    
    dp.add_handler(CallbackQueryHandler(buy_config, pattern="^buy_config$"))
    dp.add_handler(CallbackQueryHandler(select_volume, pattern="^vol_"))
    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_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_receipt))
    
    dp.add_error_handler(error_handler)
    
    logger.info("🤖 ربات فروش کانفیگ راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()