import '../../../core/api/antlaq_api.dart'; import '../../../core/api/api_client.dart'; import 'models/place_model.dart'; import 'models/route_model.dart'; /// نقطة وصول وحيدة لبيانات الخرائط والبحث الصوتي الذكي عبر الباك إند. class MapsRepository { final AntlaqApi _api; final ApiClient? _apiClient; MapsRepository(this._api, [this._apiClient]); /// بحث صوتي ذكي يمر عبر الباك إند (Gemini AI). Future> voiceSearch(String text, {double? lat, double? lng}) async { if (text.trim().isEmpty) return []; try { if (_apiClient != null) { final res = await _apiClient.dio.post('/maps/voice-search', data: { 'text': text, if (lat != null) 'lat': lat, if (lng != null) 'lng': lng, }); final list = res.data as List?; if (list != null) { return list .map((e) => PlaceModel.fromJson(e as Map)) .toList(); } } } catch (_) {} return search(text); } /// بحث أماكن — يمر عبر GET /api/geocoding/search. Future> search(String query) async { if (query.trim().length < 2) return []; final items = await _api.search(query); return items .map((e) => PlaceModel.fromJson(e as Map)) .toList(); } /// تفكيك عنوان عكسي (إحداثيات → نص). Future reverseGeocode(double lat, double lng) async { final j = await _api.reverse(lat, lng); final name = (j['name_ar'] ?? j['name'] ?? j['formattedAddress'] ?? '') as String; final addr = (j['address'] ?? j['full_address'] ?? j['formattedAddress'] ?? '') as String; return PlaceModel.fromJson({ 'name': name, 'full_address': addr.isNotEmpty ? addr : name, 'latitude': lat, 'longitude': lng, }); } /// حساب المسار بين نقطتين عبر الباك إند (GET /maps/route). Future getRoute({ required double fromLat, required double fromLng, required double toLat, required double toLng, }) async { try { if (_apiClient != null) { final res = await _apiClient.dio.get('/maps/route', queryParameters: { 'fromLat': fromLat, 'fromLng': fromLng, 'toLat': toLat, 'toLng': toLng, }); if (res.data != null && res.data is Map) { return RouteModel.fromJson(res.data as Map); } } } catch (_) {} final j = await _api.route( fromLat: fromLat, fromLng: fromLng, toLat: toLat, toLng: toLng, ); return RouteModel.fromJson(j); } }