import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:geosector_app/presentation/widgets/badged_navigation_destination.dart'; /// Configuration centralisée de la navigation pour toute l'application /// Gère les destinations, routes et logique de navigation pour admin et user class NavigationConfig { // ======================================== // DESTINATIONS DE NAVIGATION // ======================================== /// Destinations communes à tous les rôles static const List _commonDestinations = [ NavigationDestination( icon: Icon(Icons.dashboard_outlined), selectedIcon: Icon(Icons.dashboard), label: 'Tableau de bord', ), NavigationDestination( icon: Icon(Icons.history_outlined), selectedIcon: Icon(Icons.history), label: 'Historique', ), NavigationDestination( icon: Icon(Icons.map_outlined), selectedIcon: Icon(Icons.map), label: 'Carte', ), ]; /// Destination Messages avec badge (commune à tous) static NavigationDestination get _messagesDestination { return createBadgedNavigationDestination( icon: const Icon(Icons.chat_outlined), selectedIcon: const Icon(Icons.chat), label: 'Messages', showBadge: true, ); } /// Destination Terrain (user uniquement) static const NavigationDestination _fieldModeDestination = NavigationDestination( icon: Icon(Icons.explore_outlined), selectedIcon: Icon(Icons.explore), label: 'Terrain', ); /// Destinations admin desktop uniquement static const List _adminDesktopDestinations = [ NavigationDestination( icon: Icon(Icons.business_outlined), selectedIcon: Icon(Icons.business), label: 'Amicale & membres', ), NavigationDestination( icon: Icon(Icons.calendar_today_outlined), selectedIcon: Icon(Icons.calendar_today), label: 'Opérations', ), NavigationDestination( icon: Icon(Icons.analytics_outlined), selectedIcon: Icon(Icons.analytics), label: 'Connexions', ), ]; // ======================================== // GETTERS DE DESTINATIONS // ======================================== /// Obtenir la liste des destinations selon le rôle et le device static List getDestinations({ required bool isAdmin, required bool isMobile, }) { final destinations = []; // Ajouter les destinations communes destinations.addAll(_commonDestinations); // Ajouter Messages (avec badge) destinations.add(_messagesDestination); if (isAdmin) { // Admin : ajouter les pages supplémentaires sur desktop uniquement if (!isMobile) { destinations.addAll(_adminDesktopDestinations); } } else { // User : ajouter la page Terrain destinations.add(_fieldModeDestination); } return destinations; } // ======================================== // NAVIGATION (INDEX → ROUTE) // ======================================== /// Naviguer vers une page selon l'index et le rôle static void navigateToIndex(BuildContext context, int index, bool isAdmin) { if (isAdmin) { _navigateAdminIndex(context, index); } else { _navigateUserIndex(context, index); } } /// Navigation pour les admins static void _navigateAdminIndex(BuildContext context, int index) { switch (index) { case 0: context.go('/admin'); break; case 1: context.go('/admin/history'); break; case 2: context.go('/admin/map'); break; case 3: context.go('/admin/messages'); break; case 4: context.go('/admin/amicale'); break; case 5: context.go('/admin/operations'); break; case 6: context.go('/admin/connexions'); break; default: context.go('/admin'); } } /// Navigation pour les utilisateurs standards static void _navigateUserIndex(BuildContext context, int index) { switch (index) { case 0: context.go('/user/dashboard'); break; case 1: context.go('/user/history'); break; case 2: context.go('/user/map'); break; case 3: context.go('/user/messages'); break; case 4: context.go('/user/field-mode'); break; default: context.go('/user/dashboard'); } } // ======================================== // RÉSOLUTION (ROUTE → INDEX) // ======================================== /// Obtenir l'index selon la route actuelle et le rôle static int getIndexFromRoute(String route, bool isAdmin) { // Enlever les paramètres de query si présents final cleanRoute = route.split('?').first; if (isAdmin) { return _getAdminIndexFromRoute(cleanRoute); } else { return _getUserIndexFromRoute(cleanRoute); } } /// Obtenir l'index admin depuis la route static int _getAdminIndexFromRoute(String route) { if (route.contains('/admin/history')) return 1; if (route.contains('/admin/map')) return 2; if (route.contains('/admin/messages')) return 3; if (route.contains('/admin/amicale')) return 4; if (route.contains('/admin/operations')) return 5; if (route.contains('/admin/connexions')) return 6; return 0; // Dashboard par défaut } /// Obtenir l'index user depuis la route static int _getUserIndexFromRoute(String route) { if (route.contains('/user/history')) return 1; if (route.contains('/user/map')) return 2; if (route.contains('/user/messages')) return 3; if (route.contains('/user/field-mode')) return 4; return 0; // Dashboard par défaut } // ======================================== // UTILITAIRES // ======================================== /// Obtenir le nom de la page selon l'index et le rôle static String getPageNameFromIndex(int index, bool isAdmin) { if (isAdmin) { return _getAdminPageName(index); } else { return _getUserPageName(index); } } /// Obtenir le nom de page admin static String _getAdminPageName(int index) { switch (index) { case 0: return 'dashboard'; case 1: return 'history'; case 2: return 'map'; case 3: return 'messages'; case 4: return 'amicale'; case 5: return 'operations'; case 6: return 'connexions'; default: return 'dashboard'; } } /// Obtenir le nom de page user static String _getUserPageName(int index) { switch (index) { case 0: return 'dashboard'; case 1: return 'history'; case 2: return 'map'; case 3: return 'messages'; case 4: return 'field-mode'; default: return 'dashboard'; } } // ======================================== // TITRES ET LABELS // ======================================== /// Obtenir le titre du dashboard selon le rôle static String getDashboardTitle(bool isAdmin) { return isAdmin ? 'Tableau de bord Administration' : 'GEOSECTOR'; } }