struct SDKDependencyConfig {
    let dependencies: [SDKIdentifier: SDKDependency]
}

extension SDKDependencyConfig {
    static var `default`: Self {
        Self(dependencies: .defaultDependencies)
    }
}

extension [SDKIdentifier: SDKDependency] {
    static var defaultDependencies: Self {
        [
            .firebase: SDKDependency(
                phase: .essential,
                requirements: [],
                timeout: 5.0,
                isOptional: false,
                mustBeOnMainThread: true
            ),
            .braze: SDKDependency(
                phase: .critical,
                requirements: [.firebase],
                timeout: 10.0,
                isOptional: false,
                mustBeOnMainThread: true
            ),
            .clerk: SDKDependency(
                phase: .critical,
                requirements: [],
                timeout: 15.0,
                isOptional: false,
                mustBeOnMainThread: false
            ),
            .revenueCat: SDKDependency(
                phase: .critical,
                requirements: [.firebase],
                timeout: 8.0,
                isOptional: false,
                mustBeOnMainThread: true
            ),
            .statsig: SDKDependency(
                phase: .critical,
                // If the user is authenticated, we use their id to initialize Statsig so cached values
                // become available immediately.
                //
                // We need to use this authenticated user's id to initialize Statsig in order for Statsig
                // to return the desired values for this user.
                timeout: 10.0,
                isOptional: false,
                mustBeOnMainThread: true
            ),
            .adamantium: SDKDependency(
                phase: .optional,
                requirements: [],
                timeout: 5.0,
                isOptional: true,
                mustBeOnMainThread: false
            ),
            .shareAsset: SDKDependency(
                phase: .optional,
                requirements: [],
                timeout: 5.0,
                isOptional: true,
                mustBeOnMainThread: false
            ),
            .attribution: SDKDependency(
                phase: .optional,
                requirements: [],
                timeout: 5.0,
                isOptional: true,
                mustBeOnMainThread: false
            ),
            .rageshake: SDKDependency(
                phase: .optional,
                requirements: [.statsig],
                timeout: 3.0,
                isOptional: true,
                mustBeOnMainThread: true
            ),
        ]
    }
}
