pub mod adapter;
pub mod feishu;
pub mod telegram;

pub use adapter::{
    AdapterResponse, ChannelAdapter, ChannelAttachment, ChannelCapabilities, ChannelError,
    ChannelMember, ChannelMention, ChannelMessage, ChannelMeta, ChannelOutboundAttachment,
    ChannelOutboundAttachmentKind, ChannelProgressSection, ChannelProgressState,
    ChannelProgressUpdate, ChannelResult, ChannelRuntime, ChannelTextFormat,
};
pub use feishu::{
    capabilities as feishu_capabilities, meta as feishu_meta, FeishuAdapter, FeishuCardRequest,
    FeishuChatInfo, FeishuChatMember, FeishuClient, FeishuConfig, FeishuConfigError,
    FeishuEventTransport, FeishuSendRequest, FeishuWebsocketMessageHandler, FeishuWebsocketService,
};
pub use telegram::{
    capabilities as telegram_capabilities, meta as telegram_meta, TelegramAdapter, TelegramClient,
    TelegramConfig, TelegramConfigError, TelegramEventTransport, TelegramPollingMessageHandler,
    TelegramPollingService,
};

pub fn build_feishu_runtime(config: FeishuConfig) -> ChannelResult<ChannelRuntime> {
    let instance_id = config
        .channel_instance_id
        .clone()
        .unwrap_or_else(|| "feishu".to_string());
    let adapter =
        std::sync::Arc::new(FeishuAdapter::new(config)?) as std::sync::Arc<dyn ChannelAdapter>;
    Ok(ChannelRuntime {
        instance_id,
        channel_id: "feishu".to_string(),
        meta: feishu_meta(),
        capabilities: feishu_capabilities(),
        adapter,
    })
}

pub fn build_telegram_runtime(config: TelegramConfig) -> ChannelResult<ChannelRuntime> {
    let instance_id = config
        .channel_instance_id
        .clone()
        .unwrap_or_else(|| "telegram".to_string());
    let adapter =
        std::sync::Arc::new(TelegramAdapter::new(config)?) as std::sync::Arc<dyn ChannelAdapter>;
    Ok(ChannelRuntime {
        instance_id,
        channel_id: "telegram".to_string(),
        meta: telegram_meta(),
        capabilities: telegram_capabilities(),
        adapter,
    })
}