import Foundation
import Observation
import SwiftData

/// Composition root for the iOS app. Owns the SwiftData cache container and the
/// iCloud sync engine, and drives the one-shot launch sequence. Injected into the
/// view tree via `.environment(...)`.
@Observable
@MainActor
final class AppServices {
    let container: ModelContainer
    let syncEngine: SyncEngine
    let watchBridge: PhoneConnectivityBridge
    let workoutLauncher = WorkoutLauncher()

    private var bootstrapTask: Task<Void, Never>?

    init() {
        let container = WorkoutsModelContainer.make()
        self.container = container
        self.syncEngine = SyncEngine(container: container)
        self.watchBridge = PhoneConnectivityBridge(container: container, syncEngine: syncEngine)
    }

    /// Launch step: resolve iCloud and reconcile the cache. Idempotent — repeated
    /// callers await the same one-shot task.
    func bootstrap() async {
        if let bootstrapTask { await bootstrapTask.value; return }
        let task = Task { @MainActor [weak self] in
            guard let self else { return }
            await self.syncEngine.connect()
            self.watchBridge.activate()
        }
        bootstrapTask = task
        await task.value
    }
}
