# ============================================================
#  bot.py - بات کامل بله برای همستر کوکی
# ============================================================

import logging
from typing import Optional
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    Application,
    CommandHandler,
    CallbackQueryHandler,
    MessageHandler,
    filters,
    ContextTypes,
)
from telegram.constants import ParseMode

from config import Config
from database import db

# ============================================================
#  تنظیمات لاگ
# ============================================================
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

# ============================================================
#  توابع کمکی
# ============================================================

def get_main_keyboard(user_id: int) -> InlineKeyboardMarkup:
    """دریافت کیبورد اصلی"""
    keyboard = [
        [
            InlineKeyboardButton("🎮 باز کردن بازی", web_app={"url": f"{Config.WEBAPP_URL}?ref={user_id}"})
        ],
        [
            InlineKeyboardButton("👤 پروفایل", callback_data="profile"),
            InlineKeyboardButton("🔗 لینک دعوت", callback_data="referral"),
        ],
        [
            InlineKeyboardButton("🏆 برترین‌ها", callback_data="top_users"),
            InlineKeyboardButton("❓ راهنما", callback_data="help"),
        ]
    ]
    return InlineKeyboardMarkup(keyboard)

def get_referral_keyboard(user_id: int) -> InlineKeyboardMarkup:
    """کیبورد برای لینک دعوت"""
    keyboard = [
        [
            InlineKeyboardButton("📋 کپی لینک", callback_data=f"copy_link_{user_id}"),
            InlineKeyboardButton("📤 اشتراک‌گذاری", callback_data=f"share_link_{user_id}")
        ],
        [
            InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_main")
        ]
    ]
    return InlineKeyboardMarkup(keyboard)

# ============================================================
#  دستور /start
# ============================================================

async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """پردازش دستور /start"""
    user = update.effective_user
    user_id = user.id
    first_name = user.first_name or 'کاربر'
    username = user.username or ''
    
    # استخراج ID دعوت‌کننده از لینک
    referred_by = None
    if context.args:
        ref = context.args[0]
        # بررسی اینکه ref عددی است یا کد دعوت
        if ref.isdigit():
            referred_by = int(ref)
        else:
            # پیدا کردن کاربر با کد دعوت
            referrer = db.get_user_by_code(ref.upper())
            if referrer:
                referred_by = referrer['id']
    
    # بررسی وجود کاربر در دیتابیس
    user_data = db.get_user(user_id)
    
    if not user_data:
        # کاربر جدید
        db.create_user(user_id, first_name, username, referred_by)
        logger.info(f"👤 کاربر جدید: {user_id} - {first_name}")
        
        # اگر توسط کسی دعوت شده، پیام به دعوت‌کننده
        if referred_by:
            referrer = db.get_user(referred_by)
            if referrer:
                await context.bot.send_message(
                    chat_id=referred_by,
                    text=(
                        f"🎉 تبریک!\n\n"
                        f"👤 {first_name} با لینک دعوت شما وارد شد!\n"
                        f"💰 {Config.REFERRAL_REWARD:,} سکه به حساب شما اضافه شد.\n\n"
                        f"📊 تعداد دعوت‌های شما: {referrer['referrals'] + 1}"
                    )
                )
    
    # پیام خوش‌آمدگویی
    user_data = db.get_user(user_id)
    referral_count = user_data['referrals'] if user_data else 0
    
    text = (
        f"🐹 **به همستر کوکی خوش آمدید!**\n\n"
        f"👤 {first_name}\n"
        f"🆔 {user_id}\n\n"
        f"📊 تعداد دعوت‌های شما: {referral_count}\n"
        f"💰 پاداش هر دعوت: {Config.REFERRAL_REWARD:,} سکه\n\n"
        f"🎮 برای شروع بازی روی دکمه زیر کلیک کنید."
    )
    
    await update.message.reply_text(
        text,
        parse_mode=ParseMode.MARKDOWN,
        reply_markup=get_main_keyboard(user_id)
    )

# ============================================================
#  دستور /profile
# ============================================================

async def profile_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """نمایش پروفایل کاربر"""
    user = update.effective_user
    user_id = user.id
    
    user_data = db.get_user(user_id)
    if not user_data:
        await update.message.reply_text(
            "❌ کاربر یافت نشد! لطفاً /start را بفرستید."
        )
        return
    
    # دریافت آمار دعوت‌ها
    stats = db.get_referral_stats(user_id)
    
    text = (
        f"📊 **پروفایل شما**\n\n"
        f"👤 نام: {user_data['first_name']}\n"
        f"🆔 ID: {user_data['id']}\n"
        f"💰 سکه: {user_data['coins']:,}\n"
        f"📈 سود/ساعت: {user_data['profit']:,}\n"
        f"👥 تعداد دعوت: {user_data['referrals']}\n"
        f"📅 دعوت امروز: {stats['today']}\n"
        f"🎁 کل پاداش دعوت: {stats['total_reward']:,} سکه\n"
        f"🔑 کد دعوت: `{user_data['referral_code']}`\n\n"
        f"📅 تاریخ عضویت: {user_data['join_date'][:10]}\n"
        f"🕐 آخرین فعالیت: {user_data['last_active'][:10]}"
    )
    
    await update.message.reply_text(
        text,
        parse_mode=ParseMode.MARKDOWN,
        reply_markup=get_main_keyboard(user_id)
    )

# ============================================================
#  دستور /referral
# ============================================================

async def referral_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """دریافت لینک دعوت"""
    user = update.effective_user
    user_id = user.id
    
    user_data = db.get_user(user_id)
    if not user_data:
        await update.message.reply_text(
            "❌ کاربر یافت نشد! لطفاً /start را بفرستید."
        )
        return
    
    # لینک‌های دعوت
    link_with_id = f"{Config.WEBAPP_URL}?ref={user_id}"
    link_with_code = f"{Config.WEBAPP_URL}?ref={user_data['referral_code']}"
    
    text = (
        f"🔗 **لینک دعوت شما**\n\n"
        f"📱 لینک مستقیم (با ID):\n"
        f"`{link_with_id}`\n\n"
        f"🔑 لینک با کد دعوت:\n"
        f"`{link_with_code}`\n\n"
        f"📊 تعداد دعوت‌های شما: {user_data['referrals']}\n"
        f"💰 پاداش هر دعوت: {Config.REFERRAL_REWARD:,} سکه\n\n"
        f"💡 لینک را برای دوستان خود بفرستید تا وارد بازی شوند!"
    )
    
    await update.message.reply_text(
        text,
        parse_mode=ParseMode.MARKDOWN,
        reply_markup=get_referral_keyboard(user_id)
    )

# ============================================================
#  دستور /top
# ============================================================

async def top_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """نمایش برترین کاربران"""
    top_users = db.get_top_users(10)
    
    if not top_users:
        await update.message.reply_text("❌ هنوز کاربری ثبت نشده است!")
        return
    
    text = "🏆 **برترین کاربران بر اساس سکه**\n\n"
    medals = ["🥇", "🥈", "🥉"]
    
    for i, user in enumerate(top_users):
        medal = medals[i] if i < 3 else f"{i+1}."
        name = user['first_name'][:15]
        coins = user['coins']
        referrals = user['referrals']
        text += f"{medal} {name} — 💰 {coins:,} سکه 👥 {referrals} دعوت\n"
    
    await update.message.reply_text(
        text,
        parse_mode=ParseMode.MARKDOWN,
        reply_markup=get_main_keyboard(update.effective_user.id)
    )

# ============================================================
#  دستور /help
# ============================================================

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """نمایش راهنما"""
    text = (
        f"📖 **راهنمای ربات همستر کوکی**\n\n"
        f"🎮 **دستورات:**\n"
        f"/start - شروع و ورود به بازی\n"
        f"/profile - مشاهده پروفایل\n"
        f"/referral - دریافت لینک دعوت\n"
        f"/top - مشاهده برترین‌ها\n"
        f"/help - راهنما\n\n"
        f"🎯 **سیستم دعوت:**\n"
        f"هر کاربر یک لینک دعوت منحصربه‌فرد دارد.\n"
        f"با هر دعوت، {Config.REFERRAL_REWARD:,} سکه پاداش می‌گیرید.\n\n"
        f"📱 **بازی:**\n"
        f"برای باز کردن مینی‌اپ، روی دکمه 'باز کردن بازی' کلیک کنید."
    )
    
    await update.message.reply_text(
        text,
        parse_mode=ParseMode.MARKDOWN,
        reply_markup=get_main_keyboard(update.effective_user.id)
    )

# ============================================================
#  مدیریت Callback Query
# ============================================================

async def handle_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """پردازش کلیک روی دکمه‌ها"""
    query = update.callback_query
    await query.answer()
    
    user_id = update.effective_user.id
    data = query.data
    
    if data == "profile":
        await profile_command(update, context)
        
    elif data == "referral":
        await referral_command(update, context)
        
    elif data == "top_users":
        await top_command(update, context)
        
    elif data == "help":
        await help_command(update, context)
        
    elif data == "back_to_main":
        await query.edit_message_text(
            "🔙 بازگشت به منوی اصلی",
            reply_markup=get_main_keyboard(user_id)
        )
        
    elif data.startswith("copy_link_"):
        # کپی لینک (در بله با این روش کار می‌کند)
        await query.edit_message_text(
            "📋 لینک دعوت شما:\n\n"
            f"`{Config.WEBAPP_URL}?ref={user_id}`\n\n"
            "💡 لینک را کپی کرده و برای دوستان بفرستید.",
            parse_mode=ParseMode.MARKDOWN,
            reply_markup=get_main_keyboard(user_id)
        )
        
    elif data.startswith("share_link_"):
        # اشتراک‌گذاری لینک
        await query.edit_message_text(
            "📤 لینک دعوت شما:\n\n"
            f"`{Config.WEBAPP_URL}?ref={user_id}`\n\n"
            "💡 لینک را برای دوستان خود بفرستید!",
            parse_mode=ParseMode.MARKDOWN,
            reply_markup=get_main_keyboard(user_id)
        )
    
    else:
        await query.edit_message_text(
            "❓ گزینه نامعتبر",
            reply_markup=get_main_keyboard(user_id)
        )

# ============================================================
#  راه‌اندازی بات
# ============================================================

def main():
    """راه‌اندازی اصلی بات"""
    # ایجاد اپلیکیشن
    application = Application.builder().token(Config.BOT_TOKEN).build()
    
    # ثبت دستورات
    application.add_handler(CommandHandler("start", start_command))
    application.add_handler(CommandHandler("profile", profile_command))
    application.add_handler(CommandHandler("referral", referral_command))
    application.add_handler(CommandHandler("top", top_command))
    application.add_handler(CommandHandler("help", help_command))
    
    # ثبت Callback Query
    application.add_handler(CallbackQueryHandler(handle_callback))
    
    # ثبت Webhook (برای سرور)
    if Config.WEBHOOK_URL:
        application.bot.set_webhook(url=Config.WEBHOOK_URL)
        logger.info(f"✅ Webhook تنظیم شد: {Config.WEBHOOK_URL}")
    
    # اجرا
    logger.info("🚀 بات همستر کوکی راه‌اندازی شد!")
    application.run_polling(allowed_updates=Update.ALL_TYPES)

if __name__ == '__main__':
    main()
