use std::collections::HashMap;
use uuid::Uuid;
use super::{DataId, DataIdAliasMap};
pub use crate::encoding::internal::autogen::data_point_group::DataIdOrAlias;
impl From<DataId> for DataIdOrAlias {
    fn from(id: DataId) -> Self {
        Self::DataId(id)
    }
}
impl From<u32> for DataIdOrAlias {
    fn from(alias: u32) -> Self {
        Self::DataIdAlias(alias)
    }
}
#[derive(Clone, PartialEq, Debug)]
pub enum UpstreamOrAlias {
    UpstreamInfo(UpstreamInfo),
    Alias(u32),
}
impl Default for UpstreamOrAlias {
    fn default() -> Self {
        Self::Alias(0)
    }
}
impl From<UpstreamInfo> for UpstreamOrAlias {
    fn from(info: UpstreamInfo) -> Self {
        Self::UpstreamInfo(info)
    }
}
impl From<u32> for UpstreamOrAlias {
    fn from(alias: u32) -> Self {
        Self::Alias(alias)
    }
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamChunkResult {
    pub sequence_number: u32,
    pub result_code: super::ResultCode,
    pub result_string: String,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamChunkResult {
    pub stream_id_of_upstream: Uuid,
    pub sequence_number_in_upstream: u32,
    pub result_code: super::ResultCode,
    pub result_string: String,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct StreamChunk {
    pub sequence_number: u32,
    pub data_point_groups: Vec<DataPointGroup>,
}
pub use crate::encoding::internal::autogen::DataPoint;
#[derive(Clone, PartialEq, Debug)]
pub struct DataPointGroup {
    pub data_points: Vec<DataPoint>,
    pub data_id_or_alias: DataIdOrAlias,
}
#[derive(Clone, Eq, PartialEq, Hash, Default, Debug)]
pub struct UpstreamInfo {
    pub source_node_id: String,
    pub session_id: String,
    pub stream_id: Uuid,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamChunk {
    pub stream_id_alias: u32,
    pub stream_chunk: StreamChunk,
    pub upstream_or_alias: UpstreamOrAlias,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamChunkAck {
    pub ack_id: u32,
    pub stream_id_alias: u32,
    pub upstream_aliases: HashMap<u32, UpstreamInfo>,
    pub data_id_aliases: DataIdAliasMap,
    pub results: Vec<DownstreamChunkResult>,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct DownstreamChunkAckComplete {
    pub stream_id_alias: u32,
    pub ack_id: u32,
    pub result_code: super::ResultCode,
    pub result_string: String,
}
#[derive(Clone, PartialEq, Debug, Default)]
pub struct UpstreamChunk {
    pub stream_id_alias: u32,
    pub stream_chunk: StreamChunk,
    pub data_ids: Vec<DataId>,
}
#[derive(Clone, PartialEq, Default, Debug)]
pub struct UpstreamChunkAck {
    pub stream_id_alias: u32,
    pub results: Vec<UpstreamChunkResult>,
    pub data_id_aliases: DataIdAliasMap,
}