pub mod estimator;
pub mod policy;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BudgetPressure {
    Calm,
    Elevated,
    Critical,
    Overflow,
}

#[derive(Debug, Clone)]
pub struct SignalBudget {
    pub limit: usize,
    pub used: usize,
}

impl SignalBudget {
    pub fn new(limit: usize) -> Self {
        Self { limit, used: 0 }
    }

    pub fn remaining(&self) -> usize {
        self.limit.saturating_sub(self.used)
    }

    pub fn consume(&mut self, tokens: usize) {
        self.used += tokens;
    }

    pub fn pressure(&self) -> BudgetPressure {
        let pct = self.used as f64 / self.limit as f64;
        match pct {
            p if p >= 1.0 => BudgetPressure::Overflow,
            p if p >= 0.85 => BudgetPressure::Critical,
            p if p >= 0.65 => BudgetPressure::Elevated,
            _ => BudgetPressure::Calm,
        }
    }
}
