use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{Duration, SystemTime};
use super::hardware::DeviceStatus;
use super::types::{AlertType, ComponentStatus, IssueSeverity, SystemStatus};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemState {
pub overall_status: SystemStatus,
pub component_states: HashMap<String, ComponentState>,
pub active_alerts: Vec<ActiveAlert>,
pub performance_summary: PerformanceSummary,
pub resource_utilization: SystemResourceUtilization,
pub last_update: SystemTime,
}
impl Default for SystemState {
fn default() -> Self {
Self::new()
}
}
impl SystemState {
pub fn new() -> Self {
Self {
overall_status: SystemStatus::Healthy,
component_states: HashMap::new(),
active_alerts: vec![],
performance_summary: PerformanceSummary {
performance_score: 0.9,
throughput: 100.0,
latency_percentiles: HashMap::new(),
error_rates: HashMap::new(),
availability: 0.99,
},
resource_utilization: SystemResourceUtilization {
cpu_utilization: 0.5,
memory_utilization: 0.6,
storage_utilization: 0.4,
network_utilization: 0.3,
quantum_utilization: Some(0.7),
},
last_update: SystemTime::now(),
}
}
pub fn update_component_state(&mut self, component_id: &str, _status: &DeviceStatus) {
let component_state = ComponentState {
component_name: component_id.to_string(),
status: ComponentStatus::Healthy, last_heartbeat: SystemTime::now(),
metrics: HashMap::new(),
alerts: vec![],
};
self.component_states
.insert(component_id.to_string(), component_state);
self.last_update = SystemTime::now();
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentState {
pub component_name: String,
pub status: ComponentStatus,
pub last_heartbeat: SystemTime,
pub metrics: HashMap<String, f64>,
pub alerts: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActiveAlert {
pub alert_id: String,
pub alert_type: AlertType,
pub severity: IssueSeverity,
pub message: String,
pub timestamp: SystemTime,
pub acknowledged: bool,
pub acknowledged_by: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceSummary {
pub performance_score: f64,
pub throughput: f64,
pub latency_percentiles: HashMap<String, Duration>,
pub error_rates: HashMap<String, f64>,
pub availability: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemResourceUtilization {
pub cpu_utilization: f64,
pub memory_utilization: f64,
pub storage_utilization: f64,
pub network_utilization: f64,
pub quantum_utilization: Option<f64>,
}