mod helpers;
mod improvement_analyzer;
mod insight_generator;
mod success_analyzer;
#[cfg(test)]
mod tests;
use crate::episode::Episode;
use crate::types::Reflection;
use chrono::Utc;
use tracing::{debug, instrument};
const MAX_REFLECTION_ITEMS: usize = 5;
#[derive(Clone)]
pub struct ReflectionGenerator {
max_items: usize,
}
impl Default for ReflectionGenerator {
fn default() -> Self {
Self::new()
}
}
impl ReflectionGenerator {
#[must_use]
pub fn new() -> Self {
Self {
max_items: MAX_REFLECTION_ITEMS,
}
}
#[must_use]
pub fn with_max_items(max_items: usize) -> Self {
Self { max_items }
}
#[instrument(skip(self, episode), fields(episode_id = %episode.episode_id))]
pub fn generate(&self, episode: &Episode) -> Reflection {
let mut successes = success_analyzer::identify_successes(episode, self.max_items);
let mut improvements = improvement_analyzer::identify_improvements(episode, self.max_items);
let mut insights = insight_generator::generate_insights(episode, self.max_items);
successes.extend(success_analyzer::analyze_success_patterns(episode));
improvements.extend(improvement_analyzer::analyze_improvement_opportunities(
episode,
));
insights.extend(insight_generator::generate_contextual_insights(episode));
successes.truncate(self.max_items);
improvements.truncate(self.max_items);
insights.truncate(self.max_items);
debug!(
successes_count = successes.len(),
improvements_count = improvements.len(),
insights_count = insights.len(),
"Generated reflection"
);
Reflection {
successes,
improvements,
insights,
generated_at: Utc::now(),
}
}
}