tidev 0.2.0

A terminal-based AI coding agent
Documentation
use crate::stats::{Granularity, TimeRangeStats};
use chrono::{DateTime, Utc};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StatsChart {
    TokenUsage,
    ModelUsage,
}

#[derive(Clone, Debug)]
pub struct StatsPanelState {
    pub active: bool,
    pub granularity: Granularity,
    pub selected_chart: StatsChart,
    pub cached_stats: Option<TimeRangeStats>,
    pub last_refresh: Option<DateTime<Utc>>,
    pub scroll_offset: usize,
}

impl Default for StatsPanelState {
    fn default() -> Self {
        Self {
            active: false,
            granularity: Granularity::Hour,
            selected_chart: StatsChart::TokenUsage,
            cached_stats: None,
            last_refresh: None,
            scroll_offset: 0,
        }
    }
}

impl StatsPanelState {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn toggle(&mut self) {
        self.active = !self.active;
    }

    pub fn next_granularity(&mut self) {
        self.granularity = match self.granularity {
            Granularity::Hour => Granularity::Day,
            Granularity::Day => Granularity::Week,
            Granularity::Week => Granularity::Month,
            Granularity::Month => Granularity::Hour,
        };
        self.cached_stats = None;
    }

    pub fn prev_granularity(&mut self) {
        self.granularity = match self.granularity {
            Granularity::Hour => Granularity::Month,
            Granularity::Day => Granularity::Hour,
            Granularity::Week => Granularity::Day,
            Granularity::Month => Granularity::Week,
        };
        self.cached_stats = None;
    }

    pub fn next_chart(&mut self) {
        self.selected_chart = match self.selected_chart {
            StatsChart::TokenUsage => StatsChart::ModelUsage,
            StatsChart::ModelUsage => StatsChart::TokenUsage,
        };
    }

    pub fn prev_chart(&mut self) {
        self.selected_chart = match self.selected_chart {
            StatsChart::TokenUsage => StatsChart::ModelUsage,
            StatsChart::ModelUsage => StatsChart::TokenUsage,
        };
    }

    pub fn needs_refresh(&self) -> bool {
        if self.cached_stats.is_none() {
            return true;
        }
        if let Some(last) = self.last_refresh {
            let elapsed = Utc::now() - last;
            return elapsed.num_seconds() > 30;
        }
        true
    }
}