// transit_driver_service.dart — طبقة الاتصال بـ backend/transit (جهة سائق الباص) import '../functions/crud.dart'; import '../../constant/links.dart'; import 'transit_driver_models.dart'; class TransitApiResult { final bool success; final T? data; final String message; TransitApiResult(this.success, this.data, this.message); } class TransitDriverService { static String get _base => '${AppLink.server}/transit'; static String _errMsg(dynamic res) { if (res == 'no_internet') return 'تحقق من اتصالك بالإنترنت'; if (res == 'token_expired') return 'انتهت الجلسة، حاول مجدداً'; if (res is Map && res['message'] is String) return res['message']; return 'حدث خطأ، حاول مجدداً'; } /// هل هذا الحساب سائق باص، وما معرّفه في مواصلاتي؟ static Future>> checkIsBusDriver() async { final res = await CRUD().post(link: '$_base/driver/me.php'); if (res is Map && res['status'] == 'success' && res['message'] is Map) { return TransitApiResult(true, Map.from(res['message']), 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } /// تفعيل حساب السائق بتوكن الدعوة (بعد IDOR fix لا نحتاج driver_transit_id) static Future>> activateByInviteToken( String inviteToken) async { final res = await CRUD().post( link: '$_base/driver/activate_by_app.php', payload: {'invite_token': inviteToken}, ); if (res is Map && res['status'] == 'success' && res['message'] is Map) { return TransitApiResult( true, Map.from(res['message']), 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } /// رحلات اليوم — الخادم يجلب السائق من JWT، لا نمرر driver_transit_id static Future>> getTodayTrips() async { final res = await CRUD().post(link: '$_base/trip/today.php'); if (res is Map && res['status'] == 'success' && res['message'] is Map) { final msg = res['message'] as Map; final list = (msg['trips'] is List) ? (msg['trips'] as List) .map((t) => TransitDriverTrip.fromJson(Map.from(t))) .toList() : []; return TransitApiResult(true, list, 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } static Future>> startTrip({ required int tripId, required double lat, required double lng, }) async { final res = await CRUD().post( link: '$_base/trip/start.php', payload: { 'trip_id': tripId.toString(), 'lat': lat.toString(), 'lng': lng.toString(), }, ); if (res is Map && res['status'] == 'success') { return TransitApiResult(true, Map.from(res['message'] ?? {}), 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } static Future>> endTrip({ required int tripId, }) async { final res = await CRUD().post( link: '$_base/trip/end.php', payload: {'trip_id': tripId.toString()}, ); if (res is Map && res['status'] == 'success') { return TransitApiResult(true, Map.from(res['message'] ?? {}), 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } static Future> reportDelay({ required int tripId, required int delayMinutes, String? reason, }) async { final res = await CRUD().post( link: '$_base/trip/delay.php', payload: { 'trip_id': tripId.toString(), 'delay_minutes': delayMinutes.toString(), if (reason != null) 'reason': reason, }, ); if (res is Map && res['status'] == 'success') { return TransitApiResult(true, null, 'ok'); } return TransitApiResult(false, null, _errMsg(res)); } }