import asyncio

from aiogram.dispatcher.middlewares import BaseMiddleware


class EnvironmentMiddleware(BaseMiddleware):
    def __init__(self, context=None):
        super(EnvironmentMiddleware, self).__init__()

        if context is None:
            context = {}
        self.context = context

    def update_data(self, data):
        dp = self.manager.dispatcher
        data.update(
            bot=dp.bot,
            dispatcher=dp,
            loop=dp.loop or asyncio.get_event_loop()
        )
        if self.context:
            data.update(self.context)

    async def trigger(self, action, args):
        if 'error' not in action and action.startswith('pre_process_'):
            self.update_data(args[-1])
            return True
