class Trip { final String scheduledTime; // "15:31" - default departure time (first non-empty time) final String tripNumber; // "112" final String dutyNumber; // "518" final String runningNumber; // "518" final String tripType; // "", "N", "R", "F" final bool isFinishing; final Map stationTimes; // {"UXBG": "15:31", "HILL": "15:42", ...} final List stationOrder; // ["UXBG", "UXBG", "HILL", "ICKE", ...] final String direction; // "outbound" or "inbound" String? actualDepartureTime; // "15:33" (nullable - user input) String? actualFleetNumber; // "33523" (nullable - user input) Trip({ required this.scheduledTime, required this.tripNumber, required this.dutyNumber, required this.runningNumber, this.tripType = "", this.isFinishing = false, this.stationTimes = const {}, this.stationOrder = const [], this.direction = "outbound", this.actualDepartureTime, this.actualFleetNumber, }); bool get isComplete => actualDepartureTime != null && actualFleetNumber != null; Trip copyWith({ String? scheduledTime, String? tripNumber, String? dutyNumber, String? runningNumber, String? tripType, bool? isFinishing, Map? stationTimes, List? stationOrder, String? direction, String? actualDepartureTime, String? actualFleetNumber, }) { return Trip( scheduledTime: scheduledTime ?? this.scheduledTime, tripNumber: tripNumber ?? this.tripNumber, dutyNumber: dutyNumber ?? this.dutyNumber, runningNumber: runningNumber ?? this.runningNumber, tripType: tripType ?? this.tripType, isFinishing: isFinishing ?? this.isFinishing, stationTimes: stationTimes ?? this.stationTimes, stationOrder: stationOrder ?? this.stationOrder, direction: direction ?? this.direction, actualDepartureTime: actualDepartureTime ?? this.actualDepartureTime, actualFleetNumber: actualFleetNumber ?? this.actualFleetNumber, ); } Map toJson() { return { "scheduledTime": scheduledTime, "tripNumber": tripNumber, "dutyNumber": dutyNumber, "runningNumber": runningNumber, "tripType": tripType, "isFinishing": isFinishing, "stationTimes": stationTimes, "stationOrder": stationOrder, "direction": direction, "actualDepartureTime": actualDepartureTime, "actualFleetNumber": actualFleetNumber, }; } factory Trip.fromJson(Map json) { return Trip( scheduledTime: json["scheduledTime"] as String, tripNumber: json["tripNumber"] as String, dutyNumber: json["dutyNumber"] as String, runningNumber: json["runningNumber"] as String, tripType: json["tripType"] as String? ?? "", isFinishing: json["isFinishing"] as bool? ?? false, stationTimes: Map.from(json["stationTimes"] as Map? ?? {}), stationOrder: List.from(json["stationOrder"] as List? ?? []), direction: json["direction"] as String? ?? "outbound", actualDepartureTime: json["actualDepartureTime"] as String?, actualFleetNumber: json["actualFleetNumber"] as String?, ); } }