use std::collections::VecDeque;
use bytes::Bytes;
use crossbeam_channel::Receiver;
use enum_dispatch::enum_dispatch;
use crate::packet::message::{FragmentData, MessageAck, MessageId, SingleData};
use crate::shared::ping::manager::PingManager;
use crate::shared::tick_manager::TickManager;
use crate::shared::time_manager::TimeManager;
pub(crate) mod fragment_ack_receiver;
pub(crate) mod fragment_sender;
pub(crate) mod reliable;
pub(crate) mod sequenced_unreliable;
pub(crate) mod tick_unreliable;
pub(crate) mod unordered_unreliable;
pub(crate) mod unordered_unreliable_with_acks;
#[enum_dispatch]
pub trait ChannelSend {
fn update(
&mut self,
time_manager: &TimeManager,
ping_manager: &PingManager,
tick_manager: &TickManager,
);
fn buffer_send(&mut self, message: Bytes) -> Option<MessageId>;
fn send_packet(&mut self) -> (VecDeque<SingleData>, VecDeque<FragmentData>);
fn collect_messages_to_send(&mut self);
fn notify_message_delivered(&mut self, message_ack: &MessageAck);
fn has_messages_to_send(&self) -> bool;
fn subscribe_acks(&mut self) -> Receiver<MessageId>;
}
#[enum_dispatch(ChannelSend)]
pub enum ChannelSender {
UnorderedUnreliableWithAcks(unordered_unreliable_with_acks::UnorderedUnreliableWithAcksSender),
UnorderedUnreliable(unordered_unreliable::UnorderedUnreliableSender),
SequencedUnreliable(sequenced_unreliable::SequencedUnreliableSender),
Reliable(reliable::ReliableSender),
TickUnreliable(tick_unreliable::TickUnreliableSender),
}