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

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

# ============ تنظیمات CubePay ============
CUBEPAY_TOKEN = "200a0054dc44183791517be924be65389df28def294a57cd5bd30ba8279ef932"
CUBEPAY_PAY_BASE_URL = "https://cubevps.ir/pay"
CUBEPAY_SMSPAY_BASE_URL = "https://cubevps.ir/smspay"

# ============ توابع CubePay ============
def cubepay_create_link(amount_toman: int, order_id: str):
    """
    لینک پرداخت می‌سازه
    amount_toman: مبلغ به تومان
    order_id: شناسه سفارش
    """
    try:
        r = requests.post(
            f"{CUBEPAY_PAY_BASE_URL}/create-order.php",
            headers={"Authorization": f"Bearer {CUBEPAY_TOKEN}"},
            json={
                "order_id": order_id,
                "price_amount": amount_toman,
                "callback_url": "https://cubevps.ir/smspay/",
            },
            timeout=15,
        )
        return r.json() if r.status_code == 200 else None
    except Exception as e:
        print(f"خطا در ایجاد لینک پرداخت: {e}")
        return None

def cubepay_check_status(order_id: str):
    """
    بررسی وضعیت پرداخت
    status: verified / pending / choosing_method / expired / failed
    """
    try:
        r = requests.get(
            f"{CUBEPAY_PAY_BASE_URL}/check-order-status.php",
            headers={"Authorization": f"Bearer {CUBEPAY_TOKEN}"},
            params={"order_id": order_id},
            timeout=15,
        )
        return r.json() if r.status_code == 200 else None
    except Exception as e:
        print(f"خطا در بررسی وضعیت: {e}")
        return None

# ============ فایل‌ها ============
def load_json(file):
    if os.path.exists(file):
        with open(file, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

def save_json(file, data):
    with open(file, 'w', encoding='utf-8') as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

def get_orders():
    return load_json("orders.json")

def save_orders(o):
    save_json("orders.json", o)

def new_order_id():
    return f"ORD-{int(time.time())}-{random.randint(1000, 9999)}"

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

def start(update, context):
    uid = update.effective_user.id
    update.message.reply_text(
        f"👋 سلام {update.effective_user.first_name}!\nبه ربات فروش کانفیگ خوش آمدید.",
        reply_markup=menu()
    )

# ============ خرید ============
def buy(update, context):
    q = update.callback_query
    q.answer()
    
    kb = [
        [InlineKeyboardButton("💰 پرداخت آنلاین", callback_data="pay_online")],
        [InlineKeyboardButton("💳 کارت به کارت", callback_data="pay_card")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
    ]
    q.edit_message_text(
        "🛒 **روش پرداخت را انتخاب کنید:**\n\n"
        "• پرداخت آنلاین (سریع و خودکار)\n"
        "• کارت به کارت (دستی)",
        reply_markup=InlineKeyboardMarkup(kb),
        parse_mode='Markdown'
    )

# ============ پرداخت آنلاین ============
def pay_online(update, context):
    q = update.callback_query
    q.answer()
    
    amount = 10000  # مبلغ به تومان
    order_id = new_order_id()
    user_id = q.from_user.id
    
    # ذخیره سفارش موقت
    context.user_data['order'] = {
        "order_id": order_id,
        "amount": amount,
        "user_id": user_id,
        "status": "pending"
    }
    
    # ایجاد لینک پرداخت
    result = cubepay_create_link(amount, order_id)
    
    if result and result.get("success"):
        pay_url = result.get("pay_page_url")
        
        kb = [
            [InlineKeyboardButton("💳 پرداخت", url=pay_url)],
            [InlineKeyboardButton("✅ پرداخت کردم", callback_data=f"verify_{order_id}")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]
        ]
        q.edit_message_text(
            f"💰 **مبلغ:** {amount:,} تومان\n"
            f"🆔 **شماره سفارش:** `{order_id}`\n\n"
            "1️⃣ روی دکمه 'پرداخت' کلیک کنید\n"
            "2️⃣ پرداخت را انجام دهید\n"
            "3️⃣ بعد از پرداخت، روی 'پرداخت کردم' کلیک کنید\n\n"
            "⚠️ قبل از کلیک روی 'پرداخت کردم' حتماً پرداخت را انجام دهید.",
            reply_markup=InlineKeyboardMarkup(kb),
            parse_mode='Markdown'
        )
    else:
        q.edit_message_text(
            "❌ **خطا در ایجاد لینک پرداخت!**\n\n"
            "لطفاً دوباره تلاش کنید.",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]])
        )

# ============ تایید پرداخت ============
def verify_payment(update, context):
    q = update.callback_query
    q.answer()
    
    order_id = q.data.replace("verify_", "")
    user_id = q.from_user.id
    
    # بررسی وضعیت پرداخت
    result = cubepay_check_status(order_id)
    
    if not result:
        q.edit_message_text(
            "❌ **خطا در ارتباط با درگاه پرداخت!**\n\n"
            "لطفاً دوباره تلاش کنید.",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]])
        )
        return
    
    status = result.get("status")
    
    if status == "verified":
        # پرداخت تایید شد
        amount = result.get("amount", 0)
        
        # ذخیره سفارش
        orders = get_orders()
        order = {
            "order_id": order_id,
            "user_id": user_id,
            "amount": amount,
            "status": "completed",
            "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }
        orders[order_id] = order
        save_orders(orders)
        
        q.edit_message_text(
            f"✅ **پرداخت شما با موفقیت انجام شد!**\n\n"
            f"💰 مبلغ: {amount:,} تومان\n"
            f"🆔 شماره سفارش: `{order_id}`\n\n"
            "⏳ در حال آماده‌سازی کانفیگ شما...\n"
            "لطفاً چند دقیقه صبر کنید.",
            parse_mode='Markdown'
        )
        
        # اطلاع به ادمین
        context.bot.send_message(
            ADMIN_ID,
            f"✅ **پرداخت جدید تایید شد!**\n\n"
            f"👤 کاربر: {q.from_user.first_name} (ID: {user_id})\n"
            f"💰 مبلغ: {amount:,} تومان\n"
            f"🆔 سفارش: `{order_id}`"
        )
        
    elif status == "pending":
        q.edit_message_text(
            "⏳ **پرداخت شما در حال بررسی است...**\n\n"
            "لطفاً چند دقیقه دیگر دوباره امتحان کنید.",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔄 بررسی مجدد", callback_data=f"verify_{order_id}")],
                [InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]
            ])
        )
        
    elif status == "choosing_method":
        q.edit_message_text(
            "⚠️ **لطفاً روش پرداخت را انتخاب کنید!**\n\n"
            "ابتدا روی دکمه 'پرداخت' کلیک کنید و روش پرداخت را انتخاب کنید.",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("💳 پرداخت", url=result.get("pay_page_url", ""))],
                [InlineKeyboardButton("✅ پرداخت کردم", callback_data=f"verify_{order_id}")],
                [InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]
            ])
        )
        
    elif status == "expired" or status == "failed":
        q.edit_message_text(
            "❌ **پرداخت شما منقضی یا ناموفق بوده است!**\n\n"
            "لطفاً دوباره تلاش کنید.",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]])
        )
        
    else:
        q.edit_message_text(
            f"⚠️ **وضعیت نامشخص:** {status}\n\n"
            "لطفاً دوباره تلاش کنید.",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]])
        )

# ============ کارت به کارت ============
def pay_card(update, context):
    q = update.callback_query
    q.answer()
    
    q.edit_message_text(
        "💳 **پرداخت کارت به کارت**\n\n"
        f"🏦 شماره کارت: `6219861924855975`\n"
        f"👤 بنام: طاهره مروتی\n\n"
        "💰 مبلغ را واریز کنید و سپس **تصویر رسید** را ارسال کنید.\n\n"
        "⚠️ پس از ارسال رسید، منتظر تایید ادمین باشید.",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="buy")]]),
        parse_mode='Markdown'
    )
    context.user_data['waiting_receipt'] = True

# ============ سفارشات ============
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:
        q.edit_message_text("📭 شما هیچ سفارشی ندارید!")
        return
    
    text = "📋 **سفارشات شما**\n\n"
    for o in my_orders[-5:]:
        text += f"🆔 {o.get('order_id', 'نامشخص')}\n"
        text += f"💰 {o.get('amount', 0):,} تومان\n"
        text += f"📅 {o.get('date', 'نامشخص')}\n\n"
    
    q.edit_message_text(text)

# ============ راهنما ============
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"
        "1️⃣ روی '🛒 خرید' کلیک کنید\n"
        "2️⃣ روش پرداخت را انتخاب کنید\n"
        "3️⃣ پرداخت را انجام دهید\n"
        "4️⃣ پس از پرداخت، کانفیگ را دریافت کنید\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 back(update, context):
    q = update.callback_query
    q.answer()
    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(buy, pattern="^buy$"))
    dp.add_handler(CallbackQueryHandler(pay_online, pattern="^pay_online$"))
    dp.add_handler(CallbackQueryHandler(pay_card, pattern="^pay_card$"))
    dp.add_handler(CallbackQueryHandler(verify_payment, pattern="^verify_"))
    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(MessageHandler(Filters.photo & ~Filters.user(ADMIN_ID), handle_receipt))
    
    logger.info("🤖 ربات روشن شد!")
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()