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

private final class ConfirmationDialogModel: ObservableObject {
  @Published var controlled = OneNativeControlled<Bool>(false)
  @Published var title: String = ""
  @Published var message: String = ""
  @Published var presenting: String = ""
  @Published var hasPresenting: Bool = false
  @Published var actions: [OneNativeDialogAction] = []
  @Published var titleVisibility: String = "automatic"
  @Published var accessibility = OneNativeAccessibility()
  @Published var swiftStyle = OneNativeStyle()
  var active = false
  var onSDKEvent: ((String, String) -> Void)?
  func emitSDKEvent(_ name: String, _ value: String) { if active { onSDKEvent?(name, value) } }

  var onChange: ((Bool, Int, Int) -> Void)?
  func change(_ value: Bool) {
    guard active, controlled.value != value else { return }
    controlled.change(value)
    onChange?(value, controlled.eventCount, controlled.revision)
  }
  var onAction: ((String, String, Int) -> Void)?
  private var actionCount = 0
  func action(_ id: String, _ presenting: String) {
    guard active else { return }
    actionCount += 1
    onAction?(id, presenting, actionCount)
  }
}
@objcMembers public final class OneNativeConfirmationDialogView: UIView, OneNativeComposable {
  public var onSDKEvent: ((String, String) -> Void)?

  public var onChange: ((Bool, Int, Int) -> Void)?
  public var onAction: ((String, String, Int) -> Void)?
  private var model = ConfirmationDialogModel()
  private var controller: OneNativeHostingController<OneNativeStandalone<ConfirmationDialogContent>>?
  public override init(frame: CGRect) { super.init(frame: frame) }
  required init?(coder: NSCoder) { fatalError("init(coder:) is unavailable") }
  public func configureAccessibility(_ label: String, hint: String, value: String, identifier: String) {
    let next = OneNativeAccessibility(label: label, hint: hint, value: value, identifier: identifier)
    if model.accessibility != next { model.accessibility = next }
  }
  public func configureStyle(_ style: [String: Any]) {
    let next = OneNativeStyle(dictionary: style)
    if model.swiftStyle != next {
      let previousRows = model.swiftStyle.sdkModifiers.filter { $0.first?.hasPrefix("listRow") == true }
      let nextRows = next.sdkModifiers.filter { $0.first?.hasPrefix("listRow") == true }
      model.swiftStyle = next
      if previousRows != nextRows { compositionParent?.refreshRow(for: self) }
    }
  }
  public func configure(_ value: Bool, acknowledgedEvent: Int, revision: Int, title: String, message: String, presenting: String, hasPresenting: Bool, titleVisibility: String) {
    if let next = model.controlled.applying(value, acknowledged: acknowledgedEvent, revision: revision) { model.controlled = next }
    if model.title != title { model.title = title }
    if model.message != message { model.message = message }
    if model.presenting != presenting { model.presenting = presenting }
    if model.hasPresenting != hasPresenting { model.hasPresenting = hasPresenting }
    if model.titleVisibility != titleVisibility { model.titleVisibility = titleVisibility }
  }
  public func setActions(_ items: [[String: Any]]) { model.actions = items.map { OneNativeDialogAction(id: $0["id"] as! String, label: $0["label"] as! String, role: $0["role"] as! String) } }

  private weak var compositionParent: OneNativeCompositionParent?
  public func compositionContent() -> AnyView { AnyView(ConfirmationDialogContent(model: model)) }
  // composed, activation follows the parent: a subtree mounted before root attachment
  // stays silent until the root attaches.
  public func composeInto(_ parent: OneNativeCompositionParent) {
    controller?.detach(); controller = nil
    compositionParent = parent
    bindCallbacks()
    model.active = parent.compositionActive
  }
  public func decompose() { compositionParent = nil; model.active = false }
  public func propagateActive(_ active: Bool) { model.active = active }
  public override func didMoveToWindow() { super.didMoveToWindow(); updateHost() }
  public override func layoutSubviews() { super.layoutSubviews(); updateHost() }
  private func bindCallbacks() {
    model.onSDKEvent = { [weak self] name, value in self?.onSDKEvent?(name, value) }

    model.onChange = { [weak self] value, count, revision in self?.onChange?(value, count, revision) }
    model.onAction = { [weak self] id, presenting, actionCount in self?.onAction?(id, presenting, actionCount) }
  }
  private func updateHost() {
    guard compositionParent == nil else { return }
    model.active = false
    guard window != nil else { controller?.detach(); return }
    if controller == nil {
      bindCallbacks()
      controller = OneNativeHostingController(rootView: OneNativeStandalone(content: ConfirmationDialogContent(model: model)))
    }
    controller?.attach(to: self)
    model.active = controller?.isAttached == true
  }
  public func reset() {
    compositionParent = nil
    model.active = false; model.onSDKEvent = nil; model.onChange = nil; model.onAction = nil
    controller?.presentedViewController?.dismiss(animated: false)
    controller?.detach(); controller = nil; model = ConfirmationDialogModel()
  }
}
private struct ConfirmationDialogContent: View {
  @ObservedObject var model: ConfirmationDialogModel
  var body: some View {
    Group {
      if !model.hasPresenting {
      Color.clear
        .confirmationDialog(LocalizedStringKey(model.title), isPresented: Binding(
          get: { model.controlled.value },
          set: { value in model.change(value) }
        ), titleVisibility: OneNativeGenerated.visibility(model.titleVisibility)) {
        ForEach(model.actions, id: \.id) { action in
          Button(role: OneNativeGenerated.buttonRole(action.role), action: { model.action(action.id, "") }) {
            Text(action.label)
          }
        }
        } message: {
          if !model.message.isEmpty { Text(model.message) }
        }
    } else {
      Color.clear
        .confirmationDialog(LocalizedStringKey(model.title), isPresented: Binding(
          get: { model.controlled.value },
          set: { value in model.change(value) }
        ), titleVisibility: OneNativeGenerated.visibility(model.titleVisibility),
          presenting: model.presenting) { presenting in
        ForEach(model.actions, id: \.id) { action in
          Button(role: OneNativeGenerated.buttonRole(action.role), action: { model.action(action.id, presenting) }) {
            Text(action.label)
          }
        }
        } message: { _ in
          if !model.message.isEmpty { Text(model.message) }
        }
      }
    }
      .oneNativeAccessibility(model.accessibility)
      .oneNativeStyle(model.swiftStyle, emit: model.emitSDKEvent)
  }
}
