use crate::clients::wayland::ToplevelInfo;

/// Open state for a launcher item, or item window.
#[derive(Debug, Clone, Eq, PartialEq, Copy)]
pub enum OpenState {
    Closed,
    Open { focused: bool },
}

impl From<&ToplevelInfo> for OpenState {
    fn from(info: &ToplevelInfo) -> Self {
        Self::Open {
            focused: info.focused,
        }
    }
}

impl OpenState {
    /// Creates open with focused
    pub const fn focused(focused: bool) -> Self {
        Self::Open { focused }
    }

    /// Checks if open
    pub fn is_open(self) -> bool {
        self != Self::Closed
    }

    /// Checks if open with focus
    pub const fn is_focused(self) -> bool {
        matches!(self, Self::Open { focused: true })
    }

    /// Merges states together to produce a single state.
    /// This is effectively an OR operation,
    /// so sets state to open and flags to true if any state is open
    /// or any instance of the flag is true.
    pub fn merge_states(states: &[&Self]) -> Self {
        states.iter().fold(Self::Closed, |merged, current| {
            if merged.is_open() || current.is_open() {
                Self::Open {
                    focused: merged.is_focused() || current.is_focused(),
                }
            } else {
                Self::Closed
            }
        })
    }
}
