use flagrant_types::{Environment, Feature, Variant};
use sqlx::{Pool, Sqlite};
use crate::models::{feature, variant};
pub struct Distributor {
feature: Feature,
}
impl Distributor {
pub fn new(feature: Feature) -> Self {
Self { feature }
}
pub async fn distribute(&self, pool: &Pool<Sqlite>, environment: &Environment) -> anyhow::Result<Variant> {
let mut variants = variant::list(pool, environment, &self.feature).await?;
let max_accum = variants
.iter()
.enumerate()
.max_by(|(_, a), (_, b)| a.accumulator.cmp(&b.accumulator));
let (idx, _) = max_accum.unwrap();
let var = variants.swap_remove(idx);
let mut tx = pool.begin().await?;
variant::update_accumulator(&mut tx, environment, &var, var.accumulator - 100).await?;
feature::bump_up_accumulators(&mut tx, environment, &self.feature, var.weight).await?;
tx.commit().await?;
Ok(var)
}
}