lowfat 0.2.5

CLI binary for lowfat
use crate::filters;
use anyhow::Result;
use lowfat_core::config::RunfConfig;
use lowfat_plugin::discovery::discover_plugins;

pub fn run() -> Result<()> {
    let config = RunfConfig::resolve();

    let all_filters = filters::builtins();
    let external = discover_plugins(&config.plugin_dir);

    let filter_count = all_filters
        .keys()
        .filter(|cmd| config.is_enabled(cmd))
        .count()
        + external
            .iter()
            .filter(|p| {
                p.manifest
                    .plugin
                    .commands
                    .iter()
                    .all(|c| config.is_enabled(c))
            })
            .count();

    let saved_str = if let Ok(db) = lowfat_core::db::Db::open(&config.data_dir) {
        // Use SQLite's date('now') for today — avoids chrono dependency
        if let Ok(session) = db.session_summary(&today_utc()) {
            if session.saved_tokens > 1000 {
                format!("{:.1}K saved", session.saved_tokens as f64 / 1000.0)
            } else {
                format!("{} saved", session.saved_tokens)
            }
        } else {
            "0 saved".to_string()
        }
    } else {
        "0 saved".to_string()
    };

    println!("lowfat:{}|{}f|{}", config.level, filter_count, saved_str);
    Ok(())
}

/// Get today's date as YYYY-MM-DD in UTC, using only std.
fn today_utc() -> String {
    let secs = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap_or_default()
        .as_secs();
    let days = secs / 86400;

    // Civil date from days since epoch (algorithm from Howard Hinnant)
    let z = days as i64 + 719468;
    let era = z / 146097;
    let doe = z - era * 146097;
    let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
    let y = yoe + era * 400;
    let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
    let mp = (5 * doy + 2) / 153;
    let d = doy - (153 * mp + 2) / 5 + 1;
    let m = if mp < 10 { mp + 3 } else { mp - 9 };
    let y = if m <= 2 { y + 1 } else { y };

    format!("{y:04}-{m:02}-{d:02}")
}