use brk_error::Result;
use brk_types::Version;
use vecdb::{Database, ReadableCloneableVec};

use super::{
    Vecs,
    vecs::{HashPriceValueVecs, HashRateSmaVecs, RateVecs},
};
use crate::{
    indexes,
    internal::{LazyPerBlock, PerBlock, PercentPerBlock, ThsToPhsF32},
};

impl Vecs {
    pub(crate) fn forced_import(
        db: &Database,
        version: Version,
        indexes: &indexes::Vecs,
    ) -> Result<Self> {
        let v4 = Version::new(4);
        let v5 = Version::new(5);

        let price_ths = PerBlock::forced_import(db, "hash_price_ths", version + v4, indexes)?;
        let price_ths_min =
            PerBlock::forced_import(db, "hash_price_ths_min", version + v4, indexes)?;
        let price_phs = LazyPerBlock::from_computed::<ThsToPhsF32>(
            "hash_price_phs",
            version + v4,
            price_ths.height.read_only_boxed_clone(),
            &price_ths,
        );
        let price_phs_min = LazyPerBlock::from_computed::<ThsToPhsF32>(
            "hash_price_phs_min",
            version + v4,
            price_ths_min.height.read_only_boxed_clone(),
            &price_ths_min,
        );

        let value_ths = PerBlock::forced_import(db, "hash_value_ths", version + v4, indexes)?;
        let value_ths_min =
            PerBlock::forced_import(db, "hash_value_ths_min", version + v4, indexes)?;
        let value_phs = LazyPerBlock::from_computed::<ThsToPhsF32>(
            "hash_value_phs",
            version + v4,
            value_ths.height.read_only_boxed_clone(),
            &value_ths,
        );
        let value_phs_min = LazyPerBlock::from_computed::<ThsToPhsF32>(
            "hash_value_phs_min",
            version + v4,
            value_ths_min.height.read_only_boxed_clone(),
            &value_ths_min,
        );

        Ok(Self {
            rate: RateVecs {
                base: PerBlock::forced_import(db, "hash_rate", version + v5, indexes)?,
                sma: HashRateSmaVecs {
                    _1w: PerBlock::forced_import(db, "hash_rate_sma_1w", version, indexes)?,
                    _1m: PerBlock::forced_import(db, "hash_rate_sma_1m", version, indexes)?,
                    _2m: PerBlock::forced_import(db, "hash_rate_sma_2m", version, indexes)?,
                    _1y: PerBlock::forced_import(db, "hash_rate_sma_1y", version, indexes)?,
                },
                ath: PerBlock::forced_import(db, "hash_rate_ath", version, indexes)?,
                drawdown: PercentPerBlock::forced_import(
                    db,
                    "hash_rate_drawdown",
                    version,
                    indexes,
                )?,
            },
            price: HashPriceValueVecs {
                ths: price_ths,
                ths_min: price_ths_min,
                phs: price_phs,
                phs_min: price_phs_min,
                rebound: PercentPerBlock::forced_import(
                    db,
                    "hash_price_rebound",
                    version + v4,
                    indexes,
                )?,
            },
            value: HashPriceValueVecs {
                ths: value_ths,
                ths_min: value_ths_min,
                phs: value_phs,
                phs_min: value_phs_min,
                rebound: PercentPerBlock::forced_import(
                    db,
                    "hash_value_rebound",
                    version + v4,
                    indexes,
                )?,
            },
        })
    }
}
