// lib/features/eta/eta_model.dart // Modelo de respuesta del endpoint GET /eta?address_id=X // El backend NUNCA devuelve coordenadas; solo texto y status. enum RouteStatus { pendiente, enRuta, completada, diferida, reasignada, } RouteStatus routeStatusFromString(String s) { switch (s) { case 'en_ruta': return RouteStatus.enRuta; case 'completada': return RouteStatus.completada; case 'diferida': return RouteStatus.diferida; case 'reasignada': return RouteStatus.reasignada; default: return RouteStatus.pendiente; } } class EtaResponse { /// Texto accionable que muestra el ciudadano. /// Ejemplos: "Llega en aproximadamente 15 minutos" /// "Servicio del día finalizado" final String mensaje; /// Estado de la ruta para mostrar el badge correcto. final RouteStatus status; /// Ventana horaria opcional, ej. "7:20–7:35 p.m." /// Solo presente cuando positionId == 4 (TRUCK_PROXIMITY). final String? ventanaHoraria; const EtaResponse({ required this.mensaje, required this.status, this.ventanaHoraria, }); factory EtaResponse.fromJson(Map json) { return EtaResponse( mensaje: json['mensaje'] as String, status: routeStatusFromString(json['status'] as String), ventanaHoraria: json['ventana_horaria'] as String?, ); } /// Estado de progreso local (0-3) mapeado al positionId del backend. /// Útil para la barra de 4 pasos en la UI. int get stepIndex { switch (status) { case RouteStatus.pendiente: return 0; case RouteStatus.enRuta: return 1; case RouteStatus.completada: return 3; default: return 2; } } bool get isCompleted => status == RouteStatus.completada; bool get isNearby => ventanaHoraria != null && status == RouteStatus.enRuta; }