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_bus_route.dart';
7 : import 'package:injectable/injectable.dart';
8 : import 'package:dartx/dartx.dart';
9 :
10 : @prod
11 : @lazySingleton
12 : class FetchBusTrips extends Usecase<Future<List<Trip>>, NoParams> {
13 : final FetchBusRoute fetchBusRoute;
14 :
15 0 : const FetchBusTrips(this.fetchBusRoute);
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 fetchBusRoute(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 au pôle
45 0 : final StopTime stopTimeOfTrip = trip.stop_time.firstWhere((stop_time) =>
46 0 : stop_time.stop.stop_name == MobilityConstants.pymStop);
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 0 : if (arrivalTimeOfTrip.isAfter(now) &&
60 0 : arrivalTimeOfTrip.isBefore(minTimes[4 + sens])) {
61 : //si meilleur que le 3e meilleur
62 0 : minTimes[4 + sens] = arrivalTimeOfTrip;
63 0 : nextTrips[4 + sens] = trip;
64 0 : if (arrivalTimeOfTrip.isAfter(now) &&
65 0 : arrivalTimeOfTrip.isBefore(minTimes[2 + sens])) {
66 : //si meilleur que le 2e meilleur
67 0 : minTimes[4 + sens] = minTimes[2 + sens];
68 0 : nextTrips[4 + sens] = nextTrips[2 + sens];
69 0 : minTimes[2 + sens] = arrivalTimeOfTrip;
70 0 : nextTrips[2 + sens] = trip;
71 0 : if (arrivalTimeOfTrip.isAfter(now) &&
72 0 : arrivalTimeOfTrip.isBefore(minTimes[sens])) {
73 : //si meilleur que le meilleur
74 0 : minTimes[2 + sens] = minTimes[sens];
75 0 : nextTrips[2 + sens] = nextTrips[sens];
76 0 : minTimes[sens] = arrivalTimeOfTrip;
77 0 : nextTrips[sens] = trip;
78 : }
79 : }
80 : }
81 0 : if (sens == 1 &&
82 0 : trip.stop_time[1].stop.stop_name !=
83 : MobilityConstants.stopLaPlaine) {
84 : // La Plaine n'apparait pas pour tous les trips du sens ZA Avon -> 8 mai
85 : // on les traite donc différement
86 0 : if (arrivalTimeOfTrip.isAfter(now) &&
87 0 : arrivalTimeOfTrip.isBefore(minTimes[10 + sens])) {
88 : //si meilleur que le 3e meilleur
89 0 : minTimes[10 + sens] = arrivalTimeOfTrip;
90 0 : nextTrips[10 + sens] = trip;
91 0 : if (arrivalTimeOfTrip.isAfter(now) &&
92 0 : arrivalTimeOfTrip.isBefore(minTimes[8 + sens])) {
93 : //si meilleur que le 2e meilleur
94 0 : minTimes[10 + sens] = minTimes[8 + sens];
95 0 : nextTrips[10 + sens] = nextTrips[8 + sens];
96 0 : minTimes[8 + sens] = arrivalTimeOfTrip;
97 0 : nextTrips[8 + sens] = trip;
98 0 : if (arrivalTimeOfTrip.isAfter(now) &&
99 0 : arrivalTimeOfTrip.isBefore(minTimes[6 + sens])) {
100 : //si meilleur que le meilleur
101 0 : minTimes[8 + sens] = minTimes[6 + sens];
102 0 : nextTrips[8 + sens] = nextTrips[6 + sens];
103 0 : minTimes[6 + sens] = arrivalTimeOfTrip;
104 0 : nextTrips[6 + sens] = trip;
105 : }
106 : }
107 : }
108 : }
109 : }
110 : //on veut les 3 prochains de demain
111 0 : if (trip.calendar.weekdays[tomorrow]) {
112 : //StopTime de l'arrêt à Gardanne
113 0 : final StopTime stopTimeOfTrip = trip.stop_time.firstWhere(
114 0 : (stop_time) =>
115 0 : stop_time.stop.stop_name == MobilityConstants.pymStop);
116 : //l'heure de l'arrêt de demain
117 0 : final DateTime arrivalTimeOfTrip = stopTimeOfTrip.arrival_time
118 0 : .timeToDateTime()
119 0 : .add(const Duration(days: 1));
120 : //sens du trajet
121 0 : final int sens = trip.direction_id.index;
122 :
123 : bool alreadyExists = false; //évite les doublons
124 0 : for (int i = 0; i < minTimesTomorrow.length / 2; i++) {
125 0 : alreadyExists |=
126 0 : minTimesTomorrow[2 * i + sens].compareTo(arrivalTimeOfTrip) ==
127 : 0;
128 : }
129 : if (!alreadyExists) {
130 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
131 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[4 + sens])) {
132 : //si meilleur que le 3e meilleur
133 0 : minTimesTomorrow[4 + sens] = arrivalTimeOfTrip;
134 0 : nextTripsTomorrow[4 + sens] = trip;
135 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
136 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[2 + sens])) {
137 : //si meilleur que le 2e meilleur
138 0 : minTimesTomorrow[4 + sens] = minTimesTomorrow[2 + sens];
139 0 : nextTripsTomorrow[4 + sens] = nextTripsTomorrow[2 + sens];
140 0 : minTimesTomorrow[2 + sens] = arrivalTimeOfTrip;
141 0 : nextTripsTomorrow[2 + sens] = trip;
142 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
143 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[sens])) {
144 : //si meilleur que le meilleur
145 0 : minTimesTomorrow[2 + sens] = minTimesTomorrow[sens];
146 0 : nextTripsTomorrow[2 + sens] = nextTripsTomorrow[sens];
147 0 : minTimesTomorrow[sens] = arrivalTimeOfTrip;
148 0 : nextTripsTomorrow[sens] = trip;
149 : }
150 : }
151 : }
152 0 : if (sens == 1 &&
153 0 : trip.stop_time[1].stop.stop_name !=
154 : MobilityConstants.stopLaPlaine) {
155 : // La Plaine n'apparait pas pour tous les trips du sens ZA Avon -> 8 mai
156 : // on les traite donc différement
157 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
158 0 : arrivalTimeOfTrip.isBefore(minTimes[10 + sens])) {
159 : //si meilleur que le 3e meilleur
160 0 : minTimesTomorrow[10 + sens] = arrivalTimeOfTrip;
161 0 : nextTripsTomorrow[10 + sens] = trip;
162 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
163 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[8 + sens])) {
164 : //si meilleur que le 2e meilleur
165 0 : minTimesTomorrow[10 + sens] = minTimesTomorrow[8 + sens];
166 0 : nextTripsTomorrow[10 + sens] = nextTripsTomorrow[8 + sens];
167 0 : minTimesTomorrow[8 + sens] = arrivalTimeOfTrip;
168 0 : nextTripsTomorrow[8 + sens] = trip;
169 0 : if (arrivalTimeOfTrip.isAfter(midnight) &&
170 0 : arrivalTimeOfTrip.isBefore(minTimesTomorrow[6 + sens])) {
171 : //si meilleur que le meilleur
172 0 : minTimesTomorrow[8 + sens] = minTimesTomorrow[6 + sens];
173 0 : nextTripsTomorrow[8 + sens] = nextTripsTomorrow[6 + sens];
174 0 : minTimesTomorrow[6 + sens] = arrivalTimeOfTrip;
175 0 : nextTripsTomorrow[6 + sens] = trip;
176 : }
177 : }
178 : }
179 : }
180 : }
181 : }
182 : }
183 : }
184 : //indices du prochain trip de demain à récupérer pour chaque sens
185 0 : final List<int> indicesARecuperer = [0, 1];
186 0 : for (int i = 0; i < 3; i++) {
187 : //pour trip aller
188 0 : if (nextTrips[2 * i] == null) {
189 0 : nextTrips[2 * i] = nextTripsTomorrow[indicesARecuperer[0]];
190 0 : indicesARecuperer[0] += 2;
191 : }
192 : //pour trip retour
193 0 : if (nextTrips[2 * i + 1] == null) {
194 0 : nextTrips[2 * i + 1] = nextTripsTomorrow[indicesARecuperer[1]];
195 0 : indicesARecuperer[1] += 2;
196 : }
197 : //pour trip retour qui ne vont pas à La Plaine
198 0 : if (nextTrips[2 * i + 1] == null) {
199 0 : nextTrips[2 * i + 1] = nextTripsTomorrow[indicesARecuperer[1]];
200 0 : indicesARecuperer[1] += 2;
201 : }
202 : }
203 : //on duplique le sens Aller pour avoir le même format que les trains
204 0 : for (int i = 0; i < 3; i++) {
205 0 : nextTrips[6 + 2 * i] = nextTrips[2 * i];
206 : }
207 : return nextTrips;
208 : }
209 : }
|