///|
/// Declarative sizing hint used by manifest windows.
pub(all) enum WindowSizeHint {
  None
  Fixed
  Min
  Max
} derive(Debug, Eq)

///|
/// Controls whether web content remains below or extends beneath the native
/// titlebar. Platforms without overlay support keep the default titlebar.
pub(all) enum TitlebarStyle {
  Default
  Overlay
} derive(Debug, Eq)

///|
pub impl Show for TitlebarStyle with fn output(self, logger) {
  match self {
    Default => logger.write_string("Default")
    Overlay => logger.write_string("Overlay")
  }
}

///|
pub impl Show for WindowSizeHint with fn output(self, logger) {
  match self {
    None => logger.write_string("None")
    Fixed => logger.write_string("Fixed")
    Min => logger.write_string("Min")
    Max => logger.write_string("Max")
  }
}

///|
/// Declarative window settings consumed by runtime manifests.
pub struct WindowManifest {
  title : String
  width : Int
  height : Int
  size_hint : WindowSizeHint
  titlebar_style : TitlebarStyle
} derive(Debug, Eq)

///|
pub impl Show for WindowManifest with fn output(self, logger) {
  logger.write_string("WindowManifest::{ title: ")
  logger.write_object(self.title)
  logger.write_string(", width: ")
  logger.write_object(self.width)
  logger.write_string(", height: ")
  logger.write_object(self.height)
  logger.write_string(", size_hint: ")
  logger.write_object(self.size_hint)
  logger.write_string(", titlebar_style: ")
  logger.write_object(self.titlebar_style)
  logger.write_string(" }")
}

///|
/// Declarative secondary window entry consumed by runtime manifests.
pub struct AppWindowManifest {
  id : String
  window : WindowManifest
  entry : AppEntry
  open_on_start : Bool
} derive(Debug, Eq)

///|
pub impl Show for AppWindowManifest with fn output(self, logger) {
  logger.write_string("AppWindowManifest::{ id: ")
  logger.write_object(self.id)
  logger.write_string(", window: ")
  logger.write_object(self.window)
  logger.write_string(", entry: ")
  logger.write_object(self.entry)
  logger.write_string(", open_on_start: ")
  logger.write_object(self.open_on_start)
  logger.write_string(" }")
}

///|
/// Builds a manifest window configuration.
/// This is the declarative window shape consumed by bootstrap and later turned
/// into runtime `WindowConfig` values.
pub fn WindowManifest::new(
  title : String,
  width : Int,
  height : Int,
  size_hint? : WindowSizeHint = WindowSizeHint::None,
  titlebar_style? : TitlebarStyle = TitlebarStyle::Default,
) -> WindowManifest {
  WindowManifest::{ title, width, height, size_hint, titlebar_style }
}

///|
/// Builds a declarative secondary window entry.
/// Secondary windows keep their own id, window settings, and entry payload in
/// the manifest document.
pub fn AppWindowManifest::new(
  id : String,
  window : WindowManifest,
  entry : AppEntry,
  open_on_start? : Bool = true,
) -> AppWindowManifest {
  AppWindowManifest::{ id, window, entry, open_on_start }
}