from asyncio import run, sleep
from sys import exit

from bot import *
from configs.config import Webhook
from database import db
from middleware import logger


async def on_startup() -> None:
    """Действия при запуске бота."""
    # Создание логера
    logger.setup()

    # Создание базы данных
    await db.setup()

    # Настройка информации о боте
    await BotInfo.setup(bots=bot)

    # Настройка middleware
    setup_middlewares(
        dp=dp,
        bot=bot,
        channel_ids=[],
    )

    # Подключение роутеров
    dp.include_router(router)

    # Вывод информации о боте
    BotInfo.start_info_out()


async def run_polling() -> None:
    """Запуск в режиме polling."""
    try:
        await on_startup()
        await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())
    finally:
        await bot.session.close()


async def run_webhook() -> None:
    """Запуск в режиме webhook."""
    app: WebhookApp = WebhookApp(host=Webhook.WEBHOOK_HOST, port=Webhook.WEBHOOK_PORT)
    try:
        await on_startup()
        await app.start()
        # держим процесс живым
        while True:
            await sleep(3600)
    finally:
        await app.stop()
        await bot.session.close()


async def main() -> None:
    # Запуск в нужном режиме
    if Webhook.WEBHOOK:
        await run_webhook()
    else:
        await run_polling()


if __name__ == "__main__":
    try:
        run(main())
    except (KeyboardInterrupt, SystemExit):
        logger.info("❌ Бот остановлен!")
        exit(0)
