use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum Severity {
Info,
Warning,
Error,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum DiscrepancyKind {
MissingData,
Mismatch,
Outlier,
TemporalAnomaly,
SpatialAnomaly,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Discrepancy {
pub field: String,
pub severity: Severity,
pub kind: DiscrepancyKind,
pub message: String,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FileDiscrepancies {
pub file_name: String,
pub flags: Vec<Discrepancy>,
pub flag_count: usize,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DeviceDiscrepancies {
pub device_id: String,
pub file_count: usize,
pub flags: Vec<Discrepancy>,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ConsistencySummary {
pub total_files: usize,
pub files_with_flags: usize,
pub total_flags: usize,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TemporalPatterns {
pub mean_interval_seconds: f64,
pub std_interval_seconds: f64,
pub min_interval_seconds: f64,
pub max_interval_seconds: f64,
pub burst_count: usize,
pub gap_count: usize,
pub anomalous_intervals: Vec<TemporalGap>,
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TemporalGap {
pub file_before: String,
pub file_after: String,
pub interval_seconds: f64,
pub z_score: f64,
}