use nanometrics_agent::payload::{AgentMetrics, SmartMetrics};

#[test]
fn test_serialize_json_complet() {
    let m = AgentMetrics {
        hostname: "srv-01".to_string(),
        ip: "10.0.0.11".to_string(),
        cpu_percent: Some(42.5),
        memory_used: Some(3_000_000_000),
        memory_free: Some(5_000_000_000),
        memory_total: Some(8_000_000_000),
        hdd_used: Some(60_000_000_000),
        hdd_free: Some(140_000_000_000),
        hdd_total: Some(200_000_000_000),
        uptime: Some(1234567),
        network_rx: Some(1024),
        network_tx: Some(512),
        temperature: None,
        smart: None,
        status: "online".to_string(),
        version: "0.0.0".to_string(),
    };
    let json = serde_json::to_string(&m).unwrap();
    assert!(json.contains("\"hostname\":\"srv-01\""));
    assert!(json.contains("\"cpu_percent\":42.5"));
    assert!(json.contains("\"status\":\"online\""));
    assert!(json.contains("\"temperature\":null"));
}

#[test]
fn test_serialize_avec_smart() {
    let m = AgentMetrics {
        hostname: "srv-01".to_string(),
        ip: "10.0.0.11".to_string(),
        smart: Some(SmartMetrics {
            passed: true,
            temperature: Some(34),
            reallocated_sectors: Some(0),
            power_on_hours: Some(4213),
            wear_level: Some(98),
        }),
        status: "online".to_string(),
        ..Default::default()
    };
    let json = serde_json::to_string(&m).unwrap();
    assert!(json.contains("\"passed\":true"));
    assert!(json.contains("\"temperature\":34"));
}

#[test]
fn test_deserialize_depuis_json() {
    let json = r#"{"hostname":"host1","ip":"10.0.0.1","status":"online","cpu_percent":55.0,"memory_used":null,"memory_free":null,"memory_total":null,"hdd_used":null,"hdd_free":null,"hdd_total":null,"uptime":null,"network_rx":null,"network_tx":null,"temperature":null,"smart":null}"#;
    let m: AgentMetrics = serde_json::from_str(json).unwrap();
    assert_eq!(m.hostname, "host1");
    assert_eq!(m.cpu_percent, Some(55.0));
    assert!(m.smart.is_none());
}
