LCOV - code coverage report
Current view: top level - lib/domain/usecases/mobility - fetch_train_trips.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 118 0.0 %
Date: 2020-06-26 11:36:11 Functions: 0 0 -

          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             : }

Generated by: LCOV version 1.13