use crate::{PropertyValue, prelude::RawPropertySpec};

#[derive(Debug, Clone, PartialEq)]
pub(super) struct PropertyTrack {
    spec: RawPropertySpec,
    samples: Vec<PropertySample>,
}

impl PropertyTrack {
    pub(super) fn new(spec: RawPropertySpec, samples: Vec<PropertySample>) -> Self {
        Self { spec, samples }
    }

    pub(super) fn samples(&self) -> &[PropertySample] {
        &self.samples
    }

    pub(super) fn add_sample(&mut self, offset: f32, value: PropertyValue) {
        self.samples.push(PropertySample::new(offset, value));
    }

    pub(super) fn spec(&self) -> &RawPropertySpec {
        &self.spec
    }

    pub(super) fn sort_samples(&mut self) {
        self.samples.sort_by(|a, b| {
            a.offset
                .partial_cmp(&b.offset)
                .unwrap_or(std::cmp::Ordering::Equal)
        });
    }
}

#[derive(Debug, Clone, PartialEq)]
pub(super) struct PropertySample {
    offset: f32,
    value: PropertyValue,
}

impl PropertySample {
    pub(super) fn new(offset: f32, value: PropertyValue) -> Self {
        Self { offset, value }
    }

    pub(super) fn offset(&self) -> f32 {
        self.offset
    }

    pub(super) fn value(&self) -> PropertyValue {
        self.value
    }
}
