package com.narutohuo.xindazhou.launch

import android.app.Application
import com.alibaba.android.arouter.launcher.ARouter
import com.narutohuo.xindazhou.auth.AuthManager
import com.narutohuo.xindazhou.common.config.ServerConfigManager
import com.narutohuo.xindazhou.core.log.ILog
import com.narutohuo.xindazhou.common.network.ApiManager
import com.narutohuo.xindazhou.common.version.VersionUpdateManager
import com.narutohuo.xindazhou.socketio.SocketIOManager
import com.narutohuo.xindazhou.core.storage.StorageImpl
import com.narutohuo.xindazhou.share.factory.ShareServiceFactory
import com.narutohuo.xindazhou.push.factory.PushServiceFactory

/**
 * 应用初始化管理器
 * 
 * 统一管理所有模块的初始化，简化 Application 代码
 * 
 * 位置：app 模块（应用层）
 * 职责：协调所有层的初始化（base-core、base-common、capability-*）
 * 
 * 使用方式：
 * ```kotlin
 * // 在 Application.onCreate() 中调用
 * AppInitializer.init(this)
 * ```
 */
object AppInitializer {
    
    private const val TAG = "AppInitializer"
    private var initialized = false
    
    /**
     * 初始化所有模块
     * 
     * 按顺序初始化各个模块，确保依赖关系正确
     * 
     * @param application Application 实例
     */
    fun init(application: Application) {
        if (initialized) {
            ILog.w(TAG, "AppInitializer 已初始化，跳过重复初始化")
            return
        }
        
        try {
            // 1. 初始化日志系统（必须在其他初始化之前，因为其他模块可能依赖日志）
            initLogging(application)
            
            // 2. 初始化统一存储（必须在其他初始化之前，因为其他模块可能依赖存储）
            StorageImpl.init(application.applicationContext)
            ILog.d(TAG, "统一存储初始化完成")
            
            // 3. 初始化 ARouter（必须在其他初始化之前）
            initARouter(application)
            
            // 4. 初始化配置管理器（base-common）
            ServerConfigManager.init(application.applicationContext)
            
            // 5. 网络管理器（base-common，完全懒加载）
            // ApiManager 会在第一次 create() 时自动初始化，无需手动调用
            ILog.d(TAG, "✅ 网络管理器（完全懒加载，首次使用时自动初始化）")
            
            // 6. 设置认证管理器上下文（懒加载模式，不立即初始化）
            // AuthManager 会在第一次使用时自动初始化，并配置 NetworkHelper 的 Token Provider
            AuthManager.setContext(application.applicationContext)
            ILog.d(TAG, "✅ 认证管理器上下文已设置（懒加载模式）")
            
            // 7. 初始化版本更新管理器（base-common）
            VersionUpdateManager.init(application.applicationContext)
            ILog.d(TAG, "✅ 版本更新管理器初始化完成")
            
            // 8. SocketIO 管理器（capability-socketio，完全懒加载）
            // 设置回调（app 层依赖 base-common，可以直接使用 AuthManager）
            SocketIOManager.isLoggedInProvider = { AuthManager.isLoggedIn() }
            SocketIOManager.refreshTokenProvider = { AuthManager.refreshTokenIfNeeded() }
            ILog.d(TAG, "✅ SocketIO 管理器回调已设置（完全懒加载，首次使用时自动初始化）")
            
            // 9. 初始化分享服务（capability-share，可选）
            initShareService(application)
            
            // 10. 推送服务已通过 Startup Library 自动初始化，无需手动调用
            // 如需自定义监听器，可以调用 PushServiceFactory.getInstance().setMessageListener()
            ILog.d(TAG, "✅ 推送服务已自动初始化（Startup Library）")
            
            initialized = true
            ILog.d(TAG, "所有模块初始化完成")
        } catch (e: Exception) {
            ILog.e(TAG, "初始化失败", e)
            throw e
        }
    }
    
    /**
     * 初始化日志系统
     * 
     * 自动启动 LogcatViewer：通过 ActivityLifecycleCallbacks 在第一个 Activity resume 时自动启动
     */
    private fun initLogging(application: Application) {
        val isDebug = isDebugMode(application)
        // 传入 application，内部会自动注册 ActivityLifecycleCallbacks 来启动 LogcatViewer
        com.narutohuo.xindazhou.core.log.ILog.init(application, enableLogging = isDebug)
        ILog.d(TAG, "日志系统初始化完成（使用 LogcatViewer），将在 Activity 启动时自动显示悬浮按钮")
    }
    
    /**
     * 初始化 ARouter
     */
    private fun initARouter(application: Application) {
        val isDebug = isDebugMode(application)
        if (isDebug) {
            // 开启日志
            ARouter.openLog()
            // 开启调试模式（如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
            ARouter.openDebug()
        }
        // 初始化 ARouter
        ARouter.init(application)
        ILog.d(TAG, "ARouter 初始化完成")
    }
    
    /**
     * 初始化分享服务
     * 
     * app 模块直接依赖 capability-share，可以直接导入使用，不需要反射
     */
    private fun initShareService(application: Application) {
        try {
            ShareServiceFactory.init(application)
            ILog.d(TAG, "分享服务初始化成功")
        } catch (e: Exception) {
            // 分享服务初始化失败不影响应用运行，但分享功能将不可用
            ILog.e(TAG, "分享服务初始化失败，分享功能将不可用", e)
        }
    }
    
    
    /**
     * 获取是否为调试模式
     * 
     * 安全地获取 BuildConfig.DEBUG，避免模块未引入时崩溃
     */
    private fun isDebugMode(application: Application): Boolean {
        return try {
            val buildConfigClass = Class.forName("${application.packageName}.BuildConfig")
            val debugField = buildConfigClass.getField("DEBUG")
            debugField.getBoolean(null)
        } catch (e: Exception) {
            ILog.e(TAG, "无法获取 BuildConfig.DEBUG，默认返回 false", e)
            false
        }
    }
}

