import 'package:flutter/material.dart'; class DestinationObject { const DestinationObject( this.label, this.icon, this.selectedIcon, this.pageWidget, ); final String label; final Widget icon; final Widget selectedIcon; final Widget pageWidget; } class UserData { const UserData(this.username, this.full_name, this.user_id, this.email); final String user_id; final String username; final String full_name; final String email; } class AuthenticatedUserData extends UserData { const AuthenticatedUserData({ required String user_id, required String username, required String full_name, required String email, required this.access_token, }) : super(username, full_name, user_id, email); final String access_token; } class HomepageStats { final double totalMileage; final List yearlyMileage; final List topLocos; final List leaderboard; final List trips; final UserData? user; HomepageStats({ required this.totalMileage, required this.yearlyMileage, required this.topLocos, required this.leaderboard, required this.trips, this.user, }); factory HomepageStats.fromJson(Map json) { final userData = json['user_data']; final mileageData = json['milage_data']; final totalMileage = mileageData is Map && mileageData['mileage'] != null ? (mileageData['mileage'] as num).toDouble() : 0.0; return HomepageStats( totalMileage: totalMileage, yearlyMileage: (json['yearly_mileage'] as List? ?? []) .map((e) => YearlyMileage.fromJson(e)) .toList(), topLocos: (json['top_locos'] as List? ?? []) .map((e) => LocoSummary.fromJson(e)) .toList(), leaderboard: (json['leaderboard_data'] as List? ?? []) .map((e) => LeaderboardEntry.fromJson(e)) .toList(), trips: (json['trip_data'] as List? ?? []) .map((e) => TripSummary.fromJson(e)) .toList(), user: userData == null ? null : UserData( userData['username'] ?? '', userData['full_name'] ?? '', userData['user_id'] ?? '', userData['email'] ?? '', ), ); } } class YearlyMileage { final int? year; final double mileage; YearlyMileage({this.year, required this.mileage}); factory YearlyMileage.fromJson(Map json) => YearlyMileage( year: json['year'], mileage: (json['mileage'] as num).toDouble(), ); } class Loco { final int id; final String type, number, locoClass; final String? name, operator, notes, evn; Loco({ required this.id, required this.type, required this.number, required this.name, required this.locoClass, required this.operator, this.notes, this.evn, }); factory Loco.fromJson(Map json) => Loco( id: json['loco_id'], type: json['type'], number: json['number'], name: json['name'] ?? "", locoClass: json['class'], operator: json['operator'], notes: json['notes'], evn: json['evn'], ); } class LocoSummary extends Loco { final double? mileage; final int? journeys; final int? trips; final String? status; final String? domain; final String? owner; final String? livery; final String? location; final Map extra; LocoSummary({ required int locoId, required String locoType, required String locoNumber, required String locoName, required String locoClass, required String locoOperator, String? locoNotes, String? locoEvn, this.mileage, this.journeys, this.trips, this.status, this.domain, this.owner, this.livery, this.location, Map? extra, }) : extra = extra ?? const {}, super( id: locoId, type: locoType, number: locoNumber, name: locoName, locoClass: locoClass, operator: locoOperator, notes: locoNotes, evn: locoEvn, ); factory LocoSummary.fromJson(Map json) => LocoSummary( locoId: json['loco_id'] ?? json['id'] ?? 0, locoType: json['type'] ?? json['loco_type'] ?? '', locoNumber: json['number'] ?? json['loco_number'] ?? '', locoName: json['name'] ?? json['loco_name'] ?? "", locoClass: json['class'] ?? json['loco_class'] ?? '', locoOperator: json['operator'] ?? json['loco_operator'] ?? '', locoNotes: json['notes'], locoEvn: json['evn'] ?? json['loco_evn'], mileage: ((json['loco_mileage'] ?? json['mileage']) as num?) ?.toDouble() ?? 0, journeys: (json['loco_journeys'] ?? json['journeys'] ?? 0) is num ? (json['loco_journeys'] ?? json['journeys'] ?? 0).toInt() : 0, trips: (json['loco_trips'] ?? json['trips']) is num ? (json['loco_trips'] ?? json['trips']).toInt() : null, status: json['status'] ?? json['loco_status'], domain: json['domain'], owner: json['owner'] ?? json['loco_owner'], livery: json['livery'], location: json['location'], extra: Map.from(json), ); } class LeaderboardEntry { final String userId, username, userFullName; final double mileage; LeaderboardEntry({ required this.userId, required this.username, required this.userFullName, required this.mileage, }); factory LeaderboardEntry.fromJson(Map json) => LeaderboardEntry( userId: json['user_id'], username: json['username'], userFullName: json['user_full_name'], mileage: (json['mileage'] as num).toDouble(), ); } class TripSummary { final int tripId; final String tripName; final double tripMileage; TripSummary({ required this.tripId, required this.tripName, required this.tripMileage, }); factory TripSummary.fromJson(Map json) => TripSummary( tripId: json['trip_id'], tripName: json['trip_name'], tripMileage: (json['trip_mileage'] as num).toDouble(), ); } class Leg { final int id, tripId, timezone, driving; final String start, end, route, network, notes, headcode, user; final DateTime beginTime; final double mileage; final List locos; Leg({ required this.id, required this.tripId, required this.start, required this.end, required this.beginTime, required this.timezone, required this.network, required this.route, required this.mileage, required this.notes, required this.headcode, required this.driving, required this.user, required this.locos, }); factory Leg.fromJson(Map json) => Leg( id: json['leg_id'], tripId: json['leg_trip'] ?? 0, start: json['leg_start'], end: json['leg_end'], beginTime: DateTime.parse(json['leg_begin_time']), timezone: (json['leg_timezone'] as num).toInt(), network: json['leg_network'] ?? "", route: json['leg_route'], mileage: (json['leg_mileage'] as num).toDouble(), notes: json['leg_notes'] ?? "", headcode: json['leg_headcode'] ?? "", driving: json['leg_driving'], user: json['leg_user'], locos: (json['locos'] as List) .map((e) => Loco.fromJson(e as Map)) .toList(), ); } class RouteError { final String error; final String msg; RouteError({required this.error, required this.msg}); factory RouteError.fromJson(Map json) { return RouteError(error: json["error"], msg: json["msg"]); } } class RouteResult { final List inputRoute; final List calculatedRoute; final List costs; final double distance; RouteResult({ required this.inputRoute, required this.calculatedRoute, required this.costs, required this.distance, }); factory RouteResult.fromJson(Map json) { return RouteResult( inputRoute: List.from(json['input_route']), calculatedRoute: List.from(json['calculated_route']), costs: (json['costs'] as List).map((e) => (e as num).toDouble()).toList(), distance: (json['distance'] as num).toDouble(), ); } } class Station { final int id; final String name; final String network; final String country; Station({ required this.id, required this.name, required this.network, required this.country, }); factory Station.fromJson(Map json) => Station( id: json['id'], name: json['name'], network: json['network'], country: json['country'], ); } class TripLeg { final int? id; final String start; final String end; final DateTime? beginTime; final String? network; final String? route; final double? mileage; final String? notes; final List locos; TripLeg({ required this.id, required this.start, required this.end, required this.beginTime, required this.network, required this.route, required this.mileage, required this.notes, required this.locos, }); factory TripLeg.fromJson(Map json) => TripLeg( id: json['leg_id'], start: json['leg_start'] ?? '', end: json['leg_end'] ?? '', beginTime: json['leg_begin_time'] != null && json['leg_begin_time'] is String ? DateTime.tryParse(json['leg_begin_time']) : (json['leg_begin_time'] is DateTime ? json['leg_begin_time'] : null), network: json['leg_network'], route: json['leg_route'], mileage: (json['leg_mileage'] as num?)?.toDouble(), notes: json['leg_notes'], locos: (json['locos'] as List?) ?.map((e) => Loco.fromJson(e as Map)) .toList() ?? [], ); } class TripDetail { final int id; final String name; final double mileage; final int legCount; final List legs; TripDetail({ required this.id, required this.name, required this.mileage, required this.legCount, required this.legs, }); factory TripDetail.fromJson(Map json) => TripDetail( id: json['trip_id'] ?? 0, name: json['trip_name'] ?? '', mileage: (json['trip_mileage'] as num?)?.toDouble() ?? 0, legCount: json['leg_count'] ?? ((json['trip_legs'] as List?)?.length ?? 0), legs: (json['trip_legs'] as List?) ?.map((e) => TripLeg.fromJson(e as Map)) .toList() ?? [], ); }