import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../api/types.dart'; import '../api/client.dart'; import '../api/openapi_config.dart'; import '../services/auth_service.dart'; import '../models/user_profile.dart'; import '../models/delivery_route.dart'; import '../models/delivery.dart'; import '../models/delivery_order.dart'; import '../models/delivery_address.dart'; import '../models/delivery_contact.dart'; final authServiceProvider = Provider((ref) { return AuthService(); }); final apiClientProvider = Provider((ref) { return CqrsApiClient(config: ApiClientConfig.production); }); final isAuthenticatedProvider = FutureProvider((ref) async { final authService = ref.watch(authServiceProvider); return await authService.isAuthenticated(); }); final userProfileProvider = FutureProvider((ref) async { final authService = ref.watch(authServiceProvider); final token = await authService.getToken(); if (token == null) return null; return authService.decodeToken(token); }); final authTokenProvider = FutureProvider((ref) async { final authService = ref.watch(authServiceProvider); return await authService.getToken(); }); final deliveryRoutesProvider = FutureProvider>((ref) async { final token = ref.watch(authTokenProvider).valueOrNull; if (token == null) { throw Exception('User not authenticated'); } // Create a new client with auth token final authClient = CqrsApiClient( config: ApiClientConfig( baseUrl: ApiClientConfig.production.baseUrl, defaultHeaders: {'Authorization': 'Bearer $token'}, ), ); final result = await authClient.executeQuery>( endpoint: 'simpleDeliveryRouteQueryItems', query: _EmptyQuery(), fromJson: (json) { // API returns data wrapped in object with "data" field if (json is Map) { final data = json['data']; if (data is List) { return (data as List).map((r) => DeliveryRoute.fromJson(r as Map)).toList(); } } return []; }, ); return result.whenSuccess((routes) => routes) ?? []; }); final deliveriesProvider = FutureProvider.family, int>((ref, routeFragmentId) async { final token = ref.watch(authTokenProvider).valueOrNull; if (token == null) { throw Exception('User not authenticated'); } final authClient = CqrsApiClient( config: ApiClientConfig( baseUrl: ApiClientConfig.production.baseUrl, defaultHeaders: {'Authorization': 'Bearer $token'}, ), ); final result = await authClient.executeQuery>( endpoint: 'simpleDeliveriesQueryItems', query: _DeliveriesQuery(routeFragmentId: routeFragmentId), fromJson: (json) { // API returns data wrapped in object with "data" field if (json is Map) { final data = json['data']; if (data is List) { return (data as List).map((d) => Delivery.fromJson(d as Map)).toList(); } } return []; }, ); return result.whenSuccess((deliveries) => deliveries) ?? []; }); /// Provider to get all deliveries from all routes final allDeliveriesProvider = FutureProvider>((ref) async { final routes = ref.watch(deliveryRoutesProvider).valueOrNull ?? []; if (routes.isEmpty) { return []; } // Fetch deliveries for all routes final deliveriesFutures = routes.map((route) { return ref.watch(deliveriesProvider(route.id)).when( data: (deliveries) => deliveries, loading: () => [], error: (_, __) => [], ); }); // Combine all deliveries final allDeliveries = []; for (final deliveries in deliveriesFutures) { allDeliveries.addAll(deliveries); } return allDeliveries; }); final languageProvider = StateProvider((ref) { return 'fr'; }); class _EmptyQuery implements Serializable { @override Map toJson() => {}; } class _DeliveriesQuery implements Serializable { final int routeFragmentId; _DeliveriesQuery({required this.routeFragmentId}); @override Map toJson() => { 'params': { 'routeFragmentId': routeFragmentId, }, }; }