/**
 * NavigationExample.kt
 * Navigation 高级用法示例
 *
 * 展示如何在实际项目中使用高级 Navigation API
 *
 * @author flowzl
 * @date 2026-01-19
 */

package com.skylink.app.navigation.examples

import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import com.skylink.app.navigation.NavigationEvent
import com.skylink.app.navigation.NavigationManager
import com.skylink.app.navigation.Routes
import com.skylink.app.navigation.navigateAndClear
import com.skylink.app.navigation.navigateSafe
import com.skylink.app.navigation.navigateToHome
import com.skylink.app.navigation.navigateToSettings

// ============================================================================
// ViewModel 示例 - 使用导航事件
// ============================================================================

/**
 * 应用主 ViewModel - 管理导航和业务逻辑
 */
class AppViewModel : ViewModel() {
    
    private val _navigationEvent = MutableLiveData<NavigationEvent>()
    val navigationEvent: LiveData<NavigationEvent> = _navigationEvent
    
    // 业务逻辑事件
    private val _loginSuccess = MutableLiveData<Boolean>()
    val loginSuccess: LiveData<Boolean> = _loginSuccess
    
    // ========================================================================
    // 导航方法
    // ========================================================================
    
    /**
     * 导航到首页
     */
    fun navigateToHome() {
        _navigationEvent.value = NavigationEvent.NavigateToHome
    }
    
    /**
     * 导航到设置
     */
    fun navigateToSettings() {
        _navigationEvent.value = NavigationEvent.NavigateToSettings
    }
    
    /**
     * 返回
     */
    fun navigateBack() {
        _navigationEvent.value = NavigationEvent.NavigateUp
    }
    
    /**
     * 自定义路由导航
     */
    fun navigateToRoute(route: String) {
        _navigationEvent.value = NavigationEvent.NavigateToRoute(route)
    }
    
    // ========================================================================
    // 业务逻辑方法
    // ========================================================================
    
    /**
     * 处理登录
     */
    fun login(username: String, password: String) {
        // 模拟登录逻辑
        if (username.isNotEmpty() && password.isNotEmpty()) {
            _loginSuccess.value = true
            // 登录成功后导航到首页
            navigateToHome()
        } else {
            _loginSuccess.value = false
        }
    }
    
    /**
     * 处理登出
     */
    fun logout() {
        // 登出逻辑
        _loginSuccess.value = false
        // 返回到某个位置
        navigateBack()
    }
}

// ============================================================================
// Fragment 示例 - 使用 ViewModel 的导航
// ============================================================================

/**
 * 示例 Fragment - 演示导航使用
 */
class ExampleFragment : Fragment() {
    
    /**
     * 示例 1：直接使用 NavController 的快捷方法
     */
    private fun example1_DirectNavigation() {
        val navController = findNavController()
        
        // 导航到首页
        navController.navigateToHome()
        
        // 导航到设置
        navController.navigateToSettings()
    }
    
    /**
     * 示例 2：使用 NavigationManager 处理事件
     */
    private fun example2_EventHandling() {
        val navController = findNavController()
        
        val event = NavigationEvent.NavigateToSettings
        NavigationManager.handleNavigationEvent(navController, event)
    }
    
    /**
     * 示例 3：安全导航防止重复点击
     */
    private fun example3_SafeNavigation() {
        val navController = findNavController()
        
        // 即使快速点击多次，也只导航一次
        navController.navigateSafe(Routes.SETTINGS)
    }
    
    /**
     * 示例 4：导航并清理 Back Stack
     */
    private fun example4_NavigateWithClear() {
        val navController = findNavController()
        
        // 导航到首页，并清理以前的 back stack
        navController.navigateAndClear(
            route = Routes.HOME,
            popUpTo = Routes.SETTINGS
        )
    }
    
    /**
     * 示例 5：从 ViewModel 观察导航事件
     */
    private fun example5_ViewModelNavigation() {
        // 在 Fragment 中通过 ViewModelProvider 获取 ViewModel
        val viewModel = ViewModelProvider(this).get(AppViewModel::class.java)
        
        // 观察导航事件并处理
        viewModel.navigationEvent.observe(viewLifecycleOwner) { event ->
            val navController = findNavController()
            NavigationManager.handleNavigationEvent(navController, event)
        }
        
        // 触发导航示例
        viewModel.navigateToSettings()
    }
    
    /**
     * 示例 6：按钮点击导航
     */
    private fun example6_ButtonClickNavigation(navController: NavController) {
        // 单个按钮
        val settingsButton = view?.findViewById<android.widget.Button>(
            com.skylink.app.R.id.single_ping_button
        )
        
        settingsButton?.setOnClickListener {
            // 使用安全导航
            navController.navigateSafe(Routes.SETTINGS)
        }
    }
}

// ============================================================================
// 高级示例 - 链式导航和条件导航
// ============================================================================

/**
 * 链式导航示例
 */
class ChainedNavigationExample(private val viewModel: AppViewModel) {
    
    /**
     * 多步流程：登录 -> 首页
     */
    fun loginFlow() {
        // 步骤 1：验证用户
        viewModel.login("user", "password")
        
        // 步骤 2：登录成功后可以在真实环境中由 ViewModel 驱动导航。
        // 示例省略 LifecycleOwner 的创建，这里仅展示思路。
    }
}

/**
 * 条件导航示例
 */
class ConditionalNavigationExample(private val navController: NavController) {
    
    data class User(
        val id: String,
        val name: String,
        val isProfileComplete: Boolean
    )
    
    /**
     * 根据用户状态导航
     */
    fun navigateBasedOnUserState(user: User?) {
        when {
            // 未登录
            user == null -> {
                navController.navigateSafe(Routes.HOME)
            }
            // 资料完整
            user.isProfileComplete -> {
                navController.navigateSafe(Routes.HOME)
            }
            // 需要完成资料
            else -> {
                navController.navigateSafe(Routes.SETTINGS)
            }
        }
    }
    
    /**
     * 条件导航示例 2 - 根据权限
     */
    fun navigateIfPermitted(route: String, hasPermission: Boolean) {
        if (hasPermission) {
            navController.navigateSafe(route)
        } else {
            // 可以导航到权限申请页面
            navController.navigateSafe(Routes.HOME)
        }
    }
}

// ============================================================================
// 实用工具类（示例）
// ============================================================================

/**
 * 示例用导航工具，避免与核心库的 NavigationHelper 冲突
 */
object NavigationUtils {
    
    /**
     * 延迟导航 - 在特定时间后导航
     */
    fun delayedNavigate(
        navController: NavController,
        route: String,
        delayMs: Long = 500
    ) {
        android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(
            {
                navController.navigateSafe(route)
            },
            delayMs
        )
    }
    
    /**
     * 条件导航 - 满足条件才导航
     */
    fun navigateIf(
        navController: NavController,
        route: String,
        condition: Boolean
    ) {
        if (condition) {
            navController.navigateSafe(route)
        }
    }
    
    /**
     * 安全后退 - 检查是否能后退
     */
    fun navigateBackSafely(navController: NavController): Boolean {
        return if (navController.previousBackStackEntry != null) {
            navController.navigateUp()
            true
        } else {
            false
        }
    }
}

// ============================================================================
// 使用示例
// ============================================================================

/**
 * 完整使用示例
 */
class CompleteUsageExample {
    
    fun demonstrateNavigation() {
        // 1. 获取 NavController（示例中使用 Fragment 来获取）
        val fragment = ExampleFragment()
        val navController = fragment.findNavController()
        
        // 2. 简单导航
        navController.navigateToHome()
        
        // 3. 处理导航事件
        val event = NavigationEvent.NavigateToSettings
        NavigationManager.handleNavigationEvent(navController, event)
        
        // 4. 安全导航
        navController.navigateSafe(Routes.HOME)
        
        // 5. 延迟导航
        NavigationUtils.delayedNavigate(navController, Routes.SETTINGS, 1000)
        
        // 6. 条件导航
        NavigationUtils.navigateIf(navController, Routes.HOME, condition = true)
        
        // 7. 安全后退
        NavigationUtils.navigateBackSafely(navController)
    }
}
