1
0
Files
Toak/Commands/StatsCommand.cs

54 lines
1.9 KiB
C#

using Spectre.Console;
using Toak.Core;
namespace Toak.Commands;
public static class StatsCommand
{
public static Task ExecuteAsync(bool verbose)
{
Logger.Verbose = verbose;
var entries = new HistoryManager().LoadHistory();
if (entries.Count == 0)
{
AnsiConsole.MarkupLine("[yellow]No history found. Cannot generate statistics.[/]");
return Task.CompletedTask;
}
var totalCount = entries.Count;
var totalDuration = TimeSpan.FromMilliseconds(entries.Sum(e => e.DurationMs));
var avgDuration = TimeSpan.FromMilliseconds(entries.Average(e => e.DurationMs));
var mostActiveDay = entries
.GroupBy(e => e.Timestamp.Date)
.OrderByDescending(g => g.Count())
.FirstOrDefault();
var topWords = entries
.SelectMany(e => e.RefinedText.Split([' ', '.', ',', '!', '?'], StringSplitOptions.RemoveEmptyEntries))
.Where(w => w.Length > 3) // Exclude short common words
.GroupBy(w => w.ToLowerInvariant())
.OrderByDescending(g => g.Count())
.Take(5)
.Select(g => g.Key)
.ToList();
AnsiConsole.MarkupLine("\n[bold blue]Toak Usage Statistics[/]");
AnsiConsole.MarkupLine($"[dim]Total recordings:[/] {totalCount}");
AnsiConsole.MarkupLine($"[dim]Total duration:[/] {totalDuration.TotalMinutes:F1}m");
AnsiConsole.MarkupLine($"[dim]Average processing latency:[/] {avgDuration.TotalSeconds:F2}s");
if (mostActiveDay != null)
{
AnsiConsole.MarkupLine($"[dim]Most active day:[/] {mostActiveDay.Key:yyyy-MM-dd} ({mostActiveDay.Count()} recordings)");
}
if (topWords.Count > 0)
{
AnsiConsole.MarkupLine($"[dim]Top spoken words (>3 chars):[/] {string.Join(", ", topWords)}");
}
return Task.CompletedTask;
}
}