use serde::{Deserialize, Serialize};
use crate::acg::profile::DistributionSummary;
use crate::acg::types::{RetentionIntent, RetentionTier, SharingScope};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RetentionThresholds {
pub ephemeral_max_secs: f64,
pub short_lived_max_secs: f64,
pub session_duration_max_secs: f64,
pub long_lived_max_secs: f64,
}
impl Default for RetentionThresholds {
fn default() -> Self {
Self {
ephemeral_max_secs: 5.0,
short_lived_max_secs: 60.0,
session_duration_max_secs: 600.0,
long_lived_max_secs: 3600.0,
}
}
}
pub fn generate_retention_intent(
session_duration: &DistributionSummary,
inter_call_gap: &DistributionSummary,
thresholds: &RetentionThresholds,
) -> RetentionIntent {
let tier = if session_duration.p50 <= thresholds.ephemeral_max_secs {
RetentionTier::Ephemeral
} else if session_duration.p50 <= thresholds.short_lived_max_secs {
RetentionTier::ShortLived
} else if session_duration.p50 <= thresholds.session_duration_max_secs {
RetentionTier::SessionDuration
} else if session_duration.p50 <= thresholds.long_lived_max_secs {
RetentionTier::LongLived
} else {
RetentionTier::Permanent
};
RetentionIntent {
recommended_tier: tier,
expected_session_duration_secs: Some(session_duration.p50),
inter_call_gap_p50_ms: Some(inter_call_gap.p50 * 1000.0),
scope_label: SharingScope::Session,
}
}
pub fn generate_retention_intent_default(
session_duration: &DistributionSummary,
inter_call_gap: &DistributionSummary,
) -> RetentionIntent {
generate_retention_intent(
session_duration,
inter_call_gap,
&RetentionThresholds::default(),
)
}