package com.rosetta.messenger

import android.app.Application
import com.airbnb.lottie.L
import com.rosetta.messenger.data.AccountManager
import com.rosetta.messenger.data.DraftManager
import com.rosetta.messenger.data.GroupRepository
import com.rosetta.messenger.data.MessageRepository
import com.rosetta.messenger.network.CallManager
import com.rosetta.messenger.network.ProtocolRuntime
import com.rosetta.messenger.network.ProtocolRuntimeAccess
import com.rosetta.messenger.network.TransportManager
import com.rosetta.messenger.update.UpdateManager
import com.rosetta.messenger.utils.CrashReportManager
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject

/**
 * Application класс для инициализации глобальных компонентов приложения
 */
@HiltAndroidApp
class RosettaApplication : Application() {

    @Inject lateinit var messageRepository: MessageRepository
    @Inject lateinit var groupRepository: GroupRepository
    @Inject lateinit var accountManager: AccountManager
    @Inject lateinit var protocolRuntime: ProtocolRuntime
    
    companion object {
        private const val TAG = "RosettaApplication"
    }
    
    override fun onCreate() {
        super.onCreate()
        
        // Убираем красную букву "L" от Lottie
        L.setTraceEnabled(false)
        
        // Инициализируем crash reporter
        initCrashReporting()

        // Install instance-based protocol runtime for non-Hilt singleton objects.
        ProtocolRuntimeAccess.install(protocolRuntime)
        
        // Инициализируем менеджер черновиков
        DraftManager.init(this)
        
        // Инициализируем менеджер транспорта файлов (streaming download)
        TransportManager.init(this)
        
        // Инициализируем менеджер обновлений (SDU)
        UpdateManager.init(this)

        CallManager.bindDependencies(
            messageRepository = messageRepository,
            accountManager = accountManager
        )
        
    }
    
    /**
     * Инициализация системы сбора crash reports
     */
    private fun initCrashReporting() {
        try {
            CrashReportManager.init(this)
        } catch (e: Exception) {
        }
    }
}
