mod component_connection;

use bevy_ecs::{resource::Resource, world::{FromWorld, World}};
use bevy_tokio_tasks::TokioTasksRuntime;
use futures::{stream::SplitSink, stream::SplitStream, StreamExt};
use tokio_xmpp::{connect::TcpServerConnector, Component, Stanza};

pub use component_connection::{ComponentConfig, IncomingStanza};

#[derive(Resource)]
pub struct XmppComponent {
    pub reader: SplitStream<Component<TcpServerConnector>>,
    pub writer: SplitSink<Component<TcpServerConnector>, Stanza>,
}

impl FromWorld for XmppComponent {
    fn from_world(world: &mut World) -> Self {
        let Some(tokio_tasks) = world.get_resource_mut::<TokioTasksRuntime>() else {
            panic!("Expected a TokioTasksRuntime, but it's not there")
        };
        let conn = tokio_tasks.runtime().block_on(async move {
            Component::new("sgxbwmsgsv2.localhost", "secret")
                .await
                .unwrap()
        });
        let (writer, reader) = conn.split();
        XmppComponent { reader, writer }
    }
}
