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

# ============ تنظیمات ============
TOKEN = "8575116565:AAGmfMUyJGcB9Fb02KhqxIg108AiBumrMCA"
ADMIN_ID = 8438594855

# چنل اجباری
CHANNEL_ID = "@dexksjkw"
CHANNEL_LINK = "https://t.me/dexksjkw"

ORDERS_FILE = "orders.json"

# قیمت‌ها به فارسی
PRICES = {
    "1G": "۵۰,۰۰۰",
    "5G": "۲۵۰,۰۰۰",
    "10G": "۵۰۰,۰۰۰",
    "20G": "۱,۰۰۰,۰۰۰",
    "50G": "۲,۵۰۰,۰۰۰",
}
PRICES_NUM = {
    "1G": 50000,
    "5G": 250000,
    "10G": 500000,
    "20G": 1000000,
    "50G": 2500000,
}

MIU_CARD = "924899704940"

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# ============ فایل‌ها ============
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, ensure_ascii=False)

def get_orders():
    return load_json(ORDERS_FILE)

def save_orders(o):
    save_json(ORDERS_FILE, o)

def new_order_id():
    return str(len(get_orders()) + 1)

# ============ چک کردن عضویت ============
def check_membership(update, context):
    user_id = update.effective_user.id
    try:
        chat_member = context.bot.get_chat_member(CHANNEL_ID, user_id)
        status = chat_member.status
        if status in ["member", "administrator", "creator"]:
            return True
        return False
    except:
        return False

def send_join_message(update, context):
    text = (
        f"🔒 **برای استفاده از ربات باید عضو چنل ما شوید.**\n\n"
        f"📢 **چنل:** {CHANNEL_LINK}\n\n"
        "✅ بعد از عضویت، روی دکمه زیر کلیک کنید."
    )
    keyboard = [
        [InlineKeyboardButton("📢 عضویت در چنل", url=CHANNEL_LINK)],
        [InlineKeyboardButton("✅ بررسی عضویت", callback_data="check_join")]
    ]
    update.message.reply_text(text, reply_markup=InlineKeyboardMarkup(keyboard), parse_mode='Markdown')

def check_join_callback(update, context):
    q = update.callback_query
    q.answer()
    if check_membership(update, context):
        user_id = update.effective_user.id
        text = "✅ عضویت شما تایید شد! به ربات خوش اومدی."
        if context.user_data.get('buy_mode'):
            q.edit_message_text(text, reply_markup=menu())
        else:
            q.edit_message_text(text, reply_markup=menu())
    else:
        text = (
            "❌ **شما هنوز عضو چنل نشده‌اید!**\n\n"
            f"📢 **چنل:** {CHANNEL_LINK}\n\n"
            "لطفاً ابتدا عضو شوید و سپس روی دکمه زیر کلیک کنید."
        )
        keyboard = [
            [InlineKeyboardButton("📢 عضویت در چنل", url=CHANNEL_LINK)],
            [InlineKeyboardButton("✅ بررسی مجدد", callback_data="check_join")]
        ]
        q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(keyboard), parse_mode='Markdown')

# ============ منو ============
def menu():
    kb = [
        [InlineKeyboardButton("🛒 خرید", callback_data="buy")],
        [InlineKeyboardButton("📋 سفارشات", callback_data="orders")],
        [InlineKeyboardButton("❓ راهنما", callback_data="help")],
    ]
    return InlineKeyboardMarkup(kb)

def start(update, context):
    if not check_membership(update, context):
        send_join_message(update, context)
        return
    if not context.user_data.get('buy_mode'):
        update.message.reply_text("👋 سلام! به ربات خوش اومدی.", reply_markup=menu())
    else:
        update.message.reply_text("🏠 منوی اصلی", reply_markup=menu())

def help_cmd(update, context):
    q = update.callback_query
    if q:
        q.answer()
        msg = q.message
        edit = True
    else:
        msg = update.message
        edit = False
    
    text = (
        "📌 **راهنمای استفاده از ربات**\n\n"
        "💡 **چگونه کانفیگ بگیریم؟**\n\n"
        "1️⃣ روی دکمه '🛒 خرید' کلیک کنید.\n"
        "2️⃣ حجم مورد نظر خود را انتخاب کنید.\n"
        "3️⃣ مبلغ میو پوینت را به شماره کارت زیر واریز کنید:\n"
        f"   🏦 شماره کارت: `{MIU_CARD}`\n\n"
        "4️⃣ رسید را به صورت **متن** در ربات ارسال کنید.\n"
        "5️⃣ منتظر تأیید ادمین باشید.\n"
        "6️⃣ پس از تأیید، لینک اشتراک برای شما ارسال می‌شود.\n\n"
        "📊 **قیمت‌ها:**\n"
        "• ۱ گیگابایت = ۵۰,۰۰۰ میو پوینت\n"
        "• ۵ گیگابایت = ۲۵۰,۰۰۰ میو پوینت\n"
        "• ۱۰ گیگابایت = ۵۰۰,۰۰۰ میو پوینت\n"
        "• ۲۰ گیگابایت = ۱,۰۰۰,۰۰۰ میو پوینت\n"
        "• ۵۰ گیگابایت = ۲,۵۰۰,۰۰۰ میو پوینت\n\n"
        "✅ با میو پوینت‌های خود به راحتی کانفیگ بگیرید!"
    )
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    if edit:
        q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
    else:
        msg.reply_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def orders_list(update, context):
    q = update.callback_query
    q.answer()
    uid = q.from_user.id
    
    orders = get_orders()
    my_orders = [o for o in orders.values() if o.get('user_id') == uid]
    
    if not my_orders:
        kb = [[InlineKeyboardButton("🛒 خرید", callback_data="buy")]]
        q.edit_message_text("📭 سفارشی نداری!", reply_markup=InlineKeyboardMarkup(kb))
        return
    
    text = "📋 **لیست سفارشات شما**\n\n"
    for i, o in enumerate(my_orders, 1):
        st = o.get('status', 'pending')
        emoji = {'pending':'⏳','approved':'✅','rejected':'❌','completed':'🎉'}.get(st, '❓')
        txt = {'pending':'در انتظار تأیید','approved':'تایید شده','rejected':'رد شده','completed':'تکمیل شده'}.get(st, 'نامشخص')
        text += f"{i}. 📦 {o['volume']} - {emoji} {txt}\n"
        if st == 'completed' and 'link' in o:
            text += f"   🔗 لینک: {o['link']}\n"
        text += "\n"
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

# ============ خرید ============
def buy(update, context):
    q = update.callback_query
    q.answer()
    context.user_data['buy_mode'] = True
    
    kb = [
        [InlineKeyboardButton("📶 ۱ گیگ - ۵۰,۰۰۰ میو", callback_data="vol_1G")],
        [InlineKeyboardButton("📶 ۵ گیگ - ۲۵۰,۰۰۰ میو", callback_data="vol_5G")],
        [InlineKeyboardButton("📶 ۱۰ گیگ - ۵۰۰,۰۰۰ میو", callback_data="vol_10G")],
        [InlineKeyboardButton("📶 ۲۰ گیگ - ۱,۰۰۰,۰۰۰ میو", callback_data="vol_20G")],
        [InlineKeyboardButton("📶 ۵۰ گیگ - ۲,۵۰۰,۰۰۰ میو", callback_data="vol_50G")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
    ]
    q.edit_message_text("📊 **لطفاً حجم مورد نظر خود را انتخاب کنید:**", reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def select_vol(update, context):
    q = update.callback_query
    q.answer()
    
    vol = q.data.split('_')[1]
    price = PRICES[vol]
    price_num = PRICES_NUM[vol]
    uid = q.from_user.id
    
    context.user_data['order'] = {
        'volume': vol,
        'price': price_num,
        'price_text': price,
        'user_id': uid,
        'status': 'pending',
        'date': datetime.now().strftime("%Y-%m-%d %H:%M")
    }
    context.user_data['buy_mode'] = True
    
    text = (
        f"📦 **حجم انتخابی:** {vol}\n"
        f"💰 **مبلغ قابل پرداخت:** {price} میو پوینت\n\n"
        f"💳 لطفاً مبلغ را به شماره کارت میویی زیر واریز کنید:\n"
        f"🏦 **شماره کارت (برای کپی کلیک کن):**\n`{MIU_CARD}`\n\n"
        "✅ پس از واریز، **رسید را به صورت متن** در همینجا ارسال کنید.\n"
        "⚠️ **توجه:** فقط رسید متنی قابل قبول است."
    )
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def receipt(update, context):
    uid = update.effective_user.id
    
    if uid == ADMIN_ID:
        return
    
    if not context.user_data.get('buy_mode'):
        update.message.reply_text("⚠️ ابتدا از دکمه 'خرید' اقدام کنید و حجم را انتخاب کنید!")
        return
    
    if update.message.photo:
        update.message.reply_text("❌ فقط رسید متنی قابل قبول است! لطفاً متن ارسال کنید.")
        return
    
    order = context.user_data.get('order')
    if not order:
        update.message.reply_text("❌ خطا! دوباره تلاش کنید.")
        return
    
    order['receipt'] = update.message.text
    
    orders = get_orders()
    oid = new_order_id()
    orders[oid] = order
    save_orders(orders)
    
    kb = [
        [InlineKeyboardButton("✅ تأیید سفارش", callback_data=f"ok_{oid}")],
        [InlineKeyboardButton("❌ رد سفارش", callback_data=f"no_{oid}")]
    ]
    context.bot.send_message(
        ADMIN_ID,
        f"🆕 **سفارش جدید دریافت شد!**\n\n"
        f"🆔 شماره سفارش: #{oid}\n"
        f"👤 کاربر: {update.effective_user.first_name}\n"
        f"📦 حجم: {order['volume']}\n"
        f"💰 مبلغ: {order['price_text']} میو پوینت\n"
        f"📝 رسید: {order['receipt']}",
        reply_markup=InlineKeyboardMarkup(kb),
        parse_mode='Markdown'
    )
    
    update.message.reply_text("✅ رسید شما با موفقیت ثبت شد.\n⏳ منتظر تأیید ادمین باشید.")
    context.user_data['buy_mode'] = False
    context.user_data['order'] = None

# ============ ادمین ============
def approve(update, context):
    q = update.callback_query
    q.answer()
    if q.from_user.id != ADMIN_ID:
        return
    oid = q.data.split('_')[1]
    orders = get_orders()
    if oid not in orders:
        q.edit_message_text("❌ سفارش پیدا نشد!")
        return
    context.user_data['link_for'] = oid
    q.edit_message_text(f"✅ سفارش #{oid} تأیید شد!\n📤 لینک اشتراک را ارسال کنید:")

def reject(update, context):
    q = update.callback_query
    q.answer()
    if q.from_user.id != ADMIN_ID:
        return
    oid = q.data.split('_')[1]
    orders = get_orders()
    if oid not in orders:
        q.edit_message_text("❌ سفارش پیدا نشد!")
        return
    uid = orders[oid]['user_id']
    orders[oid]['status'] = 'rejected'
    save_orders(orders)
    try:
        context.bot.send_message(uid, f"❌ سفارش #{oid} رد شد.")
    except:
        pass
    q.edit_message_text(f"✅ سفارش #{oid} رد شد.")

def send_link(update, context):
    if update.effective_user.id != ADMIN_ID:
        return
    oid = context.user_data.get('link_for')
    if not oid:
        update.message.reply_text("❌ سفارشی برای ارسال لینک نیست!")
        return
    orders = get_orders()
    if oid not in orders:
        update.message.reply_text("❌ سفارش پیدا نشد!")
        context.user_data['link_for'] = None
        return
    order = orders[oid]
    uid = order['user_id']
    link = update.message.text
    try:
        context.bot.send_message(
            uid,
            f"🎉 **تبریک! سفارش شما تأیید شد!**\n\n"
            f"🆔 شماره سفارش: #{oid}\n"
            f"📦 حجم: {order['volume']}\n"
            f"🔗 لینک اشتراک شما:\n`{link}`\n\n"
            "با تشکر از خرید شما! 🌟",
            parse_mode='Markdown'
        )
        order['status'] = 'completed'
        order['link'] = link
        save_orders(orders)
        update.message.reply_text(f"✅ لینک اشتراک برای سفارش #{oid} ارسال شد.")
    except:
        update.message.reply_text("❌ خطا در ارسال لینک!")
    context.user_data['link_for'] = None

def back(update, context):
    q = update.callback_query
    q.answer()
    context.user_data['buy_mode'] = False
    context.user_data['order'] = None
    context.user_data['link_for'] = None
    q.edit_message_text("🏠 منوی اصلی", reply_markup=menu())

# ============ اجرا ============
def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help_cmd))
    
    dp.add_handler(CallbackQueryHandler(check_join_callback, pattern="^check_join$"))
    dp.add_handler(CallbackQueryHandler(buy, pattern="^buy$"))
    dp.add_handler(CallbackQueryHandler(select_vol, pattern="^vol_"))
    dp.add_handler(CallbackQueryHandler(orders_list, pattern="^orders$"))
    dp.add_handler(CallbackQueryHandler(help_cmd, pattern="^help$"))
    dp.add_handler(CallbackQueryHandler(back, pattern="^back$"))
    dp.add_handler(CallbackQueryHandler(approve, pattern="^ok_"))
    dp.add_handler(CallbackQueryHandler(reject, pattern="^no_"))
    
    dp.add_handler(MessageHandler(Filters.text & Filters.user(ADMIN_ID), send_link))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.user(ADMIN_ID), receipt))
    dp.add_handler(MessageHandler(Filters.photo & ~Filters.user(ADMIN_ID), receipt))
    
    logger.info("🤖 ربات فروش کانفیگ راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()