enum DeepLinkKind {
home,
discover,
tours,
map,
favorites,
offline,
learnGerman,
newInWeimar,
settings,
tour,
poi,
unknown,
}
class DeepLink {
const DeepLink(this.kind, {this.id});
final DeepLinkKind kind;
final String? id;
bool get isHome => kind == DeepLinkKind.home;
static DeepLink fromUri(Uri uri) {
// Hash routes work without server rewrites; clean paths are accepted too.
var raw = uri.fragment.trim();
if (raw.startsWith('/')) {
raw = raw.substring(1);
} else {
raw = uri.path.trim();
if (raw.startsWith('/')) raw = raw.substring(1);
}
if (raw.isEmpty) return const DeepLink(DeepLinkKind.home);
// Ignore query strings accidentally embedded in fragments.
raw = raw.split('?').first;
final parts = raw
.split('/')
.map(Uri.decodeComponent)
.where((part) => part.trim().isNotEmpty)
.toList(growable: false);
if (parts.isEmpty) return const DeepLink(DeepLinkKind.home);
switch (parts.first.toLowerCase()) {
case 'start':
case 'home':
return const DeepLink(DeepLinkKind.home);
case 'entdecken':
case 'discover':
return const DeepLink(DeepLinkKind.discover);
case 'touren':
case 'tours':
return const DeepLink(DeepLinkKind.tours);
case 'karte':
case 'map':
return const DeepLink(DeepLinkKind.map);
case 'favoriten':
case 'favorites':
return const DeepLink(DeepLinkKind.favorites);
case 'offline':
case 'downloads':
return const DeepLink(DeepLinkKind.offline);
case 'deutsch-lernen':
case 'learn':
case 'learn-german':
return const DeepLink(DeepLinkKind.learnGerman);
case 'neu-in-weimar':
case 'new-in-weimar':
return const DeepLink(DeepLinkKind.newInWeimar);
case 'einstellungen':
case 'settings':
return const DeepLink(DeepLinkKind.settings);
case 'tour':
return parts.length >= 2
? DeepLink(DeepLinkKind.tour, id: parts[1])
: const DeepLink(DeepLinkKind.tours);
case 'poi':
case 'ort':
return parts.length >= 2
? DeepLink(DeepLinkKind.poi, id: parts[1])
: const DeepLink(DeepLinkKind.discover);
default:
return const DeepLink(DeepLinkKind.unknown);
}
}
}

