import AdamantiumClient
import AttributionAndDeeplinkingClient
import BrazeClient
import ClerkClient
import DebugFeatureClient
import Dependencies
import FirebaseClient
import Foundation
import OSLog
import PaywallClient
import ShareAssetClient
import StatsigClient

public enum AppStartUpClientFactory {
    public static func liveKey() -> AppStartUpClient {
        @Dependency(\.firebaseClient) var firebaseClient
        @Dependency(BrazeClient.self) var brazeClient
        @Dependency(ClerkClient.self) var clerkClient
        @Dependency(PaywallClient.self) var paywallClient
        @Dependency(StatsigClient.self) var statsigClient
        @Dependency(AdamantiumClient.self) var adamantiumClient
        @Dependency(ShareAssetClient.self) var shareAssetClient
        @Dependency(AttributionAndDeeplinkingClient.self) var attributionClient
        @Dependency(DebugFeatureClient.self) var debugFeatureClient

        let sdkManager: SDKManagerProtocol = DependencySDKManager(
            firebaseClient: firebaseClient,
            brazeClient: brazeClient,
            clerkClient: clerkClient,
            paywallClient: paywallClient,
            statsigClient: statsigClient,
            adamantiumClient: adamantiumClient,
            shareAssetClient: shareAssetClient,
            attributionClient: attributionClient,
            debugFeatureClient: debugFeatureClient
        )
        let metricsCollector: MetricsCollectorProtocol = DefaultMetricsCollector()
        let logger = Logger(category: "app_start_up")

        return AppStartUpClient(
            logger: logger,
            orchestratorFactory: {
                let dependencies = SDKDependencyConfig.default.dependencies
                let sdkStates = dependencies.keys.reduce(into: [SDKIdentifier: SDKState]()) { $0[$1] = .notStarted }

                return AppStartUpOrchestrator(
                    sdkManager: sdkManager,
                    metricsCollector: metricsCollector,
                    dependencies: dependencies,
                    sdkStates: sdkStates,
                    firebaseClient: firebaseClient
                )
            }
        )
    }
}
