///|
/// Site configuration: all user-facing settings for a Yuegui site.
pub(all) struct YueguiConfig {
  title : String
  description : String
  language : String
  base_url : String
  source_dir : String
  theme_dir : String
  output_dir : String
  auto_navigation : Bool
  navigation : NavigationConfig
  /// e.g. { "toc": { "permalink": "#", "baselevel": 1 }, "code-copy": true }
  /// Each extension defines its own value structure.
  markdown_extensions : Map[String, ConfigJson]
  /// Plugin configuration. Placeholder for future ecosystem.
  /// Empty array means no plugins enabled.
  plugins : Array[PluginConfig]
  /// Extra data for themes / plugins.
  /// Analogous to Hugo's [params].
  extra : Map[String, ConfigJson]
  typst_mode : String
  typst_fallback : String
  dev_port : Int
  dev_host : String
}

///|
/// Flexible JSON-like value for extensible configuration (markdown_extensions, extra, plugin options).
pub(all) enum ConfigJson {
  CJNull
  CJBool(Bool)
  CJInt(Int)
  CJDouble(Double)
  CJString(String)
  CJArray(Array[ConfigJson])
  CJObject(Map[String, ConfigJson])
}

///|
/// Default site configuration values.
pub fn default_yuegui_config() -> YueguiConfig {
  {
    title: "My Site",
    description: "",
    language: "en",
    base_url: "",
    source_dir: "content",
    theme_dir: "theme",
    output_dir: "public",
    auto_navigation: false,
    navigation: { nav: [], sidebar: {} },
    markdown_extensions: {},
    plugins: [],
    extra: {},
    typst_mode: "semantic-html",
    typst_fallback: "svg-embed",
    dev_port: 3000,
    dev_host: "127.0.0.1",
  }
}