/**
 * NavigationExt.kt
 * SkyLink Android - Navigation 高级扩展
 *
 * 提供高级的 Navigation 扩展函数和工具类
 *
 * @author flowzl
 * @date 2026-01-19
 */

package com.skylink.app.navigation

import androidx.navigation.NavController
import androidx.navigation.NavGraph
import androidx.navigation.NavGraphBuilder

/**
 * Navigation 路由定义对象
 * 集中管理所有路由常量
 */
object Routes {
    const val HOME = "home"
    const val SETTINGS = "settings"
}

/**
 * Navigation 事件 - 使用密封类管理所有导航事件
 */
sealed class NavigationEvent {
    // 基础导航事件
    object NavigateToHome : NavigationEvent()
    object NavigateToSettings : NavigationEvent()
    object NavigateUp : NavigationEvent()
    
    // 带参数的导航事件
    data class NavigateToRoute(val route: String) : NavigationEvent()
}

/**
 * ViewModel 中使用的导航命令接口
 */
interface NavigationCommand {
    fun navigate(event: NavigationEvent)
}

/**
 * Navigation 工具类 - 提供常用的导航操作
 */
object NavigationManager {
    
    /**
     * 安全导航 - 防止快速重复点击
     * @param navController Navigation 控制器
     * @param route 目标路由
     */
    fun navigateSafe(navController: NavController, route: String) {
        try {
            if (navController.currentDestination?.route != route) {
                navController.navigate(route) {
                    launchSingleTop = true
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
    /**
     * 带 Back Stack 清理的导航
     * @param navController Navigation 控制器
     * @param route 目标路由
     * @param popUpTo 弹出到指定路由
     * @param inclusive 是否包含 popUpTo 指定的路由
     */
    fun navigateWithClear(
        navController: NavController,
        route: String,
        popUpTo: String? = null,
        inclusive: Boolean = false
    ) {
        try {
            navController.navigate(route) {
                if (popUpTo != null) {
                    popUpTo(popUpTo) {
                        this.inclusive = inclusive
                    }
                }
                launchSingleTop = true
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
    /**
     * 处理导航事件
     * @param navController Navigation 控制器
     * @param event 导航事件
     */
    fun handleNavigationEvent(navController: NavController, event: NavigationEvent) {
        when (event) {
            NavigationEvent.NavigateToHome -> navigateSafe(navController, Routes.HOME)
            NavigationEvent.NavigateToSettings -> navigateSafe(navController, Routes.SETTINGS)
            NavigationEvent.NavigateUp -> navController.navigateUp()
            is NavigationEvent.NavigateToRoute -> navigateSafe(navController, event.route)
        }
    }
}

/**
 * NavController 扩展方法
 */

/**
 * 快速导航到首页
 */
fun NavController.navigateToHome() {
    NavigationManager.navigateSafe(this, Routes.HOME)
}

/**
 * 快速导航到设置
 */
fun NavController.navigateToSettings() {
    NavigationManager.navigateSafe(this, Routes.SETTINGS)
}

/**
 * 安全导航
 */
fun NavController.navigateSafe(route: String) {
    NavigationManager.navigateSafe(this, route)
}

/**
 * 导航并清理 Back Stack
 */
fun NavController.navigateAndClear(route: String, popUpTo: String? = null) {
    NavigationManager.navigateWithClear(this, route, popUpTo)
}

/**
 * NavGraphBuilder 扩展 - 用于构建导航图
 */

/**
 * 应用导航图构建器
 * 
 * 使用方式：
 * ```kotlin
 * navGraphBuilder.buildAppNavGraph(navController)
 * ```
 */
fun NavGraphBuilder.buildAppNavGraph(navController: NavController) {
    // 在此添加所有导航目的地
    // 这是一个扩展点，具体实现取决于是否使用 Compose 或 Fragment
}

/**
 * Navigation 助手类 - 用于 Activity 中初始化导航
 */
class NavigationHelper(private val navController: NavController) {
    
    /**
     * 处理菜单项点击
     */
    fun handleMenuItemClick(itemId: Int): Boolean {
        return when (itemId) {
            android.R.id.home -> {
                navController.navigateUp()
                true
            }
            else -> false
        }
    }
    
    /**
     * 处理后退按钮
     */
    fun handleBackPressed(): Boolean {
        return if (navController.previousBackStackEntry != null) {
            navController.navigateUp()
            true
        } else {
            false
        }
    }
    
    /**
     * 获取当前目的地路由
     */
    fun getCurrentRoute(): String? {
        return navController.currentDestination?.route
    }
    
    /**
     * 检查是否在顶级目的地
     */
    fun isAtTopDestination(route: String): Boolean {
        return getCurrentRoute() == route
    }
}
