import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import '../providers/public_keys_provider.dart'; class MapService { Future fetchSuggestions({ required String query, required MapProvider provider, }) async { if (query.isEmpty) return []; Uri url; switch (provider) { case MapProvider.openStreetMap: // no API key needed for OSM url = Uri.parse( 'https://nominatim.openstreetmap.org/search?q=$query&format=json&addressdetails=1&limit=5', ); break; case MapProvider.mapbox: if (!publickeys.guardKey(publickeys.mapboxToken, 'mapboxToken')) { debugPrint('[MapService] Mapbox token not configured'); return []; } url = Uri.parse( 'https://api.mapbox.com/geocoding/v5/mapbox.places/$query.json' '?access_token=${publickeys.mapboxToken!}' '&types=address,poi&limit=5&country=tn', ); break; case MapProvider.googleMaps: if (!publickeys.guardKey(publickeys.googleMapKey, 'googleMapKey')) { debugPrint('[MapService] Google Maps key not configured'); return []; } url = Uri.https( 'maps.googleapis.com', '/maps/api/place/autocomplete/json', { 'input': query, 'key': publickeys.googleMapKey!, 'language': 'fr', 'components': '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: ${response.statusCode}'); } } 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 MapProvider { openStreetMap, googleMaps, mapbox }