import 'package:sysfarma_mobile/src/app/mobile_shell_scaffold.dart'; import 'package:sysfarma_mobile/src/core/access/module_access.dart'; import 'package:sysfarma_mobile/src/core/storage/tenant_session_store.dart'; import 'package:sysfarma_mobile/src/features/auth/presentation/login_screen.dart'; import 'package:sysfarma_mobile/src/features/auth/presentation/splash_screen.dart'; import 'package:sysfarma_mobile/src/features/catalog/presentation/catalog_screen.dart'; import 'package:sysfarma_mobile/src/features/contacts/presentation/persons_screen.dart'; import 'package:sysfarma_mobile/src/features/dashboard/presentation/dashboard_screen.dart'; import 'package:sysfarma_mobile/src/features/inventory/presentation/inventory_screen.dart'; import 'package:sysfarma_mobile/src/features/purchases/presentation/purchases_screen.dart'; import 'package:sysfarma_mobile/src/features/quick/presentation/quick_summary_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/cash_history_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/category_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/critical_stock_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/expiring_lots_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/general_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/hour_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/inventory_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/lots_overview_report_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/reports_screen.dart'; import 'package:sysfarma_mobile/src/features/reports/presentation/seller_report_screen.dart'; import 'package:sysfarma_mobile/src/features/sales/presentation/pending_voided_screen.dart'; import 'package:sysfarma_mobile/src/features/sales/presentation/pending_sync_screen.dart'; import 'package:sysfarma_mobile/src/features/sales/presentation/sales_history_screen.dart'; import 'package:sysfarma_mobile/src/features/sales/presentation/sales_screen.dart'; import 'package:sysfarma_mobile/src/features/settings/presentation/change_password_screen.dart'; import 'package:sysfarma_mobile/src/features/settings/presentation/profile_screen.dart'; import 'package:sysfarma_mobile/src/features/settings/presentation/settings_screen.dart'; import 'package:sysfarma_mobile/src/features/shared/presentation/barcode_scanner_screen.dart'; import 'package:sysfarma_mobile/src/features/stocktake/presentation/stocktake_item_kardex_screen.dart'; import 'package:sysfarma_mobile/src/features/stocktake/presentation/stocktake_list_screen.dart'; import 'package:sysfarma_mobile/src/features/stocktake/presentation/stocktake_report_screen.dart'; import 'package:sysfarma_mobile/src/features/stocktake/presentation/stocktake_session_screen.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; final appRouterProvider = Provider((ref) { final sessionStore = ref.watch(tenantSessionStoreProvider); return GoRouter( initialLocation: '/', redirect: (context, state) async { final location = state.matchedLocation; final isPublic = location == '/' || location == '/login'; final session = await sessionStore.readSession(); final isLoggedIn = session != null && session.token.isNotEmpty; if (!isLoggedIn && !isPublic) return '/login'; if (isLoggedIn && location == '/login') return '/home'; // Guard por modulo: misma logica que el sidebar web (ModuleViewComposer) // aplicada a admin y vendedor por igual. Rutas fuera de ModuleAccess // (home, perfil, pendientes sync, more, scanner, stocktake) quedan sin // restriccion. if (isLoggedIn && !ModuleAccess.routeAllowed(location, session)) { return '/home'; } return null; }, routes: [ GoRoute( path: '/', builder: (context, state) => const SplashScreen(), ), GoRoute( path: '/login', builder: (context, state) => const LoginScreen(), ), ShellRoute( builder: (context, state, child) => MobileShellScaffold(child: child), routes: [ GoRoute( path: '/home', builder: (context, state) => const DashboardScreen(), ), GoRoute( path: '/sales', builder: (context, state) => const SalesScreen(), ), GoRoute( path: '/sales-history', builder: (context, state) => const SalesHistoryScreen(), ), GoRoute( path: '/pending-voided', builder: (context, state) => const PendingVoidedScreen(), ), GoRoute( path: '/pending-sync', builder: (context, state) => const PendingSyncScreen(), ), GoRoute( path: '/inventory', builder: (context, state) => const InventoryScreen(), ), GoRoute( path: '/reports', builder: (context, state) => const ReportsScreen(), ), GoRoute( path: '/reports/general', builder: (context, state) => const GeneralReportScreen(), ), GoRoute( path: '/reports/critical-stock', builder: (context, state) => const CriticalStockReportScreen(), ), GoRoute( path: '/reports/expiring-lots', builder: (context, state) => const ExpiringLotsReportScreen(), ), GoRoute( path: '/reports/by-seller', builder: (context, state) => const SellerReportScreen(), ), GoRoute( path: '/reports/by-category', builder: (context, state) => const CategoryReportScreen(), ), GoRoute( path: '/reports/by-hour', builder: (context, state) => const HourReportScreen(), ), GoRoute( path: '/reports/inventory', builder: (context, state) => const InventoryReportScreen(), ), GoRoute( path: '/reports/lots-overview', builder: (context, state) => const LotsOverviewReportScreen(), ), GoRoute( path: '/reports/cashes', builder: (context, state) => const CashHistoryReportScreen(), ), GoRoute( path: '/more', builder: (context, state) => const SettingsScreen(), ), GoRoute( path: '/profile', builder: (context, state) => const ProfileScreen(), ), GoRoute( path: '/profile/password', builder: (context, state) => const ChangePasswordScreen(), ), GoRoute( path: '/catalog', builder: (context, state) => const CatalogScreen( title: 'Productos', subtitle: 'Busqueda por nombre, codigo o barras.', kind: 'product', allowCreate: true, isService: false, ), ), GoRoute( path: '/services', builder: (context, state) => const CatalogScreen( title: 'Servicios', subtitle: 'Busqueda por nombre, codigo o barras.', kind: 'service', allowCreate: true, isService: true, ), ), GoRoute( path: '/customers', builder: (context, state) => const PersonsScreen(type: PersonScreenType.customers), ), GoRoute( path: '/suppliers', builder: (context, state) => const PersonsScreen(type: PersonScreenType.suppliers), ), GoRoute( path: '/purchases', builder: (context, state) => const PurchasesScreen(), ), GoRoute( path: '/quick', builder: (context, state) => const QuickSummaryScreen(), ), ], ), GoRoute( path: '/scanner', builder: (context, state) => const BarcodeScannerScreen(), ), GoRoute( path: '/stocktake', builder: (context, state) => const StocktakeListScreen(), ), GoRoute( path: '/stocktake/:id', builder: (context, state) => StocktakeSessionScreen( countId: int.tryParse(state.pathParameters['id'] ?? '') ?? 0, ), ), GoRoute( path: '/stocktake/:id/report', builder: (context, state) => StocktakeReportScreen( countId: int.tryParse(state.pathParameters['id'] ?? '') ?? 0, ), ), GoRoute( path: '/stocktake/:id/items/:itemId/kardex', builder: (context, state) => StocktakeItemKardexScreen( countId: int.tryParse(state.pathParameters['id'] ?? '') ?? 0, itemId: int.tryParse(state.pathParameters['itemId'] ?? '') ?? 0, ), ), ], ); });