cstats-cli 0.1.1

Command line interface for cstats
//! Analyze command implementation

use cstats_core::{config::Config, stats::StatsAggregator, Result};
use tracing::info;

use crate::{AnalyzeArgs, OutputFormat};

use super::{parse_datetime, print_output};

/// Analyze collected statistics
pub async fn analyze_command(
    args: AnalyzeArgs,
    _config: &Config,
    format: OutputFormat,
) -> Result<()> {
    info!("Starting analysis");

    // For now, we'll create a dummy aggregator with some sample data
    // In a real implementation, this would load data from the database or cache
    let aggregator = StatsAggregator::new();

    // TODO: Load actual data based on filters
    // This would typically involve:
    // 1. Loading records from database/cache
    // 2. Applying source filter if specified
    // 3. Applying time range filter if specified
    // 4. Filtering by requested metrics

    if aggregator.record_count() == 0 {
        println!("No statistics records found matching the criteria");
        return Ok(());
    }

    // Generate analysis based on arguments
    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(())
}

/// Display analysis results in human-readable format
#[allow(dead_code)] // Will be used for future text output formatting
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]);
        }
    }
}