import 'dart:convert'; import 'package:http/http.dart' as http; import '../config/constants/app_constant.dart'; class MapService { /// Fetch suggestions for locations from a map provider Future fetchSuggestions({ required String query, required MapProvider provider, }) async { if (query.isEmpty) return []; Uri url; switch (provider) { case MapProvider.openStreetMap: url = Uri.parse( 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=5', ); break; // case MapProvider.googleMaps: // url = Uri.parse( // 'https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$query&key=$googlemapapikey', // ); // break; case MapProvider.mapbox: url = Uri.parse( 'https://api.mapbox.com/geocoding/v5/mapbox.places/$query.json?access_token=$mapBoxApikey&types=address,poi&limit=5&country=tn', ); break; default: throw Exception('Unsupported map provider'); } final response = await http.get(url); if (response.statusCode == 200) { return _parseSuggestions(response.body, provider); } else { throw Exception('Failed to fetch suggestions'); } } /// Parse the suggestions based on the provider List _parseSuggestions(String responseBody, MapProvider provider) { final List suggestions = []; final data = json.decode(responseBody); switch (provider) { case MapProvider.openStreetMap: for (final item in data) { suggestions.add({ 'name': item['display_name'] ?? 'Unknown Location', 'lat': item['lat'] ?? 0.0, 'lon': item['lon'] ?? 0.0, }); } break; case MapProvider.googleMaps: for (final item in data['predictions']) { suggestions.add({ 'name': item['description'] ?? 'Unknown Location', 'placeId': item['place_id'] ?? '', }); } break; case MapProvider.mapbox: for (final item in data['features']) { suggestions.add({ 'name': item['place_name'] ?? 'Unknown Location', 'lat': item['geometry']?['coordinates'][1] ?? 0.0, 'lon': item['geometry']?['coordinates'][0] ?? 0.0, }); } break; } return suggestions; } } /// Enum for map providers enum MapProvider { openStreetMap, googleMaps, mapbox }