package com.narutohuo.xindazhou

import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.NavHostFragment
import com.narutohuo.xindazhou.common.config.ServerConfigManager
import com.narutohuo.xindazhou.common.network.ApiServiceFactory
import com.narutohuo.xindazhou.common.version.datasource.remote.VersionApi
import com.narutohuo.xindazhou.common.version.repository.VersionRepository
import com.narutohuo.xindazhou.common.version.ui.UpdateDialog
import com.narutohuo.xindazhou.core.log.ILog
import com.narutohuo.xindazhou.user.datasource.local.TokenManager
import kotlinx.coroutines.launch

// BuildConfig 会自动生成在 app 模块的包名下
// 由于 MainActivity 就在 app 模块的包名下，可以直接使用 BuildConfig

/**
 * 主Activity - 应用入口（单一Activity架构）
 * 
 * 职责：
 * 1. 应用启动入口
 * 2. 初始化 TokenManager 和 ServerConfigManager
 * 3. 版本检查（启动时检查是否有新版本）
 * 4. 使用 Navigation Component 管理页面导航
 * 
 * 架构说明：
 * - 未登录状态：显示 LoginFragment
 * - 已登录状态：显示 MainFragment（包含 TabBar 和各个业务 Fragment）
 */
class MainActivity : AppCompatActivity() {
    
    companion object {
        private const val PLATFORM_ANDROID = 1 // 平台类型：1-安卓
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 初始化日志（自动根据 BuildConfig.DEBUG 选择实现）
        // Debug 版本：使用 TimberLog（输出日志）
        // Release 版本：使用 NoOpLog（不输出日志，提升性能）
        com.narutohuo.xindazhou.core.log.ILog.init(enableLogging = BuildConfig.DEBUG)
        
        // 启动时检查版本更新（异步，不阻塞启动）
        checkVersionUpdate()
        
        // 设置导航：根据登录状态决定起始页面
        setupNavigation()
    }
    
    /**
     * 设置导航
     * 根据登录状态决定显示登录页面还是主界面
     */
    private fun setupNavigation() {
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.navHostFragment) as? NavHostFragment
        val navController = navHostFragment?.navController ?: return
        
        // 根据登录状态决定起始页面
        if (TokenManager.isLoggedIn()) {
            navController.navigate(R.id.mainFragment)
        }
        // 如果未登录，默认显示登录页面（由 nav_graph.xml 中的 startDestination 决定）
    }
    
    /**
     * 检查版本更新
     * 如果没有版本或检查失败，不影响正常启动
     */
    private fun checkVersionUpdate() {
        lifecycleScope.launch {
            try {
                // 获取当前版本号
                val currentVersionCode = getCurrentVersionCode()
                
                // 使用 ApiServiceFactory 创建 API 实例
                val versionApi = ApiServiceFactory.create<VersionApi>()
                val versionRepository = VersionRepository(versionApi)
                
                // 检查版本（如果没有版本，返回 null，不影响启动）
                val versionInfo = versionRepository.checkVersion(PLATFORM_ANDROID, currentVersionCode)
                
                // 如果有新版本，显示更新对话框
                if (versionInfo != null && versionRepository.hasUpdate(versionInfo)) {
                    val dialog = UpdateDialog.create(
                        versionInfo = versionInfo,
                        onDismiss = {
                            // 对话框关闭后的回调
                            if (versionRepository.isForceUpdate(versionInfo)) {
                                // 强制更新时，如果用户关闭对话框，退出应用
                                finish()
                            }
                        }
                    )
                    dialog.show(supportFragmentManager, "UpdateDialog")
                }
            } catch (e: Exception) {
                // 版本检查失败不影响应用启动
                // 可以记录日志，但不显示错误提示
                ILog.e("MainActivity", "版本检查失败", e)
            }
        }
    }
    
    /**
     * 获取当前应用的版本号
     */
    private fun getCurrentVersionCode(): Int {
        return try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                // API 28+ 使用 longVersionCode
                packageManager.getPackageInfo(packageName, 0).longVersionCode.toInt()
            } else {
                // API 26-27 使用 versionCode
                @Suppress("DEPRECATION")
                packageManager.getPackageInfo(packageName, 0).versionCode
            }
        } catch (e: PackageManager.NameNotFoundException) {
            // 记录异常
            ILog.e("MainActivity", "无法获取版本号", e)
            1 // 默认版本号
        }
    }
    
    // 注意：分享回调已完全封装在 ShareProxyActivity 中处理
    // 业务层不需要在 MainActivity 中处理 onActivityResult
    // 所有分享回调都会自动回到 ShareProxyActivity，由它统一处理
}

