import core
import events
from state import client

dynamic_handlers = {}


async def trigger_dynamic_handlers(event_type: str, *data):
    if event_type in dynamic_handlers:
        for dynamic_handler in dynamic_handlers[event_type]:
            try:
                await dynamic_handler(*data)
            except Exception as e:
                print(
                    f"error in dynamic event handler {dynamic_handler} for {event_type}: {e}"
                )


@client.event
async def on_message_edit(before, after):
    await events.trigger_dynamic_handlers("on_message_edit", before, after)

    await core.on_message(after)


@client.event
async def on_message(message):
    await events.trigger_dynamic_handlers("on_message", message)

    await core.on_message(message)


@client.event
async def on_voice_state_update(member, before, after):
    await events.trigger_dynamic_handlers(
        "on_voice_state_update", member, before, after
    )

    await core.on_voice_state_update(member, before, after)