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; HomepageStats({ required this.totalMileage, required this.yearlyMileage, required this.topLocos, required this.leaderboard, required this.trips, }); factory HomepageStats.fromJson(Map json) { return HomepageStats( totalMileage: (json['milage_data']['mileage'] as num).toDouble(), 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(), ); } } 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 LocoSummary { final String locoType, locoClass, locoNumber, locoName, locoOperator; final String? locoNotes, locoEvn; final int locoId; final int? locoJourneys; final double? locoMileage; LocoSummary({ required this.locoType, required this.locoClass, required this.locoNumber, required this.locoName, required this.locoOperator, this.locoNotes, this.locoEvn, required this.locoId, this.locoMileage, this.locoJourneys, }); factory LocoSummary.fromJson(Map json) => LocoSummary( locoType: json['loco_type'], locoClass: json['loco_class'], locoNumber: json['loco_number'], locoName: json['loco_name'] ?? "", locoOperator: json['loco_operator'], locoNotes: json['loco_notes'], locoEvn: json['loco_evn'], locoId: json['loco_id'], locoMileage: (json['loco_mileage'] as num).toDouble(), locoJourneys: json['loco_journeys'], ); } 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 Loco { final int id; final String type, number, name, locoClass, operator; final String? 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['loco_type'], number: json['loco_number'], name: json['loco_name'] ?? "", locoClass: json['loco_class'], operator: json['loco_operator'], notes: json['loco_notes'], evn: json['loco_evn'], ); } 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(), ); }