use bacnet_encoding::primitives::encode_property_value;
use bacnet_types::enums::ObjectType;
use bytes::BytesMut;
use super::{Entry, Stored};
use crate::tui::format::{decode_all, Floats, StateTexts, ValueFormat};
pub(super) fn original(whole: Option<&Stored>, elements: &[Entry]) -> Option<Stored> {
let first = elements.first()?;
let mut values = decode_all(&whole?.bytes)?;
for entry in elements {
let index = usize::try_from(entry.index?).ok()?;
let old = decode_all(&entry.before.as_ref()?.bytes)?;
let [old] = <[_; 1]>::try_from(old).ok()?;
*values.get_mut(index.checked_sub(1)?)? = old;
}
let mut buf = BytesMut::new();
for value in &values {
encode_property_value(&mut buf, value).ok()?;
}
let texts = StateTexts::default();
let format = ValueFormat::new(
ObjectType::from_raw(first.object_type),
&texts,
Floats::Exact,
);
Some(Stored {
text: format.value(first.property(), &buf),
bytes: buf.to_vec(),
})
}