package com.suno.android.common_analytics.di import android.content.Context import com.segment.analytics.kotlin.android.Analytics import com.segment.analytics.kotlin.core.Analytics import com.segment.analytics.kotlin.core.RequestFactory import com.suno.android.common_analytics.hooks.HookAnalyticsManager import com.suno.android.common_analytics.hooks.HookAnalyticsManagerImpl import com.suno.android.common_analytics.hooks.HookClipAnalyticsManager import com.suno.android.common_analytics.hooks.HookClipAnalyticsManagerImpl import com.suno.android.common_analytics.listening_source.ListeningSourceCache import com.suno.android.common_analytics.listening_source.ListeningSourceCacheImpl import com.suno.android.common_analytics.managers.AnalyticsManager import com.suno.android.common_analytics.managers.AnalyticsManagerImpl import com.suno.android.common_analytics.orpheus.OrpheusAnalyticsManager import com.suno.android.common_analytics.orpheus.OrpheusAnalyticsManagerImpl import com.suno.android.common_core_utils.environment.EnvironmentConstantsProvider import com.suno.android.common_data.user.UserService import dagger.Binds import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import dagger.multibindings.IntoSet import java.net.HttpURLConnection import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) interface AnalyticsModule { @Binds @Singleton fun bindHookAnalyticsManager( impl: HookAnalyticsManagerImpl, ): HookAnalyticsManager @Binds @Singleton fun bindHookClipAnalyticsManager( impl: HookClipAnalyticsManagerImpl, ): HookClipAnalyticsManager @Binds @Singleton fun bindOrpheusAnalyticsManager( impl: OrpheusAnalyticsManagerImpl, ): OrpheusAnalyticsManager @Binds fun bindAnalyticsManager( impl: AnalyticsManagerImpl, ): AnalyticsManager @Binds @IntoSet fun bindAnalyticsManagerUserService( impl: AnalyticsManagerImpl, ): UserService @Binds @Singleton fun bindListeningSourceCache( impl: ListeningSourceCacheImpl, ): ListeningSourceCache companion object { @Provides @Singleton fun provideSegment( @ApplicationContext context: Context, environmentConstantsProvider: EnvironmentConstantsProvider, ): Analytics { val environmentConstants = environmentConstantsProvider.environmentConstants return Analytics( writeKey = environmentConstants.segmentWriteKey, context = context, configs = { trackApplicationLifecycleEvents = true flushAt = 10 flushInterval = 10 apiHost = environmentConstants.segmentProxyEndpoint cdnHost = environmentConstants.segmentProxyEndpoint requestFactory = object : RequestFactory() { override fun upload( apiHost: String, ): HttpURLConnection { val connection: HttpURLConnection = openConnection("https://$apiHost/b") connection.setRequestProperty("Content-Type", "application/json") connection.doOutput = true connection.setChunkedStreamingMode(0) return connection } } }, ) } } }