package com.example.godeye

import android.app.Application
import com.example.godeye.utils.ErrorHandler
import com.example.godeye.utils.Logger

/**
 * GodEyeApplication - главный класс приложения для инициализации глобальных компонентов
 * Соответствует требованиям ТЗ для правильной инициализации приложения
 */
class GodEyeApplication : Application() {

    private val errorHandler = ErrorHandler()

    override fun onCreate() {
        super.onCreate()

        Logger.step("APPLICATION_START", "GodEye Application starting...")

        try {
            // Инициализация глобальных компонентов
            initializeLogging()
            setupExceptionHandler()

            Logger.step("APPLICATION_READY", "GodEye Application initialized successfully")

        } catch (e: Exception) {
            Logger.error("APPLICATION_INIT_ERROR", "Failed to initialize application", e)
        }
    }

    /**
     * Инициализация системы логирования
     */
    private fun initializeLogging() {
        Logger.step("LOGGING_INIT", "Initializing logging system")
        // Система логирования уже инициализирована в Logger object
        Logger.d("Application context available: ${this.javaClass.simpleName}")
    }

    /**
     * Настройка глобального обработчика исключений
     */
    private fun setupExceptionHandler() {
        val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()

        Thread.setDefaultUncaughtExceptionHandler { thread, exception ->
            try {
                // Используем наш ErrorHandler для обработки исключений
                errorHandler.handleUncaughtException(thread, exception)

                // Специальная обработка известных безопасных ошибок
                when {
                    // Compose hover events bug - игнорируем
                    exception is IllegalStateException &&
                    exception.message?.contains("ACTION_HOVER_EXIT event was not cleared") == true -> {
                        Logger.d("Ignoring Compose hover event bug")
                        return@setDefaultUncaughtExceptionHandler
                    }

                    // Ошибки при завершении приложения - игнорируем
                    exception is InternalError &&
                    exception.message?.contains("Thread starting during runtime shutdown") == true -> {
                        Logger.d("Ignoring shutdown thread creation error")
                        return@setDefaultUncaughtExceptionHandler
                    }

                    // WebRTC ошибки - логируем но не крашим
                    exception.message?.contains("Failed to set local") == true -> {
                        Logger.error("WEBRTC_ERROR", "WebRTC error handled gracefully", exception)
                        return@setDefaultUncaughtExceptionHandler
                    }

                    // Для критических ошибок используем стандартный обработчик
                    else -> {
                        Logger.error("CRITICAL_ERROR", "Critical error, delegating to default handler", exception)
                        defaultHandler?.uncaughtException(thread, exception)
                    }
                }
            } catch (handlerException: Exception) {
                // Если наш обработчик тоже упал, используем стандартный
                Logger.error("HANDLER_ERROR", "Error in exception handler", handlerException)
                defaultHandler?.uncaughtException(thread, exception)
            }
        }

        Logger.step("EXCEPTION_HANDLER_SET", "Global exception handler configured")
    }

    override fun onTerminate() {
        Logger.step("APPLICATION_TERMINATE", "GodEye Application terminating...")
        super.onTerminate()
    }
}
