from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ContextTypes
import json
import os
import random
from datetime import datetime, timedelta

TOKEN = "8934556701:AAFaUcMz4bP2S_6tafS3ZaULcrkplpumXuM"  # از @BotFather بگیر
OWNER_ID = 8833140617  # آیدی عددی مالک (مدیر اصلی)
GROUP_ID = -5309579979  # آیدی عددی گروه (اختیاری)

# فایل‌های ذخیره‌سازی
GAME_FILE = "game_data.json"

# ========== مدیریت داده ==========
def load_game():
    if os.path.exists(GAME_FILE):
        with open(GAME_FILE, 'r') as f:
            return json.load(f)
    return {
        'players': {},
        'rounds': [],
        'settings': {
            'max_bet': 100,
            'min_bet': 10,
            'rocket_speed': 3
        }
    }

def save_game(data):
    with open(GAME_FILE, 'w') as f:
        json.dump(data, f, indent=2)

# ========== شروع بازی ==========
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.message.from_user
    user_id = str(user.id)
    game = load_game()
    
    # ثبت بازیکن
    if user_id not in game['players']:
        game['players'][user_id] = {
            'name': user.first_name,
            'score': 0,
            'wins': 0,
            'losses': 0,
            'total_bet': 0
        }
        save_game(game)
    
    keyboard = [
        [InlineKeyboardButton("🚀 شروع بازی", callback_data='start_game')],
        [InlineKeyboardButton("📊 امتیازات", callback_data='scores')],
        [InlineKeyboardButton("💰 شرط‌بندی", callback_data='bet')],
        [InlineKeyboardButton("📋 راهنما", callback_data='help')],
    ]
    
    await update.message.reply_text(
        "🎯 **بازی پدافند موشکی**\n\n"
        "🛡️ شهر خود را در برابر موشک‌ها دفاع کن!\n"
        "💰 روی هر دور شرط ببند و امتیاز جمع کن!\n\n"
        "🚀 هر موشک = ۱۰ امتیاز\n"
        "🎯 هر موشک منهدم‌شده = ۵ امتیاز\n"
        "💥 برخورد به شهر = -۲۰ امتیاز\n\n"
        f"👤 بازیکن: {user.first_name}\n"
        f"🏆 امتیاز: {game['players'][user_id]['score']}",
        reply_markup=InlineKeyboardMarkup(keyboard),
        parse_mode='Markdown'
    )

# ========== شروع دور بازی ==========
async def start_game(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    user_id = str(query.from_user.id)
    game = load_game()
    
    # تولید موشک‌ها
    rockets = random.randint(5, 15)
    defense_level = random.randint(1, 5)
    
    # ذخیره وضعیت بازی
    game['current_round'] = {
        'user_id': user_id,
        'rockets': rockets,
        'defense': defense_level,
        'hit': 0,
        'miss': 0,
        'status': 'active'
    }
    save_game(game)
    
    keyboard = [
        [InlineKeyboardButton("🎯 شلیک پدافند", callback_data='defend')],
        [InlineKeyboardButton("🔄 موشک جدید", callback_data='new_rocket')],
        [InlineKeyboardButton("🏳️ تسلیم", callback_data='surrender')],
    ]
    
    await query.edit_message_text(
        "🚨 **دور جدید شروع شد!**\n\n"
        f"🛡️ سطح دفاع: {defense_level}/5\n"
        f"🚀 تعداد موشک‌ها: {rockets}\n"
        f"🎯 موشک‌های منهدم‌شده: 0\n\n"
        "⬇️ اقدام کن:",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== عملیات دفاع ==========
async def defend(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    user_id = str(query.from_user.id)
    game = load_game()
    
    if 'current_round' not in game:
        await query.edit_message_text("❌ هیچ بازی فعالی وجود نداره.")
        return
    
    round_data = game['current_round']
    
    # شبیه‌سازی دفاع
    hit_chance = random.randint(1, 10)
    success = hit_chance <= round_data['defense'] * 2
    
    if success:
        round_data['hit'] += 1
        points = 5
    else:
        round_data['miss'] += 1
        points = -2
    
    round_data['rockets'] -= 1
    
    # بررسی پایان بازی
    if round_data['rockets'] <= 0:
        # پایان دور
        total_score = (round_data['hit'] * 5) - (round_data['miss'] * 2)
        game['players'][user_id]['score'] += total_score
        game['players'][user_id]['wins'] += 1 if total_score > 0 else 0
        game['players'][user_id]['losses'] += 1 if total_score < 0 else 0
        
        del game['current_round']
        save_game(game)
        
        await query.edit_message_text(
            "🎉 **دور به پایان رسید!**\n\n"
            f"🎯 موشک‌های منهدم‌شده: {round_data['hit']}\n"
            f"💥 برخورد به شهر: {round_data['miss']}\n"
            f"🏆 امتیاز این دور: {total_score}\n"
            f"📊 امتیاز کل: {game['players'][user_id]['score']}",
            reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔄 دور جدید", callback_data='start_game')],
                [InlineKeyboardButton("📊 امتیازات", callback_data='scores')]
            ])
        )
        return
    
    save_game(game)
    
    keyboard = [
        [InlineKeyboardButton("🎯 ادامه دفاع", callback_data='defend')],
        [InlineKeyboardButton("🔄 موشک جدید", callback_data='new_rocket')],
        [InlineKeyboardButton("🏳️ تسلیم", callback_data='surrender')],
    ]
    
    await query.edit_message_text(
        "🚨 **عملیات دفاعی!**\n\n"
        f"{'✅' if success else '❌'} {'موشک منهدم شد!' if success else 'موشک به شهر برخورد کرد!'}\n\n"
        f"🎯 موشک‌های باقی‌مانده: {round_data['rockets']}\n"
        f"🎯 منهدم‌شده: {round_data['hit']}\n"
        f"💥 برخورد: {round_data['miss']}\n\n"
        f"🛡️ سطح دفاع: {round_data['defense']}/5",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== تسلیم ==========
async def surrender(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    user_id = str(query.from_user.id)
    game = load_game()
    
    if 'current_round' in game:
        del game['current_round']
        game['players'][user_id]['losses'] += 1
        save_game(game)
    
    await query.edit_message_text(
        "🏳️ **شما تسلیم شدید!**\n\n"
        "دفاع شهر شکست خورد!\n"
        "دوباره تلاش کن.",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("🔄 شروع مجدد", callback_data='start_game')]
        ])
    )

# ========== شرط‌بندی ==========
async def bet(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    keyboard = [
        [InlineKeyboardButton("💰 ۱۰ امتیاز", callback_data='bet_10')],
        [InlineKeyboardButton("💰 ۲۰ امتیاز", callback_data='bet_20')],
        [InlineKeyboardButton("💰 ۵۰ امتیاز", callback_data='bet_50')],
        [InlineKeyboardButton("🔙 بازگشت", callback_data='back')],
    ]
    
    await query.edit_message_text(
        "💰 **شرط‌بندی**\n\n"
        "مقدار شرط رو انتخاب کن:\n"
        "⚠️ اگر ببری، ۲ برابر برمی‌گرده!",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== اجرای شرط ==========
async def place_bet(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    user_id = str(query.from_user.id)
    bet_amount = int(query.data.split('_')[1])
    game = load_game()
    
    if user_id not in game['players']:
        await query.edit_message_text("❌ شما در بازی ثبت نام نکردید.")
        return
    
    # شبیه‌سازی برد/باخت
    win = random.choice([True, False])
    
    if win:
        game['players'][user_id]['score'] += bet_amount * 2
        game['players'][user_id]['wins'] += 1
        result = f"✅ شما برنده شدید! +{bet_amount * 2} امتیاز"
    else:
        game['players'][user_id]['score'] -= bet_amount
        game['players'][user_id]['losses'] += 1
        result = f"❌ شما باختید! -{bet_amount} امتیاز"
    
    save_game(game)
    
    await query.edit_message_text(
        "🎲 **نتیجه شرط‌بندی**\n\n"
        f"{result}\n"
        f"📊 امتیاز فعلی: {game['players'][user_id]['score']}",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("🔄 شرط جدید", callback_data='bet')],
            [InlineKeyboardButton("📊 امتیازات", callback_data='scores')]
        ])
    )

# ========== نمایش امتیازات ==========
async def show_scores(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    game = load_game()
    players = game['players']
    
    if not players:
        await query.edit_message_text("📭 هیچ بازیکنی ثبت نشده.")
        return
    
    # مرتب‌سازی بر اساس امتیاز
    sorted_players = sorted(players.items(), key=lambda x: x[1]['score'], reverse=True)
    
    text = "🏆 **جدول امتیازات**\n\n"
    for i, (user_id, data) in enumerate(sorted_players[:10], 1):
        text += f"{i}. {data['name']}: {data['score']} امتیاز\n"
        text += f"   🏅 برد: {data['wins']} | باخت: {data['losses']}\n\n"
    
    await query.edit_message_text(text, parse_mode='Markdown')

# ========== راهنما ==========
async def help_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    await query.edit_message_text(
        "📋 **راهنمای بازی**\n\n"
        "🎯 **هدف:**\n"
        "شهر خود را در برابر موشک‌ها دفاع کن!\n\n"
        "🎮 **قوانین:**\n"
        "• هر موشک = ۱۰ امتیاز\n"
        "• هر موشک منهدم‌شده = ۵ امتیاز\n"
        "• برخورد به شهر = -۲۰ امتیاز\n"
        "• سطح دفاع ۱ تا ۵ متغیر است\n\n"
        "💰 **شرط‌بندی:**\n"
        "• روی نتیجه هر دور شرط ببند\n"
        "• برد = ۲ برابر شرط\n"
        "• باخت = از دست دادن شرط\n\n"
        "👑 **مدیریت:**\n"
        "مالک می‌تونه:\n"
        "• تنظیمات بازی رو تغییر بده\n"
        "• امتیاز کاربران رو مدیریت کنه",
        parse_mode='Markdown'
    )

# ========== پنل مدیریت (فقط مالک) ==========
async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.from_user.id != OWNER_ID:
        await update.message.reply_text("⛔ شما دسترسی ندارید.")
        return
    
    game = load_game()
    keyboard = [
        [InlineKeyboardButton("📊 آمار کلی", callback_data='admin_stats')],
        [InlineKeyboardButton("💰 تنظیم شرط‌ها", callback_data='admin_bet_settings')],
        [InlineKeyboardButton("🎯 تغییر سطح دفاع", callback_data='admin_defense')],
        [InlineKeyboardButton("🔄 ریست بازی", callback_data='admin_reset')],
    ]
    
    await update.message.reply_text(
        "🔐 **پنل مدیریت**\n\n"
        f"👥 کاربران: {len(game['players'])}\n"
        f"🎯 تنظیمات: {game['settings']}\n\n"
        "انتخاب کن:",
        reply_markup=InlineKeyboardMarkup(keyboard)
    )

# ========== ریست بازی ==========
async def admin_reset(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    if query.from_user.id != OWNER_ID:
        await query.edit_message_text("⛔ شما دسترسی ندارید.")
        return
    
    game = load_game()
    game['players'] = {}
    save_game(game)
    
    await query.edit_message_text("✅ بازی با موفقیت ریست شد!")

# ========== بازگشت ==========
async def back(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    await start(update, context)

# ========== اجرا ==========
def main():
    app = Application.builder().token(TOKEN).build()
    
    # دستورات اصلی
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CommandHandler("admin", admin_panel))
    
    # دکمه‌ها
    app.add_handler(CallbackQueryHandler(start_game, pattern='start_game'))
    app.add_handler(CallbackQueryHandler(defend, pattern='defend'))
    app.add_handler(CallbackQueryHandler(surrender, pattern='surrender'))
    app.add_handler(CallbackQueryHandler(bet, pattern='bet'))
    app.add_handler(CallbackQueryHandler(place_bet, pattern='bet_'))
    app.add_handler(CallbackQueryHandler(show_scores, pattern='scores'))
    app.add_handler(CallbackQueryHandler(help_menu, pattern='help'))
    app.add_handler(CallbackQueryHandler(back, pattern='back'))
    
    # دکمه‌های مدیریت
    app.add_handler(CallbackQueryHandler(admin_reset, pattern='admin_reset'))
    app.add_handler(CallbackQueryHandler(admin_panel, pattern='admin_'))
    
    print("🎯 ربات پدافند موشکی روشن شد!")
    app.run_polling()

if __name__ == "__main__":
    main()