package com.craigvg.lichun_android.navigation import android.content.Intent import android.net.Uri /** * Supported deep link routes for the app. * URL scheme: baolife://route/subroute?param=value */ sealed class DeepLinkRoute { // Main tabs data object Home : DeepLinkRoute() data object Activities : DeepLinkRoute() data class Social(val segment: SocialSegment? = null) : DeepLinkRoute() // Modals data object Store : DeepLinkRoute() data object Achievements : DeepLinkRoute() data object Characters : DeepLinkRoute() data object DailyRewards : DeepLinkRoute() data object DailyQuests : DeepLinkRoute() // Testing data object SkipOnboarding : DeepLinkRoute() data class SetAge(val age: Int) : DeepLinkRoute() data object DebugDump : DeepLinkRoute() data class DebugPreset(val preset: String) : DeepLinkRoute() data class DebugConfig(val wsUrl: String?) : DeepLinkRoute() enum class SocialSegment { DATING, MESSAGES } } /** * Manages deep link URL parsing and navigation. */ object DeepLinkManager { const val SCHEME = "baolife" /** * Parse an Intent into a DeepLinkRoute. */ fun parse(intent: Intent): DeepLinkRoute? { val uri = intent.data ?: return null return parse(uri) } /** * Parse a URI into a DeepLinkRoute. */ fun parse(uri: Uri): DeepLinkRoute? { if (uri.scheme != SCHEME) return null val host = uri.host ?: return null val pathSegments = uri.pathSegments return when (host) { "home" -> DeepLinkRoute.Home "activities" -> DeepLinkRoute.Activities "social" -> { val segment = pathSegments.firstOrNull()?.let { seg -> when (seg) { "dating" -> DeepLinkRoute.SocialSegment.DATING "messages" -> DeepLinkRoute.SocialSegment.MESSAGES else -> null } } DeepLinkRoute.Social(segment) } "store" -> DeepLinkRoute.Store "achievements" -> DeepLinkRoute.Achievements "characters", "relationships" -> DeepLinkRoute.Characters "daily-rewards" -> DeepLinkRoute.DailyRewards "daily-quests" -> DeepLinkRoute.DailyQuests "skip-onboarding" -> DeepLinkRoute.SkipOnboarding "set-age" -> { val age = uri.getQueryParameter("age")?.toIntOrNull() if (age != null) DeepLinkRoute.SetAge(age) else null } "debug" -> { when (pathSegments.firstOrNull()) { "dump" -> DeepLinkRoute.DebugDump "preset" -> { val preset = pathSegments.drop(1).firstOrNull() ?: uri.getQueryParameter("name") preset?.let { DeepLinkRoute.DebugPreset(it) } } "config" -> DeepLinkRoute.DebugConfig(uri.getQueryParameter("wsUrl")) else -> null } } else -> null } } /** * Build a deep link URI for a given route. */ fun buildUri(route: DeepLinkRoute): Uri { return when (route) { is DeepLinkRoute.Home -> Uri.parse("$SCHEME://home") is DeepLinkRoute.Activities -> Uri.parse("$SCHEME://activities") is DeepLinkRoute.Social -> { val base = "$SCHEME://social" when (route.segment) { DeepLinkRoute.SocialSegment.DATING -> Uri.parse("$base/dating") DeepLinkRoute.SocialSegment.MESSAGES -> Uri.parse("$base/messages") null -> Uri.parse(base) } } is DeepLinkRoute.Store -> Uri.parse("$SCHEME://store") is DeepLinkRoute.Achievements -> Uri.parse("$SCHEME://achievements") is DeepLinkRoute.Characters -> Uri.parse("$SCHEME://characters") is DeepLinkRoute.DailyRewards -> Uri.parse("$SCHEME://daily-rewards") is DeepLinkRoute.DailyQuests -> Uri.parse("$SCHEME://daily-quests") is DeepLinkRoute.SkipOnboarding -> Uri.parse("$SCHEME://skip-onboarding") is DeepLinkRoute.SetAge -> Uri.parse("$SCHEME://set-age?age=${route.age}") is DeepLinkRoute.DebugDump -> Uri.parse("$SCHEME://debug/dump") is DeepLinkRoute.DebugPreset -> Uri.parse("$SCHEME://debug/preset/${route.preset}") is DeepLinkRoute.DebugConfig -> { val encodedUrl = Uri.encode(route.wsUrl.orEmpty()) Uri.parse("$SCHEME://debug/config?wsUrl=$encodedUrl") } } } }