LCOV - code coverage report
Current view: top level - lib/domain/usecases/mobility - fetch_bus_trips.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 116 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_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             : }

Generated by: LCOV version 1.13