use std::time::UNIX_EPOCH;
use axum::{extract::State, Json};
use chrono::{DateTime, Utc};
use serde::Serialize;
use crate::state::AppState;
#[derive(Debug, Serialize)]
pub struct HealthPayload {
pub status: &'static str,
pub version: &'static str,
pub build_sha: &'static str,
pub uptime_secs: u64,
pub tenant_count: u32,
pub locus_count: u32,
pub queue_depth: u64,
pub queue_oldest_age_secs: u64,
pub sqlite_wal_size_bytes: u64,
pub started_at: String,
}
pub async fn handler(State(s): State<AppState>) -> Json<HealthPayload> {
let queue_depth: u64 = 0;
let queue_oldest_age_secs: u64 = 0;
let status = if queue_depth > 1_000 || queue_oldest_age_secs > 300 {
"degraded"
} else {
"ok"
};
let uptime_secs = s.started_at.elapsed().as_secs();
let sqlite_wal_size_bytes: u64 = 0;
let started_at = s
.started_at_systime
.duration_since(UNIX_EPOCH)
.ok()
.and_then(|d| {
DateTime::<Utc>::from_timestamp(d.as_secs() as i64, d.subsec_nanos())
.map(|dt| dt.to_rfc3339())
})
.unwrap_or_else(|| "1970-01-01T00:00:00+00:00".to_string());
let tenant_count = s.vault.tenant_count().await.unwrap_or(0);
let locus_count = s.vault.locus_count().await.unwrap_or(0);
Json(HealthPayload {
status,
version: s.version,
build_sha: s.build_sha,
uptime_secs,
tenant_count,
locus_count,
queue_depth,
queue_oldest_age_secs,
sqlite_wal_size_bytes,
started_at,
})
}