Line data Source code
1 : import 'package:app_pym/core/constants/mobility.dart';
2 : import 'package:app_pym/core/utils/string_utils.dart';
3 : import 'package:app_pym/core/usecases/usecase.dart';
4 : import 'package:app_pym/domain/entities/mobility/stop_time.dart';
5 : import 'package:app_pym/domain/entities/mobility/trip.dart';
6 : import 'package:app_pym/domain/usecases/mobility/fetch_train_route.dart';
7 : import 'package:injectable/injectable.dart';
8 : import 'package:dartx/dartx.dart';
9 :
10 : @prod
11 : @lazySingleton
12 : class FetchTrainTrips extends Usecase<Future<List<Trip>>, NoParams> {
13 : final FetchTrainRoute fetchTrainRoute;
14 :
15 0 : const FetchTrainTrips(this.fetchTrainRoute);
16 :
17 : @override
18 0 : Future<List<Trip>> call(NoParams _) async {
19 0 : return _fetchTrips();
20 : }
21 :
22 0 : Future<List<Trip>> _fetchTrips() async {
23 0 : final route = await fetchTrainRoute(const NoParams());
24 :
25 0 : final DateTime now = DateTime.now();
26 : final DateTime midnight =
27 0 : DateTime(now.year, now.month, now.day, 0, 0, 0) + 1.days;
28 0 : final int today = now.weekday - 1;
29 0 : final int tomorrow = (today + 1) % 7;
30 :
31 : //initialisation du temps à minimiser
32 0 : final DateTime minTime = DateTime(now.year, now.month, now.day, 23, 59, 59);
33 0 : final DateTime minTimeTomorrow = minTime + 1.days;
34 :
35 0 : final List<DateTime> minTimes = List.generate(12, (int index) => minTime);
36 : final List<DateTime> minTimesTomorrow =
37 0 : List.generate(12, (int index) => minTimeTomorrow);
38 0 : final List<Trip> nextTrips = List.generate(12, (int index) => null);
39 0 : final List<Trip> nextTripsTomorrow = List.generate(12, (int index) => null);
40 :
41 0 : for (final trip in route.trips) {
42 : // On veut afficher les 3 prochains
43 0 : if (trip.calendar.weekdays[today]) {
44 : //StopTime de l'arrêt à Gardanne
45 0 : final StopTime stopTimeOfTrip = trip.stop_time.firstWhere((stop_time) =>
46 0 : stop_time.stop.stop_name == MobilityConstants.gareGardanne);
47 : //heure de l'arrêt
48 : final DateTime arrivalTimeOfTrip =
49 0 : stopTimeOfTrip.arrival_time.timeToDateTime();
50 : //sens du trajet
51 0 : final int sens = trip.direction_id.index;
52 :
53 : bool alreadyExists = false; //évite les doublons
54 0 : for (int i = 0; i < minTimes.length / 2; i++) {
55 0 : alreadyExists |=
56 0 : minTimes[2 * i + sens].compareTo(arrivalTimeOfTrip) == 0;
57 : }
58 : if (!alreadyExists) {
59 : //on traite différement si les trains vont à Aix
60 0 : final bool goToAix = sens == 0
61 0 : ? trip.stop_time.last.stop.stop_name == MobilityConstants.gareAix
62 0 : : trip.stop_time.first.stop.stop_name ==
63 : MobilityConstants.gareAix;
64 0 : if (arrivalTimeOfTrip.isAfter(now) &&
65 0 : arrivalTimeOfTrip.isBefore(minTimes[4 + sens])) {
66 : //si meilleur que le 3e meilleur
67 0 : minTimes[4 + sens] = arrivalTimeOfTrip;
68 0 : nextTrips[4 + sens] = trip;
69 0 : if (arrivalTimeOfTrip.isAfter(now) &&
70 0 : arrivalTimeOfTrip.isBefore(minTimes[2 + sens])) {
71 : //si meilleur que le 2e meilleur
72 0 : minTimes[4 + sens] = minTimes[2 + sens];
73 0 : nextTrips[4 + sens] = nextTrips[2 + sens];
74 0 : minTimes[2 + sens] = arrivalTimeOfTrip;
75 0 : nextTrips[2 + sens] = trip;
76 0 : if (arrivalTimeOfTrip.isAfter(now) &&
77 0 : arrivalTimeOfTrip.isBefore(minTimes[sens])) {
78 : //si meilleur que le meilleur
79 0 : minTimes[2 + sens] = minTimes[sens];
80 0 : nextTrips[2 + sens] = nextTrips[sens];
81 0 : minTimes[sens] = arrivalTimeOfTrip;
82 0 : nextTrips[sens] = trip;
83 : }
84 : }
85 : }
86 : //On refait seulement pour les trains qui vont à Aix
87 : if (goToAix) {
88 0 : if (arrivalTimeOfTrip.isAfter(now) &&
89 0 : arrivalTimeOfTrip.isBefore(minTimes[10 + sens])) {
90 : //si meilleur que le 3e meilleur
91 0 : minTimes[10 + sens] = arrivalTimeOfTrip;
92 0 : nextTrips[10 + sens] = trip;
93 0 : if (arrivalTimeOfTrip.isAfter(now) &&
94 0 : arrivalTimeOfTrip.isBefore(minTimes[8 + sens])) {
95 : //si meilleur que le 2e meilleur
96 0 : minTimes[10 + sens] = minTimes[8 + sens];
97 0 : nextTrips[10 + sens] = nextTrips[8 + sens];
98 0 : minTimes[8 + sens] = arrivalTimeOfTrip;
99 0 : nextTrips[8 + sens] = trip;
100 0 : if (arrivalTimeOfTrip.isAfter(now) &&
101 0 : arrivalTimeOfTrip.isBefore(minTimes[6 + sens])) {
102 : //si meilleur que le meilleur
103 0 : minTimes[8 + sens] = minTimes[6 + sens];
104 0 : nextTrips[8 + sens] = nextTrips[6 + sens];
105 0 : minTimes[6 + sens] = arrivalTimeOfTrip;
106 0 : nextTrips[6 + sens] = trip;
107 : }
108 : }
109 : }
110 : }
111 : }
112 : }
113 : //on veut les 3 prochains de demain
114 0 : if (trip.calendar.weekdays[tomorrow]) {
115 : //StopTime de l'arrêt à Gardanne
116 0 : final StopTime stopTimeOfTrip = trip.stop_time.firstWhere((stop_time) =>
117 0 : stop_time.stop.stop_name == MobilityConstants.gareGardanne);
118 : //l'heure de l'arrêt de demain
119 0 : final DateTime arrivalTimeOfTrip = stopTimeOfTrip.arrival_time
120 0 : .timeToDateTime()
121 0 : .add(const Duration(days: 1));
122 : //sens du trajet
123 0 : final int sens = trip.direction_id.index;
124 :
125 : bool alreadyExists = false; //évite les doublons
126 0 : for (int i = 0; i < minTimesTomorrow.length / 2; i++) {
127 0 : alreadyExists |=
128 0 : minTimesTomorrow[2 * i + sens].compareTo(arrivalTimeOfTrip) == 0;
129 : }
130 : if (!alreadyExists) {
131 : //on traite différement si les trains vont à Aix
132 0 : final bool goToAix = sens == 0
133 0 : ? trip.stop_time.last.stop.stop_name == MobilityConstants.gareAix
134 0 : : trip.stop_time.first.stop.stop_name ==
135 : MobilityConstants.gareAix;
136 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
137 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[4 + sens])) {
138 : //si meilleur que le 3e meilleur
139 0 : minTimesTomorrow[4 + sens] = arrivalTimeOfTrip;
140 0 : nextTripsTomorrow[4 + sens] = trip;
141 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
142 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[8 + sens])) {
143 : //si meilleur que le 2e meilleur
144 0 : minTimesTomorrow[4 + sens] = minTimesTomorrow[2 + sens];
145 0 : nextTripsTomorrow[4 + sens] = nextTripsTomorrow[2 + sens];
146 0 : minTimesTomorrow[2 + sens] = arrivalTimeOfTrip;
147 0 : nextTripsTomorrow[2 + sens] = trip;
148 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
149 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[sens])) {
150 : //si meilleur que le meilleur
151 0 : minTimesTomorrow[2 + sens] = minTimesTomorrow[sens];
152 0 : nextTripsTomorrow[2 + sens] = nextTripsTomorrow[sens];
153 0 : minTimesTomorrow[sens] = arrivalTimeOfTrip;
154 0 : nextTripsTomorrow[sens] = trip;
155 : }
156 : }
157 : }
158 : if (goToAix) {
159 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
160 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[10 + sens])) {
161 : //si meilleur que le 3e meilleur
162 0 : minTimesTomorrow[10 + sens] = arrivalTimeOfTrip;
163 0 : nextTripsTomorrow[10 + sens] = trip;
164 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
165 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[8 + sens])) {
166 : //si meilleur que le 2e meilleur
167 0 : minTimesTomorrow[10 + sens] = minTimesTomorrow[8 + sens];
168 0 : nextTripsTomorrow[10 + sens] = nextTripsTomorrow[8 + sens];
169 0 : minTimesTomorrow[8 + sens] = arrivalTimeOfTrip;
170 0 : nextTripsTomorrow[8 + sens] = trip;
171 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
172 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[6 + sens])) {
173 : //si meilleur que le meilleur
174 0 : minTimesTomorrow[8 + sens] = minTimesTomorrow[6 + sens];
175 0 : nextTripsTomorrow[8 + sens] = nextTripsTomorrow[6 + sens];
176 0 : minTimesTomorrow[6 + sens] = arrivalTimeOfTrip;
177 0 : nextTripsTomorrow[6 + sens] = trip;
178 : }
179 : }
180 : }
181 : }
182 : }
183 : }
184 : }
185 : //indices du prochain trip de demain à récupérer pour chaque sens
186 0 : final List<int> indicesARecuperer = [0, 1, 6, 7];
187 0 : for (int i = 0; i < 3; i++) {
188 : //pour trip aller
189 0 : if (nextTrips[2 * i] == null) {
190 0 : nextTrips[2 * i] = nextTripsTomorrow[indicesARecuperer[0]];
191 0 : indicesARecuperer[0] += 2;
192 : }
193 : //pour trip retour
194 0 : if (nextTrips[2 * i + 1] == null) {
195 0 : nextTrips[2 * i + 1] = nextTripsTomorrow[indicesARecuperer[1]];
196 0 : indicesARecuperer[1] += 2;
197 : }
198 : //idem pour train qui vont à Aix
199 0 : if (nextTrips[6 + 2 * i] == null) {
200 0 : nextTrips[6 + 2 * i] = nextTripsTomorrow[indicesARecuperer[2]];
201 0 : indicesARecuperer[2] += 2;
202 : }
203 : //pour trip retour
204 0 : if (nextTrips[6 + 2 * i + 1] == null) {
205 0 : nextTrips[6 + 2 * i + 1] = nextTripsTomorrow[indicesARecuperer[3]];
206 0 : indicesARecuperer[3] += 2;
207 : }
208 : }
209 : return nextTrips;
210 : }
211 : }
|