//! Certain properties of an `NSWindow` cannot be changed after initialization (e.g, the style
//! mask). This configuration object acts as a way to orchestrate enabling customization before the
//! window object is created - it's returned in your `WindowDelegate` object.

use crate::foundation::NSUInteger;
use crate::geometry::Rect;
use crate::window::enums::WindowStyle;

#[derive(Debug)]
pub struct WindowConfig {
    /// The style the window should have.
    pub style: NSUInteger,

    /// The initial dimensions for the window.
    pub initial_dimensions: Rect,

    /// From the Apple docs: 
    ///
    /// _"When true, the window server defers creating the window device 
    /// until the window is moved onscreen. All display messages sent to 
    /// the window or its views are postponed until the window is created, 
    /// just before it’s moved onscreen."_
    ///
    /// You generally just want this to be true, and it's the default for this struct.
    pub defer: bool
}

impl Default for WindowConfig {
    fn default() -> Self {
        let mut config = WindowConfig {
            style: 0,
            initial_dimensions: Rect::new(100., 100., 1024., 768.),
            defer: true
        };

        config.set_styles(&[
            WindowStyle::Resizable, WindowStyle::Miniaturizable, WindowStyle::UnifiedTitleAndToolbar,
            WindowStyle::Closable, WindowStyle::Titled
        ]);

        config
    }
}

impl WindowConfig {
    /// Given a set of styles, converts them to `NSUInteger` and stores them for later use.
    pub fn set_styles(&mut self, styles: &[WindowStyle]) {
        let mut style: NSUInteger = 0;

        for mask in styles {
            let i: NSUInteger = mask.into();
            style = style | i;
        }

        self.style = style;
    }
}