use brk_cohort::AgeRange;
use brk_traversable::Traversable;
use brk_types::StoredF64;
use derive_more::{Deref, DerefMut};
use vecdb::{Rw, StorageMode};

use crate::internal::{LazyPerBlock, PerBlock, PerBlockCumulativeRolling, SpotValuePerBlock};

#[derive(Traversable)]
pub struct ActivityVecs<M: StorageMode = Rw> {
    pub wakefulness: PerBlock<StoredF64, M>,
    pub dormancy: LazyPerBlock<StoredF64>,
    pub wakefulness_to_dormancy: LazyPerBlock<StoredF64>,
}

#[derive(Traversable)]
pub struct SupplyVecs<M: StorageMode = Rw> {
    pub awake: SpotValuePerBlock<M>,
    pub dormant: SpotValuePerBlock<M>,
}

#[derive(Deref, DerefMut, Traversable)]
pub struct CohortVecs<M: StorageMode = Rw> {
    pub coindays_created: PerBlockCumulativeRolling<StoredF64, M>,
    pub coindays_consumed: PerBlockCumulativeRolling<StoredF64, M>,
    pub coindays_stored: PerBlockCumulativeRolling<StoredF64, M>,
    #[deref]
    #[deref_mut]
    #[traversable(flatten)]
    pub activity: ActivityVecs<M>,
    pub supply: SupplyVecs<M>,
}

#[derive(Deref, DerefMut, Traversable)]
#[traversable(transparent)]
pub struct Vecs<M: StorageMode = Rw>(pub AgeRange<CohortVecs<M>>);
