from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ContextTypes
from database import Database
from utils import is_admin, format_user_info, format_users_list, get_video_count
import logging
import json

logger = logging.getLogger(__name__)
db = Database()

async def admin_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """نمایش پنل مدیریت"""
    user_id = update.effective_user.id
    
    if not is_admin(user_id):
        await update.message.reply_text("⛔ شما دسترسی ادمین ندارید.")
        return
    
    keyboard = [
        [InlineKeyboardButton("📋 لیست کاربران", callback_data='admin_list_users')],
        [InlineKeyboardButton("✅ کاربران تکمیل شده", callback_data='admin_completed')],
        [InlineKeyboardButton("📊 آمار", callback_data='admin_stats')],
        [InlineKeyboardButton("🗑️ حذف کاربر", callback_data='admin_delete_user')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    await update.message.reply_text(
        "👑 **پنل مدیریت**\n\n"
        "از دکمه‌های زیر برای مدیریت استفاده کنید:",
        reply_markup=reply_markup,
        parse_mode='Markdown'
    )

async def view_user(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """مشاهده اطلاعات یک کاربر خاص (با دستور)"""
    user_id = update.effective_user.id
    
    if not is_admin(user_id):
        await update.message.reply_text("⛔ شما دسترسی ادمین ندارید.")
        return
    
    try:
        target_id = int(context.args[0])
        user = db.get_user(target_id)
        if user:
            text = format_user_info(user)
            await update.message.reply_text(text, parse_mode='Markdown')
        else:
            await update.message.reply_text("❌ کاربر یافت نشد.")
    except (IndexError, ValueError):
        await update.message.reply_text(
            "❗ استفاده: /view_user [شناسه کاربر]\n\n"
            "مثال: /view_user 123456789"
        )

async def admin_callback_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """مدیریت دکمه‌های پنل ادمین"""
    query = update.callback_query
    await query.answer()
    user_id = query.from_user.id
    
    if not is_admin(user_id):
        await query.edit_message_text("⛔ شما دسترسی ادمین ندارید.")
        return
    
    action = query.data
    
    # لیست کاربران
    if action == 'admin_list_users':
        users = db.get_all_users()
        if not users:
            await query.edit_message_text("📭 هیچ کاربری ثبت نشده است.")
            return
        
        keyboard = []
        for user in users:
            name = user['first_name'] or 'نامشخص'
            # دریافت تعداد ویدیوها
            video_count = get_video_count(user)
            if video_count > 0:
                status_icon = f"✅ ({video_count})"
            else:
                status_icon = "⏳"
            
            button = InlineKeyboardButton(
                f"{status_icon} {name} (ID: {user['telegram_id']})", 
                callback_data=f"user_detail_{user['telegram_id']}"
            )
            keyboard.append([button])
        
        keyboard.append([InlineKeyboardButton("🔙 بازگشت به پنل", callback_data='admin_back')])
        
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(
            "📋 **لیست کاربران:**\n\n"
            "برای مشاهده جزئیات هر کاربر، روی نام آن کلیک کنید.",
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # کاربران تکمیل شده
    if action == 'admin_completed':
        users = db.get_completed_users()
        if not users:
            await query.edit_message_text("📭 هیچ کاربری ویدیو ارسال نکرده است.")
            return
        
        keyboard = []
        for user in users:
            name = user['first_name'] or 'نامشخص'
            video_count = get_video_count(user)
            button = InlineKeyboardButton(
                f"✅ {name} ({video_count} ویدیو)", 
                callback_data=f"user_detail_{user['telegram_id']}"
            )
            keyboard.append([button])
        
        keyboard.append([InlineKeyboardButton("🔙 بازگشت به پنل", callback_data='admin_back')])
        
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(
            "✅ **کاربران تکمیل شده:**\n\n"
            "برای مشاهده جزئیات هر کاربر، روی نام آن کلیک کنید.",
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # آمار
    if action == 'admin_stats':
        stats = db.get_stats()
        
        text = f"""
📊 **آمار سیستم:**

👥 کل کاربران: {stats['total']}
✅ تکمیل شده: {stats['completed']}
⏳ در انتظار ویدیو: {stats['pending']}
🆕 شروع نشده: {stats['not_started']}

📈 نرخ تکمیل: {f"{(stats['completed']/stats['total']*100):.1f}%" if stats['total'] > 0 else '۰%'}
"""
        keyboard = [[InlineKeyboardButton("🔙 بازگشت به پنل", callback_data='admin_back')]]
        reply_markup = InlineKeyboardMarkup(keyboard)
        
        await query.edit_message_text(
            text, 
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # حذف کاربر - نمایش لیست کاربران برای حذف
    if action == 'admin_delete_user':
        users = db.get_all_users()
        if not users:
            await query.edit_message_text("📭 هیچ کاربری برای حذف وجود ندارد.")
            return
        
        keyboard = []
        for user in users:
            name = user['first_name'] or 'نامشخص'
            video_count = get_video_count(user)
            status_icon = "✅" if video_count > 0 else "⏳"
            button = InlineKeyboardButton(
                f"🗑️ {status_icon} {name} (ID: {user['telegram_id']})", 
                callback_data=f"confirm_delete_{user['telegram_id']}"
            )
            keyboard.append([button])
        
        keyboard.append([InlineKeyboardButton("🔙 بازگشت به پنل", callback_data='admin_back')])
        
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(
            "🗑️ **حذف کاربر**\n\n"
            "برای حذف یک کاربر، روی نام آن کلیک کنید.\n"
            "⚠️ این عملیات غیرقابل بازگشت است!",
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # تایید حذف کاربر
    if action.startswith('confirm_delete_'):
        target_id = int(action.replace('confirm_delete_', ''))
        user = db.get_user(target_id)
        
        if not user:
            await query.edit_message_text("❌ کاربر یافت نشد.")
            return
        
        # حذف کاربر از دیتابیس
        db.delete_user(target_id)
        
        # لاگ
        db.log_admin_action(user_id, 'delete_user', target_id, f'کاربر توسط {user_id} حذف شد')
        
        await query.edit_message_text(
            f"✅ کاربر {user['first_name'] or 'نامشخص'} (ID: {target_id}) با موفقیت حذف شد."
        )
        return
    
    # نمایش جزئیات کاربر
    if action.startswith('user_detail_'):
        target_id = int(action.replace('user_detail_', ''))
        user = db.get_user(target_id)
        
        if not user:
            await query.edit_message_text("❌ کاربر یافت نشد.")
            return
        
        text = format_user_info(user)
        
        keyboard = []
        
        # اگر کاربر ویدیو دارد
        if user['video_file_id']:
            keyboard.append([InlineKeyboardButton("📹 مشاهده ویدیوها", callback_data=f"view_video_{target_id}")])
        
        keyboard.append([InlineKeyboardButton("🗑️ حذف این کاربر", callback_data=f"confirm_delete_{target_id}")])
        keyboard.append([InlineKeyboardButton("🔙 بازگشت به لیست", callback_data='admin_list_users')])
        keyboard.append([InlineKeyboardButton("🏠 بازگشت به پنل", callback_data='admin_back')])
        
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(
            text, 
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # مشاهده ویدیوها
    if action.startswith('view_video_'):
        target_id = int(action.replace('view_video_', ''))
        user = db.get_user(target_id)
        
        if not user or not user['video_file_id']:
            await query.edit_message_text("❌ ویدیویی برای این کاربر یافت نشد.")
            return
        
        try:
            video_ids = json.loads(user['video_file_id'])
            
            # اگر لیست بود
            if isinstance(video_ids, list):
                await query.edit_message_text(
                    f"📹 **{len(video_ids)} ویدیو برای این کاربر یافت شد.**\n\nدر حال ارسال...",
                    parse_mode='Markdown'
                )
                
                for i, file_id in enumerate(video_ids, 1):
                    await query.message.reply_video(
                        file_id,
                        caption=f"📹 ویدیو {i} از {len(video_ids)} - کاربر {user['first_name'] or 'نامشخص'}"
                    )
                await query.answer(f"✅ {len(video_ids)} ویدیو ارسال شد!")
            else:
                # اگر یک ویدیو بود
                await query.message.reply_video(
                    user['video_file_id'],
                    caption=f"📹 ویدیوی کاربر {user['first_name'] or 'نامشخص'}"
                )
                await query.answer("✅ ویدیو ارسال شد!")
        except Exception as e:
            await query.edit_message_text(f"❌ خطا در ارسال ویدیو: {e}")
        return
    
    # بازگشت به پنل
    if action == 'admin_back':
        keyboard = [
            [InlineKeyboardButton("📋 لیست کاربران", callback_data='admin_list_users')],
            [InlineKeyboardButton("✅ کاربران تکمیل شده", callback_data='admin_completed')],
            [InlineKeyboardButton("📊 آمار", callback_data='admin_stats')],
            [InlineKeyboardButton("🗑️ حذف کاربر", callback_data='admin_delete_user')]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        await query.edit_message_text(
            "👑 **پنل مدیریت**\n\n"
            "از دکمه‌های زیر برای مدیریت استفاده کنید:",
            parse_mode='Markdown',
            reply_markup=reply_markup
        )
        return
    
    # اگر هیچکدام از موارد بالا نبود
    await query.edit_message_text("❌ دستور نامعتبر.")