# bot.py
from __future__ import annotations
import asyncio
import logging
import aiosqlite
from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.memory import MemoryStorage
from config import load_settings, load_event, load_welcome
from services.archive import load_archive
from db import init_db
from handlers.user import router as user_router, setup_user_handlers
from handlers.admin import router as admin_router, setup_admin_handlers

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s")
logger = logging.getLogger(__name__)


async def main() -> None:
    settings = load_settings()
    event = load_event(settings.event_json)

    async with aiosqlite.connect(settings.db_path) as db:
        await init_db(db)
        logger.info("DB initialized: %s", settings.db_path)

        bot = Bot(token=settings.bot_token)
        dp = Dispatcher(storage=MemoryStorage())

        event_holder = {"event": event}
        welcome = load_welcome(settings.welcome_json)
        welcome_holder = {"welcome": welcome}
        archive = load_archive(settings.archive_json)
        archive_holder = {"archive": archive, "path": settings.archive_json}
        setup_user_handlers(
            db=db,
            event_holder=event_holder,
            welcome_holder=welcome_holder,
            archive_holder=archive_holder,
        )
        setup_admin_handlers(
            db=db,
            event_holder=event_holder,
            event_path=settings.event_json,
            admin_id=settings.admin_id,
            welcome_holder=welcome_holder,
            welcome_path=settings.welcome_json,
            archive_holder=archive_holder,
        )
        dp.include_router(user_router)
        dp.include_router(admin_router)

        logger.info("Starting bot, event: %s (type=%s)", event.event_id, event.type)
        try:
            await dp.start_polling(bot, drop_pending_updates=True)
        finally:
            await bot.session.close()
            logger.info("Bot session closed.")


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