// generated by bun run generate from the SwiftUI SDK and codegen/catalog.ts.
// edit the generator or catalog, then regenerate.
import SwiftUI

enum OneNativeMenuKind: String {
  case action
  case toggle
  case submenu
  case section
  case controlGroup
  case picker
  case divider
}
struct OneNativeMenuNode: Identifiable {
  let parentId: String
  let type: OneNativeMenuKind
  let id: String
  let title: String
  let systemImage: String
  let role: String
  let disabled: Bool
  let hidden: Bool
  let help: String
  let controlGroupStyle: String
  let values: [Bool]
  let selection: String
  let menuOrder: String
  let menuActionDismissBehavior: String
  init(_ item: [String: Any]) {
    parentId = item["parentId"] as! String
    type = OneNativeMenuKind(rawValue: item["type"] as! String)!
    id = item["id"] as! String
    title = item["title"] as! String
    systemImage = item["systemImage"] as! String
    role = item["role"] as! String
    disabled = item["disabled"] as! Bool
    hidden = item["hidden"] as! Bool
    help = item["help"] as! String
    controlGroupStyle = item["controlGroupStyle"] as! String
    values = item["values"] as! [Bool]
    selection = item["selection"] as! String
    menuOrder = item["menuOrder"] as! String
    menuActionDismissBehavior = item["menuActionDismissBehavior"] as! String
  }
}
struct OneNativeMenuLabel: View {
  let item: OneNativeMenuNode
  var body: some View {
    if item.systemImage.isEmpty { Text(item.title) }
    else { Label(item.title, systemImage: item.systemImage) }
  }
}
struct OneNativeGeneratedMenuContent: View {
  @ObservedObject var model: OneNativeMenuModel
  let parentId: String
  var body: some View {
    ForEach(model.children[parentId] ?? []) { item in
      if !item.hidden {
        Group {
          switch item.type {
          case .action:
            Button(role: OneNativeGenerated.buttonRole(item.role), action: { model.action(item.id) }) { OneNativeMenuLabel(item: item) }
          case .toggle:
            Toggle(sources: item.values.indices.map { index in Binding(get: { let values = model.controlled.value[item.id] ?? []; return values.indices.contains(index) && values[index] }, set: { model.changeValue(item.id, index: index, value: $0) }) }, isOn: \.self) { OneNativeMenuLabel(item: item) }
          case .submenu:
            Menu { OneNativeGeneratedMenuContent(model: model, parentId: item.id) } label: { OneNativeMenuLabel(item: item) }
          case .section:
            Section { OneNativeGeneratedMenuContent(model: model, parentId: item.id) } header: { if !item.title.isEmpty { Text(item.title) } }
          case .controlGroup:
            ControlGroup { OneNativeGeneratedMenuContent(model: model, parentId: item.id) } label: { OneNativeMenuLabel(item: item) }.oneNativeControlGroupStyle(item.controlGroupStyle)
          case .picker:
            OneNativeMenuPicker(model: model, item: item)
          case .divider:
            Divider()
          }
        }
        .disabled(item.disabled)
        .help(item.help)
        .oneNativeMenuOrder(item.menuOrder)
        .oneNativeMenuActionDismissBehavior(item.menuActionDismissBehavior)
      }
    }
  }
}
