// AUTO-GENERATED from gstack/ios-qa/templates/DebugBridgeManager.swift.template
//
// Bootstraps StateServer on app launch. Lives in DebugBridgeCore (no UIKit
// dependency). The DebugOverlay install is wired separately by the consuming
// app — it lives in DebugBridgeUI which depends on DebugBridgeCore (not the
// other way around). Everything is #if DEBUG-gated; this file does not exist
// in Release builds.

#if DEBUG

import Foundation

@MainActor
public final class DebugBridgeManager {
    public static let shared = DebugBridgeManager()

    public func start(appState: AppState) {
        // 1. Register the canonical AppState struct + accessor wiring.
        //    AppStateAccessor.register(_:) is generated by gen-accessors-tool.
        AppStateAccessor.register(appState)

        // 2. Boot the StateServer.
        StateServer.shared.start()

        // 3. The consuming app installs DebugOverlayWindow separately. See
        //    the example in DebugBridgeWiring.swift.template:
        //
        //      #if canImport(UIKit)
        //      DebugOverlayWindow.shared.install(recording: recording)
        //      #endif
    }
}

// Placeholder. gen-accessors-tool emits the real `AppStateAccessor` enum next
// to the app's canonical state struct. Apps that haven't run codegen get a
// stub that registers no accessors (snapshot is empty, restore returns
// missing-key for every key).
@MainActor
public enum AppStateAccessor {
    public static var register: (Any) -> Void = { _ in }
}

// Apps declare their canonical state struct; codegen reads it and emits
// AppStateAccessor.register. The app's struct must be `@Observable` and
// must hold all snapshot-eligible state in `@Snapshotable`-marked fields.
@MainActor
public protocol AppState: AnyObject {}

#endif // DEBUG
