use chrono::{NaiveDate, NaiveDateTime};
use rand::Rng;
use rand_chacha::ChaCha8Rng;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LifecycleConfig {
pub start: NaiveDate,
pub end: NaiveDate,
pub bucket: BucketGranularity,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BucketGranularity {
Day,
Week,
Month,
Quarter,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TimeBucket {
pub index: usize,
pub start: NaiveDate,
pub end: NaiveDate,
}
impl TimeBucket {
pub fn start_datetime(&self) -> NaiveDateTime {
self.start.and_time(chrono::NaiveTime::MIN)
}
pub fn end_datetime(&self) -> NaiveDateTime {
self.end.and_time(chrono::NaiveTime::MIN)
}
pub fn random_datetime(&self, rng: &mut ChaCha8Rng) -> NaiveDateTime {
let start = self.start_datetime();
let span = (self.end_datetime() - start).num_seconds();
if span <= 0 {
return start;
}
start + chrono::Duration::seconds(rng.gen_range(0..span))
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct TrackedEntity {
pub id: i64,
pub created_at: NaiveDateTime,
pub created_bucket: usize,
pub is_active: bool,
pub churned_at: Option<NaiveDateTime>,
}
impl TrackedEntity {
pub fn age_in_buckets(&self, current_bucket: usize) -> usize {
current_bucket.saturating_sub(self.created_bucket)
}
}