Documentation
use crate::{Context, EventEngine, EventExt, EventOnceExt};
use std::fmt::Debug;
use std::sync::LazyLock;
use wd_tools::AsBytes;

pub type AgentEngine = EventEngine;

pub static AGENT_ENGINE: LazyLock<AgentEngine> = LazyLock::new(EventEngine::default);

pub fn agent_engine() -> &'static AgentEngine {
    &AGENT_ENGINE
}

pub async fn register_event<T, I, E>(trigger: T, event: E)
where
    T: AsBytes,
    I: Debug + Sync + Send + 'static,
    E: EventExt<I> + Send + 'static,
{
    AGENT_ENGINE.register_event(trigger, event).await;
}

pub fn register_event_once<T, I, E>(trigger: T, event: E)
where
    T: AsBytes,
    I: Debug + Sync + Send + 'static,
    E: EventOnceExt<I> + Send + 'static,
{
    AGENT_ENGINE.register_event_once(trigger, event);
}

pub async fn invoke<T, V>(trigger: T, input: V) -> anyhow::Result<Context>
where
    T: AsBytes,
    V: Debug + Sync + Send + 'static,
{
    AGENT_ENGINE.invoke(trigger, input).await
}

pub async fn launch<T, V>(trigger: T, input: V)
where
    T: AsBytes + Send + 'static,
    V: Debug + Sync + Send + 'static,
{
    AGENT_ENGINE.launch(trigger, input).await;
}