use cstats_core::{config::Config, stats::StatsAggregator, Result};
use tracing::info;
use crate::{AnalyzeArgs, OutputFormat};
use super::{parse_datetime, print_output};
pub async fn analyze_command(
args: AnalyzeArgs,
_config: &Config,
format: OutputFormat,
) -> Result<()> {
info!("Starting analysis");
let aggregator = StatsAggregator::new();
if aggregator.record_count() == 0 {
println!("No statistics records found matching the criteria");
return Ok(());
}
if args.group_by_source {
let summaries = aggregator.summarize_by_source()?;
print_output(&summaries, format)?;
} else if let (Some(start_str), Some(end_str)) = (&args.start_time, &args.end_time) {
let start = parse_datetime(start_str)?;
let end = parse_datetime(end_str)?;
let summary = aggregator.summarize_time_range(start, end)?;
print_output(&summary, format)?;
} else {
let summary = aggregator.summarize()?;
print_output(&summary, format)?;
}
info!("Analysis completed");
Ok(())
}
#[allow(dead_code)] pub fn display_summary(summary: &cstats_core::stats::StatsSummary) {
println!("\n=== Statistics Summary ===");
println!("Records processed: {}", summary.count);
println!(
"Time range: {} to {}",
summary.time_range.0, summary.time_range.1
);
println!("Sources: {}", summary.sources.join(", "));
println!("\n=== Metrics ===");
for (name, metric) in &summary.metrics {
println!("\n{}:", name);
println!(" Count: {}", metric.count);
println!(" Min: {:.2}", metric.min);
println!(" Max: {:.2}", metric.max);
println!(" Average: {:.2}", metric.avg);
println!(" Sum: {:.2}", metric.sum);
if let Some(std_dev) = metric.std_dev {
println!(" Standard Deviation: {:.2}", std_dev);
}
if let Some(percentiles) = metric.percentiles {
println!(" Percentiles:");
println!(" 50th: {:.2}", percentiles[0]);
println!(" 90th: {:.2}", percentiles[1]);
println!(" 95th: {:.2}", percentiles[2]);
println!(" 99th: {:.2}", percentiles[3]);
}
}
}