use serde::{Deserialize, Serialize};

/// Ephemeral agent-activity status of a running surface (orthogonal to the
/// running/stopped process lifecycle). Defaults to `Idle`.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SurfaceState {
    Work,
    Wait,
    Done,
    Error,
    #[default]
    Idle,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn serializes_snake_case() {
        assert_eq!(serde_json::to_string(&SurfaceState::Work).unwrap(), r#""work""#);
        assert_eq!(serde_json::to_string(&SurfaceState::Idle).unwrap(), r#""idle""#);
    }

    #[test]
    fn default_is_idle() {
        assert_eq!(SurfaceState::default(), SurfaceState::Idle);
    }

    #[test]
    fn round_trips() {
        for s in [SurfaceState::Work, SurfaceState::Wait, SurfaceState::Done, SurfaceState::Error, SurfaceState::Idle] {
            let j = serde_json::to_string(&s).unwrap();
            let back: SurfaceState = serde_json::from_str(&j).unwrap();
            assert_eq!(back, s);
        }
    }
}
