import 'package:flutter/foundation.dart'; import 'package:miler/data/api_config.dart'; import 'package:miler/data/miler_api.dart'; /// Reads the rider's bookings. /// /// ── What this used to be ── /// /// Three near-identical methods — `getPickupQueues`, `getCurrentPickups`, /// `getPickupQueuesPicked` — each with its own legacy URL, its own /// `fromdate`/`todate`/`userid` query and its own hand-rolled envelope /// unwrapping, and each opening with `if (ApiConfig.useNewApi) return /// _getBookingsNew(...)`. All three legacy paths hit different endpoints on a /// backend that is no longer deployed, and all three new paths were the same /// call. What is left is that one call. /// /// The three names survive because three call sites read differently — Home /// wants the queue, Bookings wants the accepted work — even though the request /// is identical and the filtering happens client-side. Collapsing them into one /// method is a separate change to the screens, not to this file. class PickupProvider { /// `GET /miler/bookings` → the list, mapped into the legacy stop shape the /// cards read. /// /// The mapping lives in [ApiConfig.pickupFromBooking] rather than here: it is /// the one place that knows how a v1 booking becomes a stop, and the same /// translation is needed by anything else that receives a booking. Future> _bookings({String? status}) async { final res = await MilerApi.bookings(status: status); if (!res.ok) { throw Exception('Failed (${res.status})${res.message.isEmpty ? '' : ': ${res.message}'}'); } final mapped = ApiConfig.pickupsFromBookings(res.list); debugPrint('[BOOKINGS] ${res.list.length} rows → ${mapped.length} stops'); if (mapped.isEmpty && res.list.isNotEmpty) { // The rows arrived and none of them survived translation, which is a // field-name mismatch rather than an empty day. Worth saying out loud — // it is the difference between "no work" and "the adapter is wrong". ApiConfig.logGap( 'pickupFromBooking', '${res.list.length} bookings returned but none mapped — check the ' 'field names against a real payload.', ); } return mapped; } /// Everything the hub has put in front of this rider today. Future> getPickupQueues({String? orderstatus}) => _bookings(status: orderstatus); /// The stops he is working now. Future> getCurrentPickups() => _bookings(); /// The stops he has accepted. Future> getPickupQueuesPicked() => _bookings(); }