use brk_traversable::Traversable;
use brk_types::{Cents, Dollars, OHLCCents, OHLCDollars, OHLCSats, Sats};
use vecdb::{Rw, StorageMode};

use crate::internal::{EagerIndexes, LazyEagerIndexes, LazyPerBlock, PerBlock, Resolutions};

use super::ohlcs::{LazyOhlcVecs, OhlcVecs};

#[derive(Traversable)]
pub struct SplitByUnit<M: StorageMode = Rw> {
    pub open: SplitIndexesByUnit<M>,
    pub high: SplitIndexesByUnit<M>,
    pub low: SplitIndexesByUnit<M>,
    pub close: SplitCloseByUnit,
}

#[derive(Traversable)]
pub struct SplitIndexesByUnit<M: StorageMode = Rw> {
    pub usd: LazyEagerIndexes<Dollars, Cents>,
    pub cents: EagerIndexes<Cents, M>,
    pub sats: LazyEagerIndexes<Sats, Cents>,
}

#[derive(Clone, Traversable)]
pub struct SplitCloseByUnit {
    pub usd: Resolutions<Dollars>,
    pub cents: Resolutions<Cents>,
    pub sats: Resolutions<Sats>,
}

#[derive(Traversable)]
pub struct OhlcByUnit<M: StorageMode = Rw> {
    pub usd: LazyOhlcVecs<OHLCDollars, OHLCCents>,
    pub cents: OhlcVecs<OHLCCents, M>,
    pub sats: LazyOhlcVecs<OHLCSats, OHLCCents>,
}

#[derive(Traversable)]
pub struct PriceByUnit<M: StorageMode = Rw> {
    pub usd: LazyPerBlock<Dollars, Cents>,
    pub cents: PerBlock<Cents, M>,
    pub sats: LazyPerBlock<Sats, Cents>,
}
