# GravidAppState.kt

    /*
     * The MIT License
     *
     * Original work sponsored and donated by The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     * Copyright (C) 2023 The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of
     * this software and associated documentation files (the "Software"), to deal in
     * the Software without restriction, including without limitation the rights to
     * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
     * of the Software, and to permit persons to whom the Software is furnished to do
     * so, subject to the following conditions:
     *
     *
     * The above copyright notice and this permission notice shall be included in all
     * copies or substantial portions of the Software.
     *
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     * SOFTWARE.
     */
    package dk.nsp.mingraviditet.ui.main

    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.remember
    import androidx.navigation.NavDestination
    import androidx.navigation.NavGraph.Companion.findStartDestination
    import androidx.navigation.NavHostController
    import androidx.navigation.compose.currentBackStackEntryAsState
    import androidx.navigation.compose.rememberNavController
    import dk.nsp.mingraviditet.feature.careplanactivities.navigation.careplanActivitiesRoute
    import dk.nsp.mingraviditet.feature.journal.navigation.journalGraphRoute
    import dk.nsp.mingraviditet.feature.knowledge.navigation.knowledgeGraphRoute
    import dk.nsp.mingraviditet.feature.more.navigation.moreNavigationRoute
    import dk.nsp.mingraviditet.feature.overview.navigation.overviewNavigationRoute
    import dk.nsp.mingraviditet.ui.main.navigation.TopLevelDestination

    @Composable
    fun rememberGravidAppState(
        navController: NavHostController = rememberNavController(),
    ): GravidAppState {
        return remember(navController) {
            GravidAppState(
                navController = navController,
            )
        }
    }

    class GravidAppState(
        val navController: NavHostController,
    ) {
        val currentDestination: NavDestination?
            @Composable get() = navController.currentBackStackEntryAsState().value?.destination

        /**
         * UI logic for navigating to a top level destination in the app. Top level destinations have
         * only one copy of the destination of the back stack, and save and restore state whenever you
         * navigate to and from it.
         *
         * @param topLevelDestination: The destination the app needs to navigate to.
         */

        fun navigateToTopLevelDestination(
            topLevelDestination: TopLevelDestination,
            restoreTabStack: Boolean,
        ) {
            when (topLevelDestination) {
                TopLevelDestination.OVERVIEW -> navController.switchTabs(overviewNavigationRoute, restoreTabStack)
                TopLevelDestination.CAREPLAN_ACTIVITIES -> navController.switchTabs(careplanActivitiesRoute, restoreTabStack)
                TopLevelDestination.KNOWLEDGE -> navController.switchTabs(knowledgeGraphRoute, restoreTabStack)
                TopLevelDestination.JOURNAL -> navController.switchTabs(journalGraphRoute, restoreTabStack)
                TopLevelDestination.MORE -> navController.switchTabs(moreNavigationRoute, restoreTabStack)
            }
        }
    }

    fun NavHostController.switchTabs(route: String, restoreTabStack: Boolean = true) {
        navigate(route) {
            // Pop up to the start destination of the graph to
            // avoid building up a large stack of destinations
            // on the back stack as users select items
            popUpTo(graph.findStartDestination().id) {
                saveState = restoreTabStack
            }
            // Avoid multiple copies of the same destination when
            // reselecting the same item
            launchSingleTop = true
            // Restore state when reselecting a previously selected item
            restoreState = restoreTabStack
        }
    }