from telegram import Update, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from telegram.ext import ContextTypes
from database import Database
from utils import (
    validate_personal_code, 
    validate_phone_number, 
    is_admin,
    get_video_count
)
from config import Config
import os
import logging

logger = logging.getLogger(__name__)
db = Database()

# کیبورد شروع
start_keyboard = [[KeyboardButton("🚀 شروع")]]
start_markup = ReplyKeyboardMarkup(start_keyboard, resize_keyboard=True)

# کیبورد شماره تماس
phone_keyboard = [[KeyboardButton("📱 ارسال شماره تماس", request_contact=True)]]
phone_markup = ReplyKeyboardMarkup(phone_keyboard, resize_keyboard=True, one_time_keyboard=True)

async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """دستور /start"""
    user = update.effective_user
    telegram_id = user.id
    
    db.create_or_update_user(
        telegram_id, 
        user.username, 
        user.first_name, 
        user.last_name
    )
    
    welcome_text = """
🏆 به سامانه ثبت تست‌های ورزشی افق کوروش خوش آمدید

سلام! 👋
خوشحالیم که برای حضور در این رویداد ورزشی همراه ما هستید. 💪🏆

شما می‌توانید از طریق این سامانه اطلاعات خود را ثبت کرده و ویدیوی تست ورزشی خود را برای مربیان رشته‌های ورزشی ارسال نمایید.

🎥 برای شروع ثبت اطلاعات و ارسال ویدیو تست، روی گزینه «شروع» کلیک کنید.
"""
    
    await update.message.reply_text(
        welcome_text,
        reply_markup=start_markup
    )

async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """مدیریت پیام‌های متنی"""
    user_id = update.effective_user.id
    text = update.message.text
    
    user = db.get_user(user_id)
    if not user:
        await update.message.reply_text("لطفاً ابتدا /start را بزنید.")
        return
    
    status = user['status']
    
    if text == "🚀 شروع":
        db.update_user_status(user_id, 'awaiting_personal')
        await update.message.reply_text(
            "📝 **کد پرسنلی خود را وارد کنید**",
            parse_mode='Markdown',
            reply_markup=ReplyKeyboardRemove()
        )
        return
    
    if status == 'awaiting_personal':
        if validate_personal_code(text):
            db.update_user_info(user_id, 'personal_code', text)
            db.update_user_status(user_id, 'awaiting_phone')
            await update.message.reply_text(
                "📱 **شماره تماس خود را وارد نمایید**\n"
                "می‌توانید از دکمه زیر برای ارسال شماره استفاده کنید.",
                parse_mode='Markdown',
                reply_markup=phone_markup
            )
        else:
            await update.message.reply_text("❌ کد پرسنلی نامعتبر! حداقل ۴ رقم وارد کنید.")
    
    elif status == 'awaiting_phone':
        if validate_phone_number(text):
            db.update_user_info(user_id, 'phone_number', text)
            db.update_user_status(user_id, 'awaiting_video')
            await update.message.reply_text(
                "🎥 **لطفاً ویدیوهای تست ورزشی خود را ارسال کنید.**\n\n"
                f"📌 شما می‌توانید بین ۱ تا ۱۰ ویدیو ارسال کنید.\n"
                f"📌 حجم هر ویدیو حداکثر {Config.MAX_VIDEO_SIZE // (1024*1024)} مگابایت مجاز است.\n\n"
                "✅ پس از ارسال همه ویدیوها، دکمه **«پایان ارسال»** را بزنید.",
                parse_mode='Markdown',
                reply_markup=ReplyKeyboardRemove()
            )
            # تنظیم شمارنده ویدیوها
            context.user_data['video_count'] = 0
            context.user_data['video_ids'] = []
        else:
            await update.message.reply_text(
                "❌ شماره تماس نامعتبر! فرمت صحیح: 09123456789\n"
                "یا از دکمه ارسال شماره استفاده کنید."
            )
    
    elif status == 'awaiting_video':
        if text == "✅ پایان ارسال":
            video_ids = context.user_data.get('video_ids', [])
            video_count = len(video_ids)
            
            if video_count == 0:
                await update.message.reply_text(
                    "❌ شما هیچ ویدیویی ارسال نکرده‌اید!\n"
                    "لطفاً حداقل ۱ ویدیو ارسال کنید."
                )
                return
            
            # ذخیره ویدیوها در دیتابیس
            db.save_videos_info(user_id, video_ids)
            db.update_user_status(user_id, 'completed')
            
            await update.message.reply_text(
                f"✅ **{video_count} ویدیوی شما با موفقیت ثبت شد!**\n\n"
                "🙏 از مشارکت شما سپاسگزاریم. پس از بررسی نتایج، در صورت انتخاب، مربیان با شما تماس خواهند گرفت.",
                parse_mode='Markdown'
            )
            
            # اطلاع‌رسانی به ادمین‌ها
            for admin_id in Config.ADMIN_IDS:
                try:
                    await context.bot.send_message(
                        admin_id,
                        f"📹 {video_count} ویدیوی جدید از کاربر {user['first_name'] or 'نامشخص'} (ID: {user_id}) دریافت شد."
                    )
                except:
                    pass
            
            # پاک کردن اطلاعات موقت
            context.user_data.clear()
        else:
            await update.message.reply_text(
                "❗ لطفاً ویدیو ارسال کنید یا دکمه **«پایان ارسال»** را بزنید.",
                parse_mode='Markdown'
            )
    else:
        await update.message.reply_text(
            "❓ دستور نامعتبر. لطفاً از دکمه‌ها استفاده کنید یا /start را بزنید."
        )

async def handle_contact(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """مدیریت شماره تماس ارسالی از دکمه شیشه‌ای"""
    user_id = update.effective_user.id
    contact = update.message.contact
    
    user = db.get_user(user_id)
    if not user or user['status'] != 'awaiting_phone':
        await update.message.reply_text(
            "❌ در حال حاضر نیازی به ارسال شماره نیست.",
            reply_markup=ReplyKeyboardRemove()
        )
        return
    
    phone_number = contact.phone_number
    db.update_user_info(user_id, 'phone_number', phone_number)
    db.update_user_status(user_id, 'awaiting_video')
    
    await update.message.reply_text(
        "✅ شماره تماس با موفقیت ثبت شد!\n\n"
        "🎥 **لطفاً ویدیوهای تست ورزشی خود را ارسال کنید.**\n\n"
        f"📌 شما می‌توانید بین ۱ تا ۱۰ ویدیو ارسال کنید.\n"
        f"📌 حجم هر ویدیو حداکثر {Config.MAX_VIDEO_SIZE // (1024*1024)} مگابایت مجاز است.\n\n"
        "✅ پس از ارسال همه ویدیوها، دکمه **«پایان ارسال»** را بزنید.",
        parse_mode='Markdown',
        reply_markup=ReplyKeyboardRemove()
    )
    
    context.user_data['video_count'] = 0
    context.user_data['video_ids'] = []

async def handle_video(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """مدیریت ویدیوهای ارسالی"""
    user_id = update.effective_user.id
    video = update.message.video
    
    user = db.get_user(user_id)
    if not user or user['status'] != 'awaiting_video':
        await update.message.reply_text(
            "❌ در حال حاضر نیازی به ارسال ویدیو نیست.\n"
            "لطفاً ابتدا اطلاعات خود را ثبت کنید."
        )
        return
    
    # بررسی حجم ویدیو
    if video.file_size > Config.MAX_VIDEO_SIZE:
        max_mb = Config.MAX_VIDEO_SIZE // (1024*1024)
        current_mb = video.file_size // (1024*1024)
        await update.message.reply_text(
            f"❌ حجم ویدیو زیاد است! ({current_mb} مگابایت)\n"
            f"حداکثر حجم مجاز: {max_mb} مگابایت"
        )
        return
    
    # بررسی تعداد ویدیوها
    video_count = context.user_data.get('video_count', 0)
    if video_count >= 10:
        await update.message.reply_text(
            "❌ شما حداکثر ۱۰ ویدیو می‌توانید ارسال کنید.\n"
            "برای اتمام، دکمه **«پایان ارسال»** را بزنید.",
            parse_mode='Markdown'
        )
        return
    
    # ذخیره file_id
    video_ids = context.user_data.get('video_ids', [])
    video_ids.append(video.file_id)
    context.user_data['video_ids'] = video_ids
    context.user_data['video_count'] = video_count + 1
    
    remaining = 10 - (video_count + 1)
    await update.message.reply_text(
        f"✅ ویدیو شماره {video_count + 1} با موفقیت دریافت شد.\n"
        f"📌 می‌توانید {remaining} ویدیوی دیگر ارسال کنید.\n\n"
        "برای اتمام، دکمه **«پایان ارسال»** را بزنید.",
        parse_mode='Markdown',
        reply_markup=ReplyKeyboardMarkup(
            [[KeyboardButton("✅ پایان ارسال")]],
            resize_keyboard=True,
            one_time_keyboard=True
        )
    )

async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """لغو عملیات"""
    user_id = update.effective_user.id
    db.update_user_status(user_id, 'start')
    context.user_data.clear()
    await update.message.reply_text(
        "❌ عملیات لغو شد.\n"
        "برای شروع مجدد /start را بزنید.",
        reply_markup=ReplyKeyboardRemove()
    )