import logging
import os
import json
import re
from datetime import datetime, timedelta
from collections import defaultdict
from telegram import (
    Update, InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardMarkup, KeyboardButton
)
from telegram.ext import (
    Application, CommandHandler, MessageHandler, CallbackQueryHandler,
    ContextTypes, filters, ConversationHandler
)
import asyncio

# تنظیمات لاگینگ
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO,
    handlers=[
        logging.FileHandler('bot.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

# دریافت متغیرهای محیطی
TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
ADMIN_ID = os.getenv("ADMIN_ID")  # باید به صورت رشته باشد
ADMIN_USERNAME = os.getenv("ADMIN_USERNAME")
CARD_NUMBER = os.getenv("CARD_NUMBER")
CARD_HOLDER = os.getenv("CARD_HOLDER")
EXCHANGE_RATE = float(os.getenv("EXCHANGE_RATE", "1300"))

DATA_FILE = 'orders_data.json'

# وضعیت سفارش‌ها
ORDER_STATUS = {
    'pending': 'در انتظار پرداخت',
    'paid': 'پرداخت شده',
    'processing': 'در حال پردازش',
    'completed': 'تکمیل شده',
    'cancelled': 'لغو شده'
}

# محدودیت درخواست‌ها برای جلوگیری از اسپم
request_limits = defaultdict(list)

# توابع کمکی
def check_rate_limit(user_id: str, limit: int = 5, window: int = 3600) -> bool:
    now = datetime.now()
    user_requests = request_limits[user_id]
    # حذف درخواست‌های قدیمی‌تر از پنجره زمانی
    user_requests = [req for req in user_requests if now - req < timedelta(seconds=window)]
    request_limits[user_id] = user_requests

    if len(user_requests) >= limit:
        return False

    request_limits[user_id].append(now)
    return True

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

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

def backup_data(data):
    backup_file = f'backup_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json'
    with open(backup_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    logger.info(f"پشتیبان‌گیری انجام شد: {backup_file}")

# اعتبارسنجی نام و نام خانوادگی (فقط حروف و فاصله مجاز است)
def validate_name(name: str) -> bool:
    return bool(re.match(r'^[آ-یa-zA-Z\s]+$', name))

# اعتبارسنجی مقدار شارژ (بین ۱۰ تا ۱۰۰٬۰۰۰ افغانی)
def validate_amount(amount: str) -> bool:
    try:
        value = float(amount)
        return 10 <= value <= 100000
    except ValueError:
        return False

# اعتبارسنجی شماره تلفن (مثلاً ۰۷۱۲۳۴۵۶۷۸۹)
def validate_phone(phone: str) -> bool:
    return bool(re.match(r'^0[789][0-9]{8}$', phone))

# بررسی وجود پوشه ذخیره رسید‌ها
RECEIPTS_DIR = 'receipts'

# مدیریت دریافت عکس رسید پرداخت
async def handle_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    photo = update.message.photo[-1]  # دریافت بهترین کیفیت عکس

    # دریافت فایل عکس
    file = await photo.get_file()
    file_path = file.file_path

    # ایجاد پوشه برای ذخیره عکس‌ها در صورت عدم وجود
    os.makedirs(RECEIPTS_DIR, exist_ok=True)

    # نام‌گذاری فایل عکس به صورت یکتای شامل شناسه کاربر و زمان
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    file_name = f"{RECEIPTS_DIR}/{user_id}_{timestamp}.jpg"

    # دانلود و ذخیره عکس در سرور
    await file.download_to_drive(file_name)

    # یافتن سفارش مربوطه که وضعیت آن 'pending' است
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id and o.get('status') == 'pending']
    if not user_orders:
        await update.message.reply_text("❌ سفارشی یافت نشد که منتظر ارسال رسید باشد.\nلطفاً با ادمین تماس بگیرید.")
        return ConversationHandler.END

    # فرض می‌کنیم آخرین سفارش کاربر
    order = sorted(user_orders, key=lambda x: x['order_date'], reverse=True)[0]
    order_id = order['order_id']
    orders_data[order_id]['receipt'] = file_name
    orders_data[order_id]['status'] = 'processing'
    save_orders_data(orders_data)

    # اطلاع‌رسانی به کاربر
    await update.message.reply_text(
        "✅ رسید پرداخت شما دریافت شد و در حال پردازش است. پس از تایید، شارژ سیم‌کارت شما اعمال خواهد شد.\n\nبرای پیگیری وضعیت سفارش می‌توانید از قسمت '📜 تاریخچه سفارش‌ها' استفاده کنید."
    )
    logger.info(f"دریافت رسید برای سفارش {order_id} از کاربر {user_id}")

    # پایان مکالمه
    return ConversationHandler.END

# بارگذاری داده‌های سفارش‌ها
orders_data = load_orders_data()

# تعریف وضعیت‌های ConversationHandler
NAME, AMOUNT, PHONE, CONFIRM, RECEIPT = range(5)

# تعریف کیبورد اصلی با تنها یک دکمه "🔰 شروع"
def main_keyboard():
    keyboard = [
        [KeyboardButton("🔰 شروع")]
    ]
    return ReplyKeyboardMarkup(keyboard, resize_keyboard=True, one_time_keyboard=False)

# فرمان /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if not check_rate_limit(user_id):
        await update.message.reply_text("⚠️ لطفاً کمی صبر کنید و سپس دوباره تلاش کنید.", reply_markup=main_keyboard())
        return

    # پیام خوش‌آمدگویی
    welcome_text = (
        f"سلام {update.effective_user.first_name} عزیز! 👋\n\n"
        "به ربات شارژ سیم‌کارت‌های افغانستان خوش آمدید.\n"
        "ما بهترین قیمت‌ها و سریع‌ترین خدمات را ارائه می‌دهیم.\n"
        "همین حالا شروع کنید و از تخفیفات ویژه بهره‌مند شوید!"
    )

    # تعریف دکمه‌های اینلاین
    inline_keyboard = [
        [InlineKeyboardButton("🔄 ثبت سفارش شارژ", callback_data='new_order')],
        [InlineKeyboardButton("📜 تاریخچه سفارش‌ها", callback_data='history')],
        [InlineKeyboardButton("📞 تماس با پشتیبانی", callback_data='support')],
        [InlineKeyboardButton("ℹ️ راهنما", callback_data='help')]
    ]
    reply_markup = InlineKeyboardMarkup(inline_keyboard)

    # پیام پیشنهاد ویژه همراه با دکمه‌های اینلاین
    special_offer = (
        "🎉 پیشنهاد ویژه 🌟\n"
        "با شارژ بالای ۵۰۰ افغانی از تخفیف ۱۰٪ بهره‌مند شوید!"
    )

    # ارسال پیام خوش‌آمدگویی
    await update.message.reply_text(welcome_text)

    # ارسال پیام پیشنهاد ویژه همراه با دکمه‌های اینلاین
    await update.message.reply_text(special_offer, reply_markup=reply_markup)

# فرمان /admin
async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return

    keyboard = [
        [InlineKeyboardButton("📊 مشاهده همه سفارش‌ها", callback_data='view_all_orders')],
        [InlineKeyboardButton("🔍 جستجوی سفارش", callback_data='search_order')],
        [InlineKeyboardButton("📈 آمار کلی", callback_data='statistics')],
        [InlineKeyboardButton("💱 تغییر نرخ تبدیل", callback_data='change_rate')],
        [InlineKeyboardButton("❌ حذف سفارش", callback_data='delete_order')],
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)

    await update.message.reply_text(
        "🔰 پنل مدیریت\n"
        f"💱 نرخ فعلی تبدیل: هر افغانی = {EXCHANGE_RATE} تومان\n\n"
        "لطفاً یک گزینه را انتخاب کنید:",
        reply_markup=reply_markup
    )

# فرمان /verify_payment
async def verify_payment(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return

    if not context.args:
        await update.message.reply_text("❌ لطفاً شناسه سفارش را وارد کنید.\nمثال: /verify_payment ORDER_123")
        return

    order_id = context.args[0]
    if order_id in orders_data:
        orders_data[order_id]['status'] = 'paid'
        save_orders_data(orders_data)
        user_id = orders_data[order_id].get('user_id')
        if user_id:
            try:
                await context.bot.send_message(
                    chat_id=user_id,
                    text=f"✅ پرداخت سفارش {order_id} تایید شد و شارژ به زودی انجام خواهد شد."
                )
                await update.message.reply_text(f"✅ وضعیت سفارش {order_id} به 'پرداخت شده' تغییر کرد.")
                logger.info(f"سفارش {order_id} پرداخت شد و به کاربر {user_id} اطلاع داده شد.")
            except Exception as e:
                await update.message.reply_text("❌ خطا در ارسال پیام به کاربر.")
                logger.error(f"Error sending message to user {user_id}: {e}")
    else:
        await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")

# فرمان /report
async def generate_report(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.message.reply_text("⛔️ شما دسترسی به این فرمان ندارید.")
        return

    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])

    report = f"""📊 گزارش عملکرد:

📦 کل سفارش‌ها: {total_orders}
✅ سفارش‌های تکمیل شده: {completed_orders}
⏳ سفارش‌های در انتظار: {pending_orders}
💰 درآمد کل: {total_revenue:,} تومان
    """
    await update.message.reply_text(report)
    logger.info("گزارش عملکرد توسط ادمین تولید شد.")

# هندلر کلیدهای اینلاین
async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()

    if query.data in ['view_all_orders', 'search_order', 'statistics', 'change_rate', 'delete_order', 'back_to_main',
                     'new_order', 'history', 'support', 'help']:
        if query.data == 'view_all_orders':
            await show_all_orders(update, context)
        elif query.data == 'search_order':
            await start_order_search(update, context)
        elif query.data == 'statistics':
            await show_statistics(update, context)
        elif query.data == 'change_rate':
            await start_rate_change(update, context)
        elif query.data == 'delete_order':
            await start_order_delete(update, context)
        elif query.data == 'back_to_main':
            await start(update, context)
        elif query.data == 'new_order':
            await start_order(update, context)
        elif query.data == 'history':
            await show_history(update, context)
        elif query.data == 'support':
            await show_support(update, context)
        elif query.data == 'help':
            await show_help(update, context)
    else:
        # Handle other inline buttons if any
        pass

# شروع فرآیند ثبت سفارش با ConversationHandler
async def start_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    keyboard = [
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)

    await update.callback_query.message.reply_text(
        "👤 لطفاً نام و نام خانوادگی خود را وارد کنید:",
        reply_markup=reply_markup
    )
    return NAME

# مرحله ورود نام و نام خانوادگی
async def order_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    text = update.message.text.strip()
    if not validate_name(text):
        await update.message.reply_text("❌ لطفاً نام و نام خانوادگی را به درستی وارد کنید (فقط حروف و فاصله).")
        return NAME
    context.user_data['name'] = text
    await update.message.reply_text("💰 لطفاً مقدار شارژ مورد نظر را به افغانی وارد کنید:")
    return AMOUNT

# مرحله ورود مقدار شارژ
async def order_amount(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    if not validate_amount(text):
        await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید (بین ۱۰ تا ۱۰۰٬۰۰۰ افغانی).")
        return AMOUNT
    amount = float(text)
    context.user_data['amount'] = amount
    await update.message.reply_text("📱 لطفاً شماره تلفن مقصد را وارد کنید:")
    return PHONE

# مرحله ورود شماره تلفن
async def order_phone(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    if not validate_phone(text):
        await update.message.reply_text("❌ لطفاً یک شماره تلفن معتبر وارد کنید (مثلاً ۰۷۱۲۳۴۵۶۷۸۹).")
        return PHONE
    context.user_data['phone'] = text
    await show_invoice(update, context)
    return CONFIRM

# نمایش پیش‌فاکتور سفارش
async def show_invoice(update: Update, context: ContextTypes.DEFAULT_TYPE):
    order_data = context.user_data
    amount_af = float(order_data['amount'])
    amount_ir = amount_af * EXCHANGE_RATE

    invoice_text = (
        "📋 پیش‌فاکتور سفارش شما:\n\n"
        f"👤 نام و نام خانوادگی: {order_data['name']}\n"
        f"💰 مقدار شارژ: {amount_af} افغانی\n"
        f"💶 مبلغ قابل پرداخت: {amount_ir:,} تومان\n"
        f"📱 شماره تلفن مقصد: {order_data['phone']}\n\n"
        f"💳 شماره کارت جهت واریز:\n"
        f"{CARD_NUMBER}\n"
        f"بنام: {CARD_HOLDER}\n\n"
        "لطفاً صحت اطلاعات را بررسی و تأیید کنید."
    )

    keyboard = [
        [
            InlineKeyboardButton("✅ تأیید و پرداخت", callback_data='confirm_order'),
            InlineKeyboardButton("❌ لغو سفارش", callback_data='cancel_order')
        ],
        [InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)

    if update.callback_query:
        # اگر فراخوانی از طریق دکمه اینلاین بوده است
        await update.callback_query.message.reply_text(invoice_text, reply_markup=reply_markup)
    else:
        # اگر فراخوانی از طریق پیام متنی بوده است
        await update.message.reply_text(invoice_text, reply_markup=reply_markup)

# تأیید سفارش
async def confirm_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    order_data = context.user_data
    amount_af = float(order_data['amount'])
    amount_ir = amount_af * EXCHANGE_RATE
    order_id = f"ORDER_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
    order_data['order_id'] = order_id
    order_data['status'] = 'pending'
    order_data['order_date'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    order_data['amount_ir'] = amount_ir
    order_data['user_id'] = user_id

    orders_data[order_id] = order_data.copy()
    save_orders_data(orders_data)

    admin_message = (
        "🆕 سفارش جدید:\n\n"
        f"🔹 شناسه سفارش: {order_id}\n"
        f"👤 نام مشتری: {order_data['name']}\n"
        f"💰 مقدار شارژ: {amount_af} افغانی\n"
        f"💶 مبلغ به تومان: {amount_ir:,} تومان\n"
        f"📱 شماره تلفن: {order_data['phone']}\n"
        f"📅 تاریخ: {order_data['order_date']}"
    )

    try:
        await context.bot.send_message(chat_id=ADMIN_ID, text=admin_message)
        logger.info(f"سفارش {order_id} توسط کاربر {user_id} ثبت شد.")
    except Exception as e:
        logger.error(f"Failed to send message to admin: {e}")

    payment_text = (
        "✅ سفارش شما ثبت شد.\n\n"
        f"💳 لطفاً مبلغ {amount_ir:,} تومان را به شماره کارت زیر واریز کنید:\n"
        f"{CARD_NUMBER}\n"
        f"بنام: {CARD_HOLDER}\n\n"
        "📸 پس از واریز، لطفاً تصویر رسید پرداخت را ارسال کنید."
    )

    keyboard = [[InlineKeyboardButton("🏠 بازگشت به منوی اصلی", callback_data='back_to_main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)

    await update.callback_query.edit_message_text(payment_text, reply_markup=reply_markup)
    context.user_data.clear()
    return RECEIPT

# لغو سفارش
async def cancel_order(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data.clear()
    await update.callback_query.edit_message_text(
        "❌ سفارش شما لغو شد.\n"
        "برای ثبت سفارش جدید از منوی اصلی اقدام کنید.",
        reply_markup=main_keyboard()
    )
    return ConversationHandler.END

# نمایش تاریخچه سفارش‌ها
async def show_history(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    user_orders = [o for o in orders_data.values() if o.get('user_id') == user_id]

    if not user_orders:
        await update.callback_query.message.reply_text("📝 شما هیچ سفارشی ثبت نکرده‌اید.", reply_markup=main_keyboard())
        return

    history_text = "📜 تاریخچه سفارش‌های شما:\n\n"
    for order in user_orders:
        history_text += (
            f"🔹 شناسه سفارش: {order['order_id']}\n"
            f"💰 مقدار شارژ: {order['amount']} افغانی\n"
            f"💶 مبلغ به تومان: {order['amount_ir']:,} تومان\n"
            f"📱 شماره تلفن: {order['phone']}\n"
            f"📅 تاریخ: {order['order_date']}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order['status'], 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )

    keyboard = [[KeyboardButton("🏠 بازگشت به منوی اصلی")]]
    reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True, one_time_keyboard=False)

    await update.callback_query.message.reply_text(history_text, reply_markup=reply_markup)
    logger.info(f"کاربر {user_id} تاریخچه سفارش‌های خود را مشاهده کرد.")

# تماس با پشتیبانی
async def show_support(update: Update, context: ContextTypes.DEFAULT_TYPE):
    support_text = (
        "📞 راه‌های ارتباط با پشتیبانی:\n\n"
        f"🔹 تلگرام: @{ADMIN_USERNAME}\n"
        "🔸 ساعات پاسخگویی: 8 صبح تا 8 شب\n\n"
        "برای ارتباط سریع‌تر لطفاً از تلگرام استفاده کنید."
    )
    keyboard = [[KeyboardButton("🏠 بازگشت به منوی اصلی")]]
    reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True, one_time_keyboard=False)

    await update.callback_query.edit_message_text(support_text, reply_markup=reply_markup)

# راهنما
async def show_help(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [[KeyboardButton("🏠 بازگشت به منوی اصلی")]]
    reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True, one_time_keyboard=False)

    await update.callback_query.edit_message_text(help_text, reply_markup=reply_markup)

# نمایش تمام سفارش‌ها به ادمین
async def show_all_orders(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return

    if not orders_data:
        await update.callback_query.message.reply_text("📝 هیچ سفارشی ثبت نشده است.")
        return

    for order_id, order_data in orders_data.items():
        order_text = (
            f"🔹 شناسه سفارش: {order_id}\n"
            f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
            f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
            f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
            f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
            f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
            f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}\n"
            "➖➖➖➖➖➖➖➖➖➖\n"
        )
        await update.callback_query.message.reply_text(order_text)
        logger.info(f"ادمین سفارش {order_id} را مشاهده کرد.")

# شروع جستجوی سفارش توسط ادمین
async def start_order_search(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_order_id'
    await update.callback_query.message.reply_text("🔍 لطفاً شناسه سفارش را وارد کنید:")

# نمایش آمار کلی
async def show_statistics(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return

    total_orders = len(orders_data)
    completed_orders = len([o for o in orders_data.values() if o['status'] == 'completed'])
    pending_orders = len([o for o in orders_data.values() if o['status'] == 'pending'])
    total_revenue = sum(float(o['amount_ir']) for o in orders_data.values() if o['status'] == 'completed')

    stats_text = (
        "📊 آمار کلی سیستم:\n\n"
        f"📦 تعداد کل سفارش‌ها: {total_orders}\n"
        f"✅ سفارش‌های تکمیل شده: {completed_orders}\n"
        f"⏳ سفارش‌های در انتظار: {pending_orders}\n"
        f"💰 درآمد کل: {total_revenue:,} تومان"
    )
    await update.callback_query.message.reply_text(stats_text)
    logger.info("ادمین آمار کلی سیستم را مشاهده کرد.")

# مدیریت تغییر نرخ تبدیل
async def start_rate_change(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_new_rate'
    await update.callback_query.message.reply_text(
        "💱 لطفاً نرخ جدید تبدیل افغانی به تومان را وارد کنید:\n"
        "مثال: 1300"
    )

# مدیریت حذف سفارش
async def start_order_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if str(update.effective_user.id) != str(ADMIN_ID):
        await update.callback_query.message.reply_text("⛔️ شما دسترسی به این بخش ندارید.")
        return
    context.user_data['admin_state'] = 'waiting_delete_id'
    await update.callback_query.message.reply_text("❌ لطفاً شناسه سفارش مورد نظر برای حذف را وارد کنید:")

# مدیریت پیام‌های ادمین
async def admin_message_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = str(update.effective_user.id)
    if user_id != str(ADMIN_ID):
        return

    admin_state = context.user_data.get('admin_state')
    if admin_state == 'waiting_new_rate':
        if not validate_amount(update.message.text):
            await update.message.reply_text("❌ لطفاً یک عدد معتبر و منطقی وارد کنید.")
            return
        try:
            new_rate = float(update.message.text)
            global EXCHANGE_RATE
            EXCHANGE_RATE = new_rate
            await update.message.reply_text(f"✅ نرخ تبدیل با موفقیت به {new_rate:,} تومان تغییر کرد.")
            # به‌روزرسانی نرخ در تمام سفارش‌های مقدماتی
            for order in orders_data.values():
                if order.get('status') == 'pending':
                    order['amount_ir'] = order['amount'] * EXCHANGE_RATE
            save_orders_data(orders_data)
            logger.info(f"نرخ تبدیل به {new_rate} تومان تغییر کرد و سفارش‌های معلق به‌روزرسانی شدند.")
        except ValueError:
            await update.message.reply_text("❌ لطفاً یک عدد معتبر وارد کنید.")
        context.user_data['admin_state'] = None

    elif admin_state == 'waiting_order_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            order_data = orders_data[order_id]
            order_text = (
                f"🔹 اطلاعات سفارش:\n\n"
                f"شناسه: {order_id}\n"
                f"👤 نام: {order_data.get('name', 'نامشخص')}\n"
                f"💰 مقدار شارژ: {order_data.get('amount', 0)} افغانی\n"
                f"💶 مبلغ به تومان: {order_data.get('amount_ir', 0):,} تومان\n"
                f"📱 شماره تلفن: {order_data.get('phone', 'نامشخص')}\n"
                f"📅 تاریخ: {order_data.get('order_date', 'نامشخص')}\n"
                f"📋 وضعیت: {ORDER_STATUS.get(order_data.get('status', 'pending'), 'نامشخص')}"
            )
            await update.message.reply_text(order_text)
            logger.info(f"ادمین سفارش {order_id} را جستجو کرد و مشاهده کرد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")
        context.user_data['admin_state'] = None

    elif admin_state == 'waiting_delete_id':
        order_id = update.message.text.strip()
        if order_id in orders_data:
            del orders_data[order_id]
            save_orders_data(orders_data)
            await update.message.reply_text(f"✅ سفارش {order_id} با موفقیت حذف شد.")
            logger.info(f"سفارش {order_id} توسط ادمین حذف شد.")
        else:
            await update.message.reply_text("❌ سفارشی با این شناسه یافت نشد.")
        context.user_data['admin_state'] = None

# فرمان /help
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    help_text = (
        "🔰 راهنمای استفاده از ربات:\n\n"
        "1️⃣ برای ثبت سفارش، دکمه '🔰 شروع' را فشار دهید.\n"
        "2️⃣ اطلاعات درخواستی را به ترتیب وارد کنید.\n"
        "3️⃣ فاکتور نهایی را بررسی و تأیید کنید.\n"
        "4️⃣ مبلغ را به شماره کارت اعلام شده واریز کنید.\n"
        "5️⃣ تصویر رسید پرداخت را ارسال کنید.\n\n"
        "❗️ در صورت نیاز به راهنمایی با پشتیبانی تماس بگیرید."
    )
    keyboard = [[KeyboardButton("🏠 بازگشت به منوی اصلی")]]
    reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True, one_time_keyboard=False)

    await update.callback_query.edit_message_text(help_text, reply_markup=reply_markup)

# اجرای ربات
def main():
    if not TOKEN:
        logger.error("توکن بات تنظیم نشده است. لطفاً متغیر محیطی TELEGRAM_BOT_TOKEN را تنظیم کنید.")
        return
    if not ADMIN_ID:
        logger.error("شناسه ادمین تنظیم نشده است. لطفاً متغیر محیطی ADMIN_ID را تنظیم کنید.")
        return

    application = Application.builder().token(TOKEN).build()

    # تعریف ConversationHandler برای ثبت سفارش
    conv_handler = ConversationHandler(
        entry_points=[CallbackQueryHandler(start_order, pattern='^new_order$')],
        states={
            NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_name)],
            AMOUNT: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_amount)],
            PHONE: [MessageHandler(filters.TEXT & ~filters.COMMAND, order_phone)],
            CONFIRM: [
                CallbackQueryHandler(confirm_order, pattern='^confirm_order$'),
                CallbackQueryHandler(cancel_order, pattern='^cancel_order$')
            ],
            RECEIPT: [MessageHandler(filters.PHOTO, handle_photo)]
        },
        fallbacks=[CallbackQueryHandler(cancel_order, pattern='^cancel_order$')]
    )

    # افزودن ConversationHandler قبل از هندلرهای عمومی
    application.add_handler(conv_handler)

    # افزودن هندلرهای فرمان
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("admin", admin_panel))
    application.add_handler(CommandHandler("verify_payment", verify_payment))
    application.add_handler(CommandHandler("report", generate_report))
    application.add_handler(CommandHandler("help", help_command))

    # افزودن هندلر CallbackQuery برای دکمه‌های اینلاین که خارج از ConversationHandler هستند
    application.add_handler(CallbackQueryHandler(button_handler))

    # افزودن هندلر PHOTO-only بعد از ConversationHandler
    application.add_handler(MessageHandler(filters.PHOTO, handle_photo))

    # حذف هندلر عمومی MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)
    # اگر نیاز دارید، می‌توانید آن را با یک شرط اضافه کنید

    logger.info("Bot started...")

    application.run_polling(allowed_updates=Update.ALL_TYPES)

if __name__ == '__main__':
    main()