import asyncio
import argparse
from tortoise import Tortoise

from olgram.router import dp
from olgram.settings import TORTOISE_ORM, OlgramSettings
from olgram.utils.permissions import AccessMiddleware
from server.custom import init_redis

import olgram.commands.bots  # noqa: F401
import olgram.commands.start  # noqa: F401
import olgram.commands.menu  # noqa: F401
import olgram.commands.bot_actions  # noqa: F401

from server.server import main as server_main

import logging
logging.basicConfig(level=logging.INFO)


async def init_database():
    await Tortoise.init(config=TORTOISE_ORM)


async def init_olgram():
    from olgram.router import bot, dp
    dp.setup_middleware(AccessMiddleware(OlgramSettings.admin_id()))
    from aiogram.types import BotCommand
    await bot.set_my_commands(
        [
            BotCommand("start", "Запустить бота"),
            BotCommand("addbot", "Добавить бот"),
            BotCommand("mybots", "Управление ботами"),
            BotCommand("help", "Справка")
        ]
    )


async def initialization():
    await init_database()
    await init_redis()
    await init_olgram()


def main():
    """
    Classic polling
    """
    parser = argparse.ArgumentParser("Olgram server")
    parser.add_argument("--noserver", help="Не запускать сервер обратной связи, только сам Olgram (режим для "
                                           "разработки)", action="store_true")
    args = parser.parse_args()

    loop = asyncio.get_event_loop()
    loop.run_until_complete(initialization())

    loop.create_task(dp.start_polling())
    if not args.noserver:
        loop.create_task(server_main().start())

    loop.run_forever()


if __name__ == '__main__':
    main()
