import os
import sqlite3
import random
import time
from datetime import datetime, timedelta
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler, Filters

# ================== تنظیمات ==================
BOT_TOKEN = os.environ.get("BOT_TOKEN", "8656589247:AAHyCBITAhjiMal6url8cHMZriAKzQ_lrL0")
ADMINS = [7945871034]
DB_NAME = 'hopuyi.db'
COOLDOWN_SECONDS = 240  # ۴ دقیقه

# ================== دیتابیس ==================
def get_db():
    conn = sqlite3.connect(DB_NAME, check_same_thread=False)
    conn.row_factory = sqlite3.Row
    return conn

def init_db():
    conn = get_db()
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS users (
        user_id INTEGER PRIMARY KEY,
        username TEXT,
        first_name TEXT DEFAULT 'دوست',
        hops INTEGER DEFAULT 0,
        points INTEGER DEFAULT 0,
        coins INTEGER DEFAULT 0,
        bank INTEGER DEFAULT 0,
        bank_time TEXT,
        streak INTEGER DEFAULT 0,
        best_streak INTEGER DEFAULT 0,
        last_hop TEXT,
        league TEXT DEFAULT 'برنز',
        dogs_count INTEGER DEFAULT 0,
        is_banned INTEGER DEFAULT 0,
        join_date TEXT,
        last_active TEXT,
        referral_code TEXT,
        total_referrals INTEGER DEFAULT 0,
        god_mode INTEGER DEFAULT 0
    )''')
    c.execute('''CREATE TABLE IF NOT EXISTS dogs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        dog_type TEXT,
        points_per_hour INTEGER,
        capacity INTEGER,
        collected INTEGER DEFAULT 0,
        last_collect TEXT,
        expires TEXT,
        is_active INTEGER DEFAULT 1
    )''')
    c.execute('''CREATE TABLE IF NOT EXISTS bones (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        bone_type TEXT,
        count INTEGER DEFAULT 1
    )''')
    c.execute('''CREATE TABLE IF NOT EXISTS admin_logs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        admin_id INTEGER,
        action TEXT,
        target_user INTEGER,
        details TEXT,
        time TEXT
    )''')
    conn.commit()
    conn.close()

init_db()

# ================== توابع کمکی ==================
def get_user(user_id):
    try:
        conn = get_db()
        c = conn.cursor()
        c.execute('SELECT * FROM users WHERE user_id = ?', (user_id,))
        user = c.fetchone()
        conn.close()
        return dict(user) if user else None
    except:
        return None

def create_user(user_id, username=None, first_name='دوست'):
    try:
        conn = get_db()
        c = conn.cursor()
        ref_code = f"ref_{user_id}{random.randint(1000, 9999)}"
        now = datetime.now().isoformat()
        c.execute('''INSERT INTO users (user_id, username, first_name, join_date, referral_code, last_active) 
                     VALUES (?, ?, ?, ?, ?, ?)''',
                  (user_id, username, first_name, now, ref_code, now))
        conn.commit()
        conn.close()
        return True
    except:
        return False

def update_user(user_id, **kwargs):
    try:
        conn = get_db()
        c = conn.cursor()
        for key, value in kwargs.items():
            c.execute(f'UPDATE users SET {key} = ? WHERE user_id = ?', (value, user_id))
        conn.commit()
        conn.close()
    except:
        pass

def is_admin(user_id):
    return user_id in ADMINS

def is_banned(user_id):
    user = get_user(user_id)
    return user.get('is_banned', 0) == 1 if user else False

def log_admin(admin_id, action, target_user=None, details=''):
    try:
        conn = get_db()
        c = conn.cursor()
        now = datetime.now().isoformat()
        c.execute('INSERT INTO admin_logs (admin_id, action, target_user, details, time) VALUES (?, ?, ?, ?, ?)',
                  (admin_id, action, target_user, details, now))
        conn.commit()
        conn.close()
    except:
        pass

def get_all_users():
    try:
        conn = get_db()
        c = conn.cursor()
        c.execute('SELECT * FROM users ORDER BY points DESC')
        users = c.fetchall()
        conn.close()
        return [dict(u) for u in users]
    except:
        return []

def get_user_by_username(username):
    try:
        conn = get_db()
        c = conn.cursor()
        c.execute('SELECT user_id FROM users WHERE username = ?', (username.replace('@', ''),))
        result = c.fetchone()
        conn.close()
        return result[0] if result else None
    except:
        return None

def get_league(points):
    if points < 500:
        return 'برنز'
    elif points < 2000:
        return 'نقره'
    elif points < 5000:
        return 'طلا'
    elif points < 10000:
        return 'الماس'
    else:
        return 'افسانه'

# ================== دیتای بازی ==================
BONE_PRICES = {
    'normal': 100,
    'meaty': 500,
    'golden': 2000,
    'diamond': 10000,
    'legendary': 50000,
}

BONE_NAMES = {
    'normal': '🦴 معمولی',
    'meaty': '🍖 گوشتی',
    'golden': '🥇 طلایی',
    'diamond': '💎 الماسی',
    'legendary': '👑 افسانه‌ای',
}

DOG_DATA = {
    'puppy': {'name': '🐕 توله‌سگ', 'prod': 2, 'cap': 50, 'bone': 'normal', 'price': 1},
    'guard': {'name': '🐕‍🦺 نگهبان', 'prod': 5, 'cap': 100, 'bone': 'normal', 'price': 2},
    'husky': {'name': '🦊 هاسکی', 'prod': 15, 'cap': 300, 'bone': 'meaty', 'price': 1},
    'german': {'name': '🐺 ژرمن', 'prod': 35, 'cap': 700, 'bone': 'meaty', 'price': 2},
    'golden': {'name': '🦮 گلدن', 'prod': 80, 'cap': 1500, 'bone': 'golden', 'price': 1},
    'wolf': {'name': '🐺 گرگ', 'prod': 500, 'cap': 8000, 'bone': 'diamond', 'price': 1},
    'legend': {'name': '🐉 افسانه‌ای', 'prod': 3000, 'cap': 50000, 'bone': 'legendary', 'price': 1},
}

# ================== تابع هاپ ==================
def hop_action(user_id):
    if is_banned(user_id):
        return "🚫 شما از ربات بن شدید!"
    
    user = get_user(user_id)
    if not user:
        create_user(user_id)
        user = get_user(user_id)
    
    # بررسی کول‌داون
    last = user.get('last_hop')
    if last:
        try:
            last_time = datetime.fromisoformat(last)
            elapsed = (datetime.now() - last_time).total_seconds()
            if elapsed < COOLDOWN_SECONDS:
                remaining = COOLDOWN_SECONDS - int(elapsed)
                minutes = remaining // 60
                seconds = remaining % 60
                if minutes > 0:
                    return f"⏳ {minutes} دقیقه و {seconds} ثانیه دیگه صبر کن!"
                else:
                    return f"⏳ {seconds} ثانیه دیگه صبر کن!"
        except:
            pass
    
    # محاسبه پوینت
    if is_admin(user_id) and user.get('god_mode', 0) == 1:
        points = 1000
        bonus_text = "👑 "
        update_user(user_id, league='خدا')
    elif is_admin(user_id):
        points = 100
        bonus_text = "👑 "
    else:
        streak = user.get('streak', 0) + 1
        points = 1 + (streak // 5)
        if streak > user.get('best_streak', 0):
            update_user(user_id, best_streak=streak)
        update_user(user_id, streak=streak)
        bonus_text = ""
    
    new_hops = user.get('hops', 0) + 1
    new_points = user.get('points', 0) + points
    now = datetime.now().isoformat()
    update_user(user_id, hops=new_hops, points=new_points, last_hop=now, last_active=now)
    
    if not (is_admin(user_id) and user.get('god_mode', 0) == 1):
        league = get_league(new_points)
        update_user(user_id, league=league)
    
    cooldown_minutes = COOLDOWN_SECONDS // 60
    
    return (f"{bonus_text}🐶 +{points} هاپ‌ها‌پ گرفتی!\n"
            f"💰 هاپ‌هاپ هات : {new_hops} 🪙\n"
            f"⏳ {cooldown_minutes} دقیقه دیگه میتونی دوباره هاپ‌هاپ کنی")

# ================== منوی اصلی ==================
def get_main_menu(user_id):
    keyboard = [
        [InlineKeyboardButton("🔄 هاپ بزن!", callback_data="hop")],
        [InlineKeyboardButton("🦴 فروشگاه استخون", callback_data="buy_bone")],
        [InlineKeyboardButton("🐕 سگ‌های من", callback_data="my_dogs")],
        [InlineKeyboardButton("🏪 خرید سگ", callback_data="buy_dog")],
        [InlineKeyboardButton("🏦 بانک", callback_data="bank")],
        [InlineKeyboardButton("📊 آمار من", callback_data="stats")],
        [InlineKeyboardButton("🎁 دعوت دوستان", callback_data="referral")],
        [InlineKeyboardButton("🏆 رتبه‌بندی", callback_data="leaderboard")],
    ]
    if is_admin(user_id):
        keyboard.append([InlineKeyboardButton("👑 پنل ادمین", callback_data="admin")])
    return InlineKeyboardMarkup(keyboard)

# ================== دستورات اصلی ==================
def start(update, context):
    try:
        user_id = update.effective_user.id
        username = update.effective_user.username
        first_name = update.effective_user.first_name or 'دوست'
        
        # بررسی کد دعوت
        if context.args and context.args[0].startswith('ref_'):
            ref_code = context.args[0]
            conn = get_db()
            c = conn.cursor()
            c.execute('SELECT user_id FROM users WHERE referral_code = ?', (ref_code,))
            referrer = c.fetchone()
            conn.close()
            if referrer and referrer['user_id'] != user_id:
                referrer_user = get_user(referrer['user_id'])
                if referrer_user:
                    update_user(referrer['user_id'],
                              total_referrals=referrer_user.get('total_referrals', 0) + 1,
                              points=referrer_user.get('points', 0) + 50)
        
        user = get_user(user_id)
        if not user:
            create_user(user_id, username, first_name)
            user = get_user(user_id)
        
        if user.get('is_banned', 0) == 1:
            update.message.reply_text("🚫 شما از ربات بن شده‌اید!")
            return
        
        update_user(user_id, last_active=datetime.now().isoformat())
        
        welcome_text = (
            f"🎉 سلام {first_name}! به ربات هاپویی خوش اومدی! 🐶\n\n"
            f"📊 وضعیت:\n"
            f"🔄 هاپ: {user.get('hops', 0)}\n"
            f"⭐ پوینت: {user.get('points', 0)}\n"
            f"💰 سکه: {user.get('coins', 0)}\n"
            f"🏅 لیگ: {user.get('league', 'برنز')}\n"
            f"🐕 سگ‌ها: {user.get('dogs_count', 0)}\n\n"
            f"👇 گزینه‌ات رو انتخاب کن:"
        )
        update.message.reply_text(welcome_text, reply_markup=get_main_menu(user_id))
    except Exception as e:
        print(f"Error start: {e}")

def help_command(update, context):
    user_id = update.effective_user.id
    is_admin_user = is_admin(user_id)
    text = (
        "📚 **راهنمای ربات هاپویی** 🐶\n\n"
        "🔹 **دستورات عمومی:**\n"
        "• /start - شروع ربات\n"
        "• /help - نمایش راهنما\n"
        "• /stats - آمار شما\n"
        "• /leaderboard - رتبه‌بندی\n"
        "• هاپ - هاپ زدن (تایپ کن)\n\n"
        "🎮 **بخش‌ها:**\n"
        "• 🦴 استخون - خرید با هاپ\n"
        "• 🐕 سگ‌ها - تولید پوینت خودکار\n"
        "• 🏦 بانک - سرمایه‌گذاری با سود\n"
        "• 🎁 دعوت - ۵۰ پوینت جایزه\n\n"
        "💡 **نحوه بازی:**\n"
        "۱. هاپ بزن → هاپ جمع کن\n"
        "۲. استخون بخر → با هاپ\n"
        "۳. سگ بگیر → با استخون\n"
        "۴. سگ پوینت می‌سازه → خودکار\n"
    )
    if is_admin_user:
        text += (
            "\n👑 **دستورات ادمین:**\n"
            "• /godmode - حالت خدا\n"
            "• /gift @user عدد - هدیه پوینت\n"
            "• /giftall عدد - هدیه همگانی\n"
            "• /ban @user - بن کاربر\n"
            "• /unban @user - آنبن کاربر\n"
            "• /broadcast پیام - پیام همگانی\n"
        )
    update.message.reply_text(text)

def stats_command(update, context):
    try:
        user_id = update.effective_user.id
        user = get_user(user_id)
        if not user:
            update.message.reply_text("❌ اول /start کن!")
            return
        update.message.reply_text(
            f"📊 آمار {user.get('first_name', 'دوست')}:\n\n"
            f"🔄 تعداد هاپ: {user.get('hops', 0):,}\n"
            f"⭐ پوینت: {user.get('points', 0):,}\n"
            f"💰 سکه: {user.get('coins', 0):,}\n"
            f"🏦 موجودی بانک: {user.get('bank', 0):,}\n"
            f"🔥 بیشترین استریک: {user.get('best_streak', 0)}\n"
            f"🏅 لیگ: {user.get('league', 'برنز')}\n"
            f"🐕 سگ‌ها: {user.get('dogs_count', 0)}\n"
            f"👥 دعوت‌ها: {user.get('total_referrals', 0)}"
        )
    except Exception as e:
        print(f"Error stats: {e}")

def leaderboard_command(update, context):
    try:
        users = get_all_users()
        top_10 = sorted(users, key=lambda x: x.get('points', 0), reverse=True)[:10]
        text = "🏆 **رتبه‌بندی بازیکنان** 🏆\n\n"
        for i, user in enumerate(top_10, 1):
            medal = {1: '🥇', 2: '🥈', 3: '🥉'}.get(i, f'{i}.')
            name = user.get('first_name', 'ناشناس')
            points = user.get('points', 0)
            league = user.get('league', 'برنز')
            text += f"{medal} {name}: {points:,} پوینت | {league}\n"
        update.message.reply_text(text)
    except Exception as e:
        print(f"Error leaderboard: {e}")

def referral_command(update, context):
    try:
        user_id = update.effective_user.id
        user = get_user(user_id)
        if not user:
            update.message.reply_text("❌ اول /start کن!")
            return
        ref_code = user.get('referral_code', '')
        bot_username = context.bot.username
        text = (
            f"🎁 **دعوت دوستان**\n\n"
            f"با دعوت دوستانت ۵۰ پوینت جایزه بگیر!\n\n"
            f"🔗 لینک دعوت تو:\n"
            f"`https://t.me/{bot_username}?start={ref_code}`\n\n"
            f"👥 تعداد دعوت‌ها: {user.get('total_referrals', 0)}\n"
            f"🎁 پاداش دریافتی: {user.get('total_referrals', 0) * 50} پوینت"
        )
        update.message.reply_text(text, parse_mode='Markdown')
    except Exception as e:
        print(f"Error referral: {e}")

# ================== هندلر متن ==================
def text_handler(update, context):
    try:
        text = update.message.text.lower()
        user_id = update.effective_user.id
        
        if text in ['هاپ', 'hop']:
            result = hop_action(user_id)
            update.message.reply_text(result, reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔄 دوباره هاپ!", callback_data="hop")],
                [InlineKeyboardButton("🏠 منوی اصلی", callback_data="back")]
            ]))
        elif text in ['شروع', 'start']:
            start(update, context)
        elif text in ['راهنما', 'help']:
            help_command(update, context)
        elif text in ['آمار', 'stats']:
            stats_command(update, context)
        elif text in ['دعوت', 'referral']:
            referral_command(update, context)
        elif text in ['برترین‌ها', 'leaderboard']:
            leaderboard_command(update, context)
    except Exception as e:
        print(f"Error text_handler: {e}")

# ================== دستورات ادمین ==================
def godmode_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        user = get_user(user_id)
        current_god = user.get('god_mode', 0)
        new_god = 1 if current_god == 0 else 0
        update_user(user_id, god_mode=new_god)
        status = "فعال ✅" if new_god == 1 else "غیرفعال ❌"
        update.message.reply_text(f"👑 حالت خدا: {status}")
        log_admin(user_id, 'godmode_toggle', user_id, f'Set to {new_god}')
    except Exception as e:
        print(f"Error godmode: {e}")

def gift_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        if len(context.args) < 2:
            update.message.reply_text("❌ استفاده: /gift @username عدد")
            return
        target_username = context.args[0].replace('@', '')
        try:
            amount = int(context.args[1])
        except:
            update.message.reply_text("❌ مقدار باید عدد باشه!")
            return
        target_id = get_user_by_username(target_username)
        if not target_id:
            update.message.reply_text("❌ کاربر پیدا نشد!")
            return
        target_user = get_user(target_id)
        if not target_user:
            update.message.reply_text("❌ کاربر وجود نداره!")
            return
        new_points = target_user.get('points', 0) + amount
        update_user(target_id, points=new_points)
        update.message.reply_text(f"✅ {amount} پوینت به @{target_username} هدیه داده شد!")
        try:
            context.bot.send_message(target_id, f"🎁 {amount} پوینت هدیه گرفتی از ادمین!")
        except:
            pass
        log_admin(user_id, 'gift', target_id, f'{amount} points')
    except Exception as e:
        print(f"Error gift: {e}")

def giftall_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        if not context.args:
            update.message.reply_text("❌ استفاده: /giftall عدد")
            return
        try:
            amount = int(context.args[0])
        except:
            update.message.reply_text("❌ مقدار باید عدد باشه!")
            return
        users = get_all_users()
        count = 0
        for user in users:
            try:
                new_points = user.get('points', 0) + amount
                update_user(user['user_id'], points=new_points)
                count += 1
            except:
                pass
        update.message.reply_text(f"✅ {amount} پوینت به {count} کاربر هدیه داده شد!")
        log_admin(user_id, 'giftall', None, f'{amount} points to all')
    except Exception as e:
        print(f"Error giftall: {e}")

def ban_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        if not context.args:
            update.message.reply_text("❌ استفاده: /ban @username")
            return
        target_username = context.args[0].replace('@', '')
        target_id = get_user_by_username(target_username)
        if not target_id:
            update.message.reply_text("❌ کاربر پیدا نشد!")
            return
        if is_admin(target_id):
            update.message.reply_text("❌ نمیشه ادمین رو بن کرد!")
            return
        update_user(target_id, is_banned=1)
        update.message.reply_text(f"🚫 کاربر @{target_username} بن شد!")
        log_admin(user_id, 'ban', target_id, 'User banned')
    except Exception as e:
        print(f"Error ban: {e}")

def unban_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        if not context.args:
            update.message.reply_text("❌ استفاده: /unban @username")
            return
        target_username = context.args[0].replace('@', '')
        target_id = get_user_by_username(target_username)
        if not target_id:
            update.message.reply_text("❌ کاربر پیدا نشد!")
            return
        update_user(target_id, is_banned=0)
        update.message.reply_text(f"✅ کاربر @{target_username} آنبن شد!")
        log_admin(user_id, 'unban', target_id, 'User unbanned')
    except Exception as e:
        print(f"Error unban: {e}")

def broadcast_command(update, context):
    try:
        user_id = update.effective_user.id
        if not is_admin(user_id):
            update.message.reply_text("❌ تو ادمین نیستی!")
            return
        if not context.args:
            update.message.reply_text("❌ استفاده: /broadcast پیام")
            return
        message = ' '.join(context.args)
        users = get_all_users()
        success = 0
        failed = 0
        for user in users:
            try:
                context.bot.send_message(user['user_id'], f"📢 پیام همگانی:\n\n{message}")
                success += 1
            except:
                failed += 1
        update.message.reply_text(f"✅ پیام به {success} کاربر ارسال شد!\n❌ خطا: {failed}")
        log_admin(user_id, 'broadcast', None, message)
    except Exception as e:
        print(f"Error broadcast: {e}")

# ================== هندلر دکمه‌ها ==================
def button_handler(update, context):
    try:
        query = update.callback_query
        query.answer()
        user_id = query.from_user.id
        data = query.data
        
        if is_banned(user_id):
            query.edit_message_text("🚫 شما از ربات بن شده‌اید!")
            return
        
        # هاپ
        if data == "hop":
            result = hop_action(user_id)
            query.edit_message_text(
                result,
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("🔄 دوباره هاپ!", callback_data="hop")],
                    [InlineKeyboardButton("🏠 منوی اصلی", callback_data="back")]
                ])
            )
        
        # فروشگاه استخون
        elif data == "buy_bone":
            user = get_user(user_id)
            keyboard = []
            for key, price in BONE_PRICES.items():
                name = BONE_NAMES.get(key, key)
                keyboard.append([InlineKeyboardButton(f"{name} - {price} هاپ", callback_data=f"bone_{key}")])
            keyboard.append([InlineKeyboardButton("🔙 برگشت", callback_data="back")])
            query.edit_message_text(
                f"🦴 **فروشگاه استخون**\n\n"
                f"💰 هاپ‌های تو: {user.get('hops', 0):,}\n\n"
                f"استخون مورد نظر رو انتخاب کن:",
                reply_markup=InlineKeyboardMarkup(keyboard)
            )
        
        # خرید استخون
        elif data.startswith("bone_"):
            bone_type = data.split("_")[1]
            price = BONE_PRICES.get(bone_type, 0)
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ اول /start کن!")
                return
            if user.get('hops', 0) < price:
                query.edit_message_text(f"❌ هاپ کافی نداری!\nنیاز: {price} | داری: {user.get('hops', 0)}")
                return
            update_user(user_id, hops=user.get('hops', 0) - price)
            conn = get_db()
            c = conn.cursor()
            c.execute('INSERT INTO bones (user_id, bone_type) VALUES (?, ?)', (user_id, bone_type))
            conn.commit()
            conn.close()
            query.edit_message_text(
                f"✅ استخون {BONE_NAMES.get(bone_type, bone_type)} خریداری شد! 🎉\n\n"
                f"حالا برو به 🏪 خرید سگ و با استخونت سگ بگیر!",
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("🏪 خرید سگ", callback_data="buy_dog")],
                    [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                ])
            )
        
        # خرید سگ
        elif data == "buy_dog":
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ اول /start کن!")
                return
            
            # گرفتن موجودی استخون‌ها
            conn = get_db()
            c = conn.cursor()
            c.execute('SELECT bone_type, COUNT(*) as count FROM bones WHERE user_id = ? GROUP BY bone_type', (user_id,))
            user_bones = {row['bone_type']: row['count'] for row in c.fetchall()}
            conn.close()
            
            keyboard = []
            for dog_key, dog_info in DOG_DATA.items():
                needed_bone = dog_info['bone']
                needed_count = dog_info['price']
                has_bones = user_bones.get(needed_bone, 0)
                
                if has_bones >= needed_count:
                    status = "✅"
                else:
                    status = "❌"
                
                keyboard.append([InlineKeyboardButton(
                    f"{status} {dog_info['name']} ({needed_bones_msg(needed_bone, needed_count)})",
                    callback_data=f"dog_{dog_key}"
                )])
            
            keyboard.append([InlineKeyboardButton("🔙 برگشت", callback_data="back")])
            
            text = "🏪 **خرید سگ**\n\n"
            text += "📦 موجودی استخون‌ها:\n"
            for bone, name in BONE_NAMES.items():
                count = user_bones.get(bone, 0)
                text += f"{name}: {count} عدد\n"
            text += "\nسگ مورد نظر رو انتخاب کن:"
            
            query.edit_message_text(text, reply_markup=InlineKeyboardMarkup(keyboard))
        
        # خرید سگ خاص
        elif data.startswith("dog_"):
            dog_type = data.split("_")[1]
            dog_info = DOG_DATA.get(dog_type)
            
            if not dog_info:
                query.edit_message_text("❌ سگ نامعتبر!")
                return
            
            needed_bone = dog_info['bone']
            needed_count = dog_info['price']
            
            conn = get_db()
            c = conn.cursor()
            c.execute('SELECT COUNT(*) as count FROM bones WHERE user_id = ? AND bone_type = ?', (user_id, needed_bone))
            bone_count = c.fetchone()['count']
            
            if bone_count < needed_count:
                query.edit_message_text(
                    f"❌ استخون کافی نداری!\n"
                    f"نیاز: {needed_count} {BONE_NAMES[needed_bone]}\n"
                    f"داری: {bone_count} عدد"
                )
                conn.close()
                return
            
            # کم کردن استخون
            for i in range(needed_count):
                c.execute('DELETE FROM bones WHERE id = (SELECT id FROM bones WHERE user_id = ? AND bone_type = ? LIMIT 1)', 
                         (user_id, needed_bone))
            
            # اضافه کردن سگ
            now = datetime.now().isoformat()
            c.execute('''INSERT INTO dogs (user_id, dog_type, points_per_hour, capacity, last_collect) 
                        VALUES (?, ?, ?, ?, ?)''',
                     (user_id, dog_type, dog_info['prod'], dog_info['cap'], now))
            
            # آپدیت تعداد سگ‌ها
            user = get_user(user_id)
            update_user(user_id, dogs_count=user.get('dogs_count', 0) + 1)
            
            conn.commit()
            conn.close()
            
            query.edit_message_text(
                f"🎉 مبارکه! {dog_info['name']} رو خریدی!\n"
                f"⚡ تولید: {dog_info['prod']} پوینت/ساعت\n"
                f"📦 ظرفیت: {dog_info['cap']} پوینت\n\n"
                f"سگت خودکار پوینت تولید می‌کنه!",
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("🐕 سگ‌های من", callback_data="my_dogs")],
                    [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                ])
            )
        
        # سگ‌های من
        elif data == "my_dogs":
            conn = get_db()
            c = conn.cursor()
            c.execute('SELECT * FROM dogs WHERE user_id = ? AND is_active = 1', (user_id,))
            dogs = c.fetchall()
            conn.close()
            
            if not dogs:
                query.edit_message_text(
                    "🐕 هنوز سگی نداری!\n\n"
                    "اول 🦴 استخون بخر بعد بیا 🏪 سگ بگیر!",
                    reply_markup=InlineKeyboardMarkup([
                        [InlineKeyboardButton("🦴 خرید استخون", callback_data="buy_bone")],
                        [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                    ])
                )
                return
            
            text = "🐕 **سگ‌های تو:**\n\n"
            total_prod = 0
            total_collected = 0
            
            for dog in dogs:
                dog = dict(dog)
                dog_type = dog.get('dog_type', '')
                info = DOG_DATA.get(dog_type, {})
                name = info.get('name', dog_type)
                prod = dog.get('points_per_hour', 0)
                collected = dog.get('collected', 0)
                
                text += f"{name} | ⚡ {prod}/ساعت | 💰 جمع‌شده: {collected}\n"
                total_prod += prod
                total_collected += collected
            
            text += f"\n⚡ مجموع تولید: {total_prod} پوینت/ساعت"
            text += f"\n💰 کل جمع‌شده: {total_collected} پوینت"
            text += f"\n📅 روزانه: {total_prod * 24:,} پوینت"
            
            query.edit_message_text(
                text,
                reply_markup=InlineKeyboardMarkup([
                    [InlineKeyboardButton("🔄 جمع‌آوری پوینت", callback_data="collect_dogs")],
                    [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                ])
            )
        
        # جمع‌آوری پوینت سگ‌ها
        elif data == "collect_dogs":
            conn = get_db()
            c = conn.cursor()
            c.execute('SELECT * FROM dogs WHERE user_id = ? AND is_active = 1', (user_id,))
            dogs = c.fetchall()
            
            total_collected = 0
            now = datetime.now().isoformat()
            
            for dog in dogs:
                dog = dict(dog)
                last_collect = dog.get('last_collect')
                
                if last_collect:
                    try:
                        last_time = datetime.fromisoformat(last_collect)
                        hours_passed = (datetime.now() - last_time).total_seconds() / 3600
                        produced = int(dog['points_per_hour'] * hours_passed)
                        cap = dog['capacity']
                        
                        if produced > cap:
                            produced = cap
                        
                        if produced > 0:
                            total_collected += produced
                            c.execute('UPDATE dogs SET collected = collected + ?, last_collect = ? WHERE id = ?',
                                     (produced, now, dog['id']))
                    except:
                        pass
            
            conn.commit()
            conn.close()
            
            if total_collected > 0:
                user = get_user(user_id)
                update_user(user_id, points=user.get('points', 0) + total_collected)
                query.edit_message_text(
                    f"✅ {total_collected:,} پوینت از سگ‌هات جمع‌آوری شد! 🎉\n"
                    f"⭐ پوینت جدید: {user.get('points', 0) + total_collected:,}",
                    reply_markup=InlineKeyboardMarkup([
                        [InlineKeyboardButton("🐕 سگ‌های من", callback_data="my_dogs")],
                        [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                    ])
                )
            else:
                query.edit_message_text(
                    "⏳ هنوز پوینتی تولید نشده! یه کم صبر کن.",
                    reply_markup=InlineKeyboardMarkup([
                        [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
                    ])
                )
        
        # بانک
        elif data == "bank":
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ اول /start کن!")
                return
            
            text = (
                f"🏦 **بانک پوینت**\n\n"
                f"💰 موجودی: {user.get('bank', 0):,} پوینت\n"
                f"📈 سود روزانه: ۱۰٪\n"
                f"⭐ قابل واریز: {user.get('points', 0):,} پوینت"
            )
            keyboard = [
                [InlineKeyboardButton("💰 واریز همه", callback_data="bank_deposit")],
                [InlineKeyboardButton("📈 دریافت سود", callback_data="bank_interest")],
                [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
            ]
            query.edit_message_text(text, reply_markup=InlineKeyboardMarkup(keyboard))
        
        # واریز به بانک
        elif data == "bank_deposit":
            user = get_user(user_id)
            if user.get('points', 0) < 100:
                query.edit_message_text("❌ حداقل واریز ۱۰۰ پوینته!")
                return
            amount = user.get('points', 0)
            new_bank = user.get('bank', 0) + amount
            update_user(user_id, points=0, bank=new_bank, bank_time=datetime.now().isoformat())
            query.edit_message_text(
                f"✅ {amount:,} پوینت به بانک واریز شد!\n💰 موجودی بانک: {new_bank:,}"
            )
        
        # سود بانک
        elif data == "bank_interest":
            user = get_user(user_id)
            bank = user.get('bank', 0)
            if bank == 0:
                query.edit_message_text("❌ موجودی بانک صفره!")
                return
            interest = int(bank * 0.1)
            new_bank = bank + interest
            update_user(user_id, bank=new_bank, bank_time=datetime.now().isoformat())
            query.edit_message_text(
                f"📈 {interest:,} پوینت سود گرفتی!\n💰 موجودی جدید: {new_bank:,}"
            )
        
        # آمار
        elif data == "stats":
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ اول /start کن!")
                return
            query.edit_message_text(
                f"📊 **آمار {user.get('first_name', 'دوست')}**\n\n"
                f"🔄 هاپ: {user.get('hops', 0):,}\n"
                f"⭐ پوینت: {user.get('points', 0):,}\n"
                f"💰 سکه: {user.get('coins', 0):,}\n"
                f"🏦 بانک: {user.get('bank', 0):,}\n"
                f"🔥 بهترین استریک: {user.get('best_streak', 0)}\n"
                f"🏅 لیگ: {user.get('league', 'برنز')}\n"
                f"🐕 سگ‌ها: {user.get('dogs_count', 0)}",
                reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 برگشت", callback_data="back")]])
            )
        
        # دعوت
        elif data == "referral":
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ اول /start کن!")
                return
            ref_code = user.get('referral_code', '')
            bot_username = context.bot.username
            text = (
                f"🎁 **دعوت دوستان**\n\n"
                f"با دعوت دوستانت ۵۰ پوینت جایزه بگیر!\n\n"
                f"🔗 لینک دعوت تو:\n"
                f"`https://t.me/{bot_username}?start={ref_code}`\n\n"
                f"👥 دعوت‌ها: {user.get('total_referrals', 0)}\n"
                f"🎁 پاداش: {user.get('total_referrals', 0) * 50} پوینت"
            )
            query.edit_message_text(text, parse_mode='Markdown', reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
            ]))
        
        # رتبه‌بندی
        elif data == "leaderboard":
            users = get_all_users()
            top_10 = sorted(users, key=lambda x: x.get('points', 0), reverse=True)[:10]
            text = "🏆 **رتبه‌بندی** 🏆\n\n"
            for i, user in enumerate(top_10, 1):
                medal = {1: '🥇', 2: '🥈', 3: '🥉'}.get(i, f'{i}.')
                name = user.get('first_name', 'ناشناس')
                points = user.get('points', 0)
                text += f"{medal} {name}: {points:,} پوینت\n"
            query.edit_message_text(text, reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
            ]))
        
        # پنل ادمین
        elif data == "admin":
            if not is_admin(user_id):
                query.edit_message_text("❌ تو ادمین نیستی!")
                return
            keyboard = [
                [InlineKeyboardButton("📊 آمار کل", callback_data="admin_stats")],
                [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
            ]
            query.edit_message_text("👑 **پنل ادمین**", reply_markup=InlineKeyboardMarkup(keyboard))
        
        # آمار ادمین
        elif data == "admin_stats":
            users = get_all_users()
            total_hops = sum(u.get('hops', 0) for u in users)
            total_points = sum(u.get('points', 0) for u in users)
            text = (
                f"📊 **آمار کل**\n\n"
                f"👥 کاربران: {len(users)}\n"
                f"🔄 کل هاپ: {total_hops:,}\n"
                f"⭐ کل پوینت: {total_points:,}"
            )
            query.edit_message_text(text, reply_markup=InlineKeyboardMarkup([
                [InlineKeyboardButton("🔙 برگشت", callback_data="back")]
            ]))
        
        # برگشت به منو
        elif data == "back":
            user = get_user(user_id)
            if not user:
                query.edit_message_text("❌ /start رو بزن")
                return
            query.edit_message_text(
                f"🏠 منوی اصلی\n\n🔄 هاپ: {user.get('hops', 0):,}\n⭐ پوینت: {user.get('points', 0):,}",
                reply_markup=get_main_menu(user_id)
            )
    
    except Exception as e:
        print(f"Error button: {e}")
        try:
            query.edit_message_text("❌ خطا! /start رو بزن")
        except:
            pass

def needed_bones_msg(bone_type, count):
    bone_name = BONE_NAMES.get(bone_type, bone_type)
    return f"{count}×{bone_name}"

# ================== ارور هندلر ==================
def error_handler(update, context):
    print(f"Error: {context.error}")

# ================== تابع اصلی ==================
def main():
    print("🤖 ربات هاپویی در حال راه‌اندازی...")
    updater = Updater(BOT_TOKEN, use_context=True)
    dp = updater.dispatcher
    
    # دستورات عمومی
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help_command))
    dp.add_handler(CommandHandler("stats", stats_command))
    dp.add_handler(CommandHandler("leaderboard", leaderboard_command))
    dp.add_handler(CommandHandler("referral", referral_command))
    
    # دستورات ادمین
    dp.add_handler(CommandHandler("godmode", godmode_command))
    dp.add_handler(CommandHandler("gift", gift_command))
    dp.add_handler(CommandHandler("giftall", giftall_command))
    dp.add_handler(CommandHandler("ban", ban_command))
    dp.add_handler(CommandHandler("unban", unban_command))
    dp.add_handler(CommandHandler("broadcast", broadcast_command))
    
    # هندلر دکمه‌ها و متن
    dp.add_handler(CallbackQueryHandler(button_handler))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command, text_handler))
    dp.add_error_handler(error_handler)
    
    updater.start_polling()
    print("✅ ربات آماده!")
    updater.idle()

if __name__ == '__main__':
    main()