use brainwires_core::TaskStatus;
#[derive(Debug, Clone, Default)]
pub struct TaskStats {
pub total: usize,
pub pending: usize,
pub in_progress: usize,
pub completed: usize,
pub failed: usize,
pub blocked: usize,
pub skipped: usize,
}
#[derive(Debug, Clone)]
pub struct TaskTimeInfo {
pub task_id: String,
pub description: String,
pub status: TaskStatus,
pub started_at: Option<i64>,
pub completed_at: Option<i64>,
pub duration_secs: Option<i64>,
pub elapsed_secs: Option<i64>,
}
impl TaskTimeInfo {
pub fn format_duration(&self) -> String {
if let Some(duration) = self.duration_secs {
format_duration_secs(duration)
} else if let Some(elapsed) = self.elapsed_secs {
format!("{}...", format_duration_secs(elapsed))
} else {
"-".to_string()
}
}
}
#[derive(Debug, Clone, Default)]
pub struct TimeStats {
pub total_duration_secs: i64,
pub completed_tasks: usize,
pub average_duration_secs: Option<i64>,
pub current_elapsed_secs: i64,
pub in_progress_tasks: usize,
}
impl TimeStats {
pub fn format_total(&self) -> String {
format_duration_secs(self.total_duration_secs)
}
pub fn format_average(&self) -> String {
if let Some(avg) = self.average_duration_secs {
format_duration_secs(avg)
} else {
"-".to_string()
}
}
pub fn format_elapsed(&self) -> String {
format_duration_secs(self.current_elapsed_secs)
}
}
pub fn format_duration_secs(secs: i64) -> String {
if secs < 0 {
return "-".to_string();
}
let hours = secs / 3600;
let minutes = (secs % 3600) / 60;
let seconds = secs % 60;
if hours > 0 {
format!("{}h {}m", hours, minutes)
} else if minutes > 0 {
format!("{}m {}s", minutes, seconds)
} else {
format!("{}s", seconds)
}
}