use std::fmt;

use serde::Serialize;

use crate::reporter::events::CliEvent;
use crate::reporter::events::binary::Payload;

#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct StreamingScreenEvent(Payload);

impl StreamingScreenEvent {
    pub fn new(payload: Payload) -> Self {
        Self(payload)
    }
}

impl From<StreamingScreenEvent> for CliEvent {
    fn from(event: StreamingScreenEvent) -> Self {
        CliEvent::StreamingScreen(event)
    }
}

impl fmt::Display for StreamingScreenEvent {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.0.fmt(f)
    }
}

#[cfg(test)]
mod tests {
    use serde_json::json;

    use super::*;

    #[test]
    fn reports_a_frame_as_a_file_or_as_base64() {
        let written = StreamingScreenEvent::new(Payload::written(b"AAAA", "front.txt".to_string()));

        assert_eq!(written.to_string(), "wrote 4 bytes to front.txt");
        assert_eq!(
            serde_json::to_value(CliEvent::from(written)).unwrap(),
            json!({"event": "streaming_screen", "bytes": 4, "path": "front.txt"})
        );
    }
}