import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode

from core.config import config
from database.database import init_models
from handlers import user_panel, kyc_flow, admin_panel, shop_flow, wallet_flow, admin_shop

async def main():
    import os
    from logging.handlers import TimedRotatingFileHandler

    # ایجاد پوشه لاگ در صورت نیاز
    os.makedirs("logs", exist_ok=True)
    
    log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    # فایل لاگ با چرخش روزانه و نگهداری حداکثر 3 روز
    file_handler = TimedRotatingFileHandler(
        "logs/bot.log", when="midnight", interval=1, backupCount=3, encoding="utf-8"
    )
    file_handler.setFormatter(log_formatter)
    
    # چاپ لاگ در کنسول
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(log_formatter)
    
    # تنظیمات کلی لاگر
    logging.basicConfig(level=logging.INFO, handlers=[file_handler, console_handler])
    
    # اطمینان از مقداردهی شدن توکن
    if config.bot_token == "YOUR_BOT_TOKEN_HERE":
        logging.error("Please set BOT_TOKEN in core/config.py or environment variables.")
        return

    # ساخت دیتابیس در صورت نیاز
    await init_models()

    from core.emojis import load_custom_emoji_overrides_from_db
    from database.database import AsyncSessionLocal
    async with AsyncSessionLocal() as session:
        await load_custom_emoji_overrides_from_db(session)

    # راه‌اندازی ربات با پشتیبانی از HTML برای رابط کاربری زیباتر
    bot = Bot(token=config.bot_token, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    dp = Dispatcher()

    # ثبت میدلورها
    from core.maintenance_middleware import MaintenanceMiddleware
    
    dp.message.outer_middleware(MaintenanceMiddleware())
    dp.callback_query.outer_middleware(MaintenanceMiddleware())

    # ثبت روترها
    dp.include_router(user_panel.router)
    dp.include_router(kyc_flow.router)
    dp.include_router(admin_panel.router)
    dp.include_router(shop_flow.router)
    dp.include_router(wallet_flow.router)
    dp.include_router(admin_shop.router)

    # زمان‌بندی بکاپ و گزارشات
    from apscheduler.schedulers.asyncio import AsyncIOScheduler
    from services.backup_service import backup_database, send_daily_report, check_and_fulfill_paid_orders
    
    scheduler = AsyncIOScheduler()
    scheduler.add_job(backup_database, 'interval', hours=1, args=[bot])
    scheduler.add_job(send_daily_report, 'cron', hour=23, minute=59, args=[bot])
    scheduler.add_job(check_and_fulfill_paid_orders, 'interval', seconds=30, args=[bot])
    scheduler.start()

    # شروع کار ربات
    logging.info("Bot is starting...")
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())
