use serde_json;
use std::fmt;

pub struct PingResponse {
    pub interface: String,
    pub device_name: String,
    pub serial_number: String,
}

impl PingResponse {
    pub(crate) fn parse(json: &[u8]) -> Option<Self> {
        let object: serde_json::Value = serde_json::from_slice(json).ok()?;

        let ping = object.get("ping")?;

        if ping.is_object() == false {
            return Some(Self {
                interface: "".to_string(),
                device_name: "".to_string(),
                serial_number: "".to_string(),
            });
        }

        Some(Self {
            interface: ping.get("interface").and_then(|value| value.as_str()).unwrap_or("").to_string(),
            device_name: ping.get("name").and_then(|value| value.as_str()).unwrap_or("").to_string(),
            serial_number: ping.get("sn").and_then(|value| value.as_str()).unwrap_or("").to_string(),
        })
    }
}

impl fmt::Display for PingResponse {
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "{}, {}, {}", self.interface, self.device_name, self.serial_number)
    }
}