limitdeck 0.1.6

A privacy-safe terminal dashboard for AI subscription limits
use std::time::{Duration, SystemTime};

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PlanIdentity {
    pub id: String,
    pub provider_id: String,
    pub display_name: String,
}

impl PlanIdentity {
    pub fn new(
        id: impl Into<String>,
        provider_id: impl Into<String>,
        display_name: impl Into<String>,
    ) -> Self {
        Self {
            id: id.into(),
            provider_id: provider_id.into(),
            display_name: display_name.into(),
        }
    }
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum UsageStatus {
    Available,
    Unavailable,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct UsageWindow {
    pub id: String,
    pub label: String,
    pub period: Option<Duration>,
    pub remaining_percent: u8,
    pub resets_at: Option<SystemTime>,
    pub status: UsageStatus,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CodingPlan {
    pub id: String,
    pub provider_id: String,
    pub display_name: String,
    pub fetched_at: SystemTime,
    pub windows: Vec<UsageWindow>,
}

impl CodingPlan {
    pub fn is_older_than(&self, max_age: Duration) -> bool {
        SystemTime::now()
            .duration_since(self.fetched_at)
            .map(|age| age > max_age)
            .unwrap_or(false)
    }
}