use crate::analytics::usage_stats::{display_usage_overview, BarChart, UsageAnalyzer};
use crate::cli::UsageCommands;
use anyhow::Result;
use colored::Colorize;
pub async fn handle(
command: Option<UsageCommands>,
days: Option<u64>,
tokens_only: bool,
requests_only: bool,
limit: Option<usize>,
) -> Result<()> {
let days_u32 = days.map(|d| d as u32);
let limit_val = limit.unwrap_or(10);
let analyzer = UsageAnalyzer::new()?;
let stats = analyzer.get_usage_stats(days_u32)?;
if stats.total_requests == 0 {
println!("{} No usage data found", "âšī¸".blue());
if days.is_some() {
println!("Try expanding the time range or check if you have any logged interactions.");
}
return Ok(());
}
match command {
Some(UsageCommands::Daily { count }) => {
let value_type = determine_value_type(tokens_only, requests_only);
BarChart::render_time_series(
"đ
Daily Usage",
&stats.daily_usage,
value_type,
50,
count.min(limit_val),
);
}
Some(UsageCommands::Weekly { count }) => {
let value_type = determine_value_type(tokens_only, requests_only);
BarChart::render_time_series(
"đ Weekly Usage",
&stats.weekly_usage,
value_type,
50,
count.min(limit_val),
);
}
Some(UsageCommands::Monthly { count }) => {
let value_type = determine_value_type(tokens_only, requests_only);
BarChart::render_time_series(
"đ Monthly Usage",
&stats.monthly_usage,
value_type,
50,
count.min(limit_val),
);
}
Some(UsageCommands::Yearly { count }) => {
let value_type = determine_value_type(tokens_only, requests_only);
BarChart::render_time_series(
"đ Yearly Usage",
&stats.yearly_usage,
value_type,
50,
count.min(limit_val),
);
}
Some(UsageCommands::Models { count }) => {
let value_type = determine_value_type(tokens_only, requests_only);
BarChart::render_horizontal(
"đ¤ Top Models by Usage",
&stats.model_usage,
value_type,
50,
count.min(limit_val),
);
}
None => {
display_usage_overview(&stats);
if !tokens_only && !requests_only {
BarChart::render_horizontal(
"đ¤ Top Models by Token Usage",
&stats.model_usage,
"tokens",
50,
limit_val.min(5),
);
BarChart::render_time_series(
"đ
Recent Daily Usage (Tokens)",
&stats.daily_usage,
"tokens",
50,
limit_val.min(14),
);
} else if tokens_only {
BarChart::render_horizontal(
"đ¤ Top Models by Token Usage",
&stats.model_usage,
"tokens",
50,
limit_val.min(10),
);
BarChart::render_time_series(
"đ
Recent Daily Token Usage",
&stats.daily_usage,
"tokens",
50,
limit_val.min(14),
);
} else if requests_only {
BarChart::render_horizontal(
"đ¤ Top Models by Request Count",
&stats.model_usage,
"requests",
50,
limit_val.min(10),
);
BarChart::render_time_series(
"đ
Recent Daily Request Count",
&stats.daily_usage,
"requests",
50,
limit_val.min(14),
);
}
}
}
Ok(())
}
fn determine_value_type(tokens_only: bool, requests_only: bool) -> &'static str {
if tokens_only {
"tokens"
} else if requests_only {
"requests"
} else {
"tokens" }
}