# main.py
import asyncio
import logging
from telegram import Update
from telegram.ext import (
    Application, CommandHandler, MessageHandler,
    CallbackQueryHandler, filters,
)
from telegram.request import HTTPXRequest

from config import (
    BOT_TOKEN, ADMIN_ID, USE_PROXY, PROXY_URL,
    WEBHOOK_MODE, WEBHOOK_URL, WEBHOOK_PORT, WEBHOOK_LISTEN
)
from database import init_db, set_setting
from handlers import start, button_handler, receive_music, admin_message_handler
from webhook import setup_webhook

logging.basicConfig(
    format="%(asctime)s | %(levelname)s | %(message)s",
    level=logging.INFO,
)
logger = logging.getLogger(__name__)

async def post_init(application: Application):
    """بعد از راه‌اندازی ربات"""
    me = await application.bot.get_me()
    await set_setting("bot_username", me.username or "")
    logger.info(f"✅ ربات @{me.username} آماده‌ست")
    
    # نمایش اطلاعات در کنسول
    logger.info(f"📊 آیدی عددی ربات: {me.id}")
    logger.info(f"🔗 لینک ربات: https://t.me/{me.username}")

async def shutdown(application: Application):
    """خاموش کردن graceful"""
    logger.info("🛑 در حال خاموش کردن ربات...")
    await application.stop()
    await application.shutdown()

async def main():
    """تابع اصلی"""
    try:
        # مقداردهی اولیه دیتابیس
        await init_db()
        logger.info("✅ دیتابیس آماده است")
        
        # تنظیم درخواست با پروکسی (اختیاری)
        request = None
        if USE_PROXY and PROXY_URL:
            request = HTTPXRequest(
                proxy=PROXY_URL,
                connect_timeout=30.0,
            )
            logger.info(f"🌐 پروکسی فعال: {PROXY_URL}")
        
        # ساخت اپلیکیشن
        builder = Application.builder().token(BOT_TOKEN).post_init(post_init)
        if request:
            builder = builder.request(request)
        
        app = builder.build()
        
        # اضافه کردن هندلرها
        app.add_handler(CommandHandler("start", start))
        app.add_handler(CallbackQueryHandler(button_handler))
        app.add_handler(MessageHandler(
            (filters.AUDIO | filters.VOICE) & ~filters.COMMAND,
            receive_music,
        ))
        app.add_handler(MessageHandler(
            filters.User(ADMIN_ID) & ~filters.COMMAND & ~filters.AUDIO & ~filters.VOICE,
            admin_message_handler,
        ))
        
        # راه‌اندازی ربات
        if WEBHOOK_MODE:
            # حالت وب‌هوک
            logger.info("🌐 راه‌اندازی در حالت Webhook...")
            await app.initialize()
            await app.start()
            await setup_webhook(app, WEBHOOK_URL, WEBHOOK_PORT, WEBHOOK_LISTEN)
            
            logger.info("✅ ربات با موفقیت اجرا شد (Webhook mode)")
            logger.info(f"📡 آدرس وب‌هوک: {WEBHOOK_URL}")
            
            try:
                # نگه داشتن برنامه در حال اجرا
                await asyncio.Event().wait()
            except KeyboardInterrupt:
                logger.info("📛 دریافت سیگنال KeyboardInterrupt")
            finally:
                await shutdown(app)
        else:
            # حالت پولینگ
            logger.info("🔄 راه‌اندازی در حالت Polling...")
            await app.initialize()
            await app.start()
            await app.updater.start_polling(allowed_updates=Update.ALL_TYPES)
            
            logger.info("✅ ربات با موفقیت اجرا شد (Polling mode)")
            
            try:
                # نگه داشتن برنامه در حال اجرا
                await asyncio.Event().wait()
            except KeyboardInterrupt:
                logger.info("📛 دریافت سیگنال KeyboardInterrupt")
            finally:
                await app.updater.stop()
                await shutdown(app)
                
    except Exception as e:
        logger.error(f"❌ خطا در اجرای ربات: {e}", exc_info=True)
        raise

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        logger.info("👋 ربات متوقف شد")
    except Exception as e:
        logger.error(f"❌ خطای fatal: {e}")