use crate::state::{now_unix_ms, AppState};
use axum::extract::{Path, State};
use axum::http::StatusCode;
use axum::Json;
use dahua_camera_alarms::Alarm;
use serde::Serialize;
#[derive(Debug, Serialize)]
pub struct AlarmsView {
pub active: Vec<Alarm>,
pub history: Vec<Alarm>,
pub safety_notice: &'static str,
}
pub const SAFETY_NOTICE: &str = "Camera IVS/SMD detection is an operator aid. It is NOT \
safety-rated (no SIL, no EN 50128/50129 assessment) and degrades in fog, rain, backlight \
and at range. It MUST NOT be used as an interlock, a permissive, or a condition for \
machine motion. Absence of an alarm means nothing.";
pub async fn list_alarms(State(state): State<AppState>) -> Json<AlarmsView> {
let now = now_unix_ms();
let mut registry = state.alarms.lock().expect("alarm registry mutex");
Json(AlarmsView {
active: registry.active(now),
history: registry.history().to_vec(),
safety_notice: SAFETY_NOTICE,
})
}
pub async fn acknowledge(
State(state): State<AppState>,
Path(id): Path<u64>,
) -> Result<StatusCode, StatusCode> {
let mut registry = state.alarms.lock().expect("alarm registry mutex");
if registry.acknowledge(id) {
Ok(StatusCode::NO_CONTENT)
} else {
Err(StatusCode::NOT_FOUND)
}
}
pub async fn acknowledge_all(State(state): State<AppState>) -> Json<usize> {
let mut registry = state.alarms.lock().expect("alarm registry mutex");
Json(registry.acknowledge_all())
}