buscarSiguienteParada static method

Map<String, dynamic>? buscarSiguienteParada({
  1. required LatLngModel currentLocation,
  2. required LatLngModel previousLocation,
  3. required List<Map<String, dynamic>> stops,
  4. required Map<String, dynamic> dataParadaAnterior,
})

Calcula la siguiente parada basada en la ubicación actual y anterior.

currentLocation: Ubicación actual. previousLocation: Ubicación anterior. stops: Lista de paradas, cada parada es un mapa que contiene descripción, tipo y localización.

Las paradas deben venir ordenadas según su secuencia para asegurar que la lógica de determinación de la próxima parada sea correcta.

Devuelve un mapa con la información de la próxima parada si se encuentra alguna dentro del criterio establecido; de lo contrario, devuelve null.

Implementation

static Map<String, dynamic>? buscarSiguienteParada(
    {required LatLngModel currentLocation,
    required LatLngModel previousLocation,
    required List<Map<String, dynamic>> stops,
    required Map<String, dynamic> dataParadaAnterior}) {
  const double threshold =
      20.0; // Distancia mínima de 10 metros para considerar movimiento significativo.

  // Verifica si el usuario se ha movido una distancia mínima.
  if (FlutterUtilsProvider.calculaDistanciaGeoEnMetros(
          previousLocation, currentLocation) <
      threshold) {
    return null; // Retorna null si el movimiento es menor que el umbral, indicando no cambio significativo.
  }

  double minDistance = double.infinity;

  Map<String, dynamic>? closestStop;

  // Itera sobre cada parada para encontrar la más cercana que se está acercando.
  for (final stop in stops) {
    if (dataParadaAnterior.isNotEmpty &&
        dataParadaAnterior['secuencia'] > stop['secuencia']) {
      continue;
    }
    final prevDistance = FlutterUtilsProvider.calculaDistanciaGeoEnMetros(
        previousLocation, stop["localizacion"]);
    final currDistance = FlutterUtilsProvider.calculaDistanciaGeoEnMetros(
        currentLocation, stop["localizacion"]);

    // Comprueba si la distancia actual es menor que la distancia anterior y si es la más cercana encontrada.
    // if (currDistance < prevDistance &&
    //     (minDistance == null || currDistance < minDistance)) {
    if (currDistance < prevDistance && currDistance < minDistance) {
      minDistance = currDistance;
      closestStop = stop;

      // Interrumpe el bucle si se encuentra una parada más cercana que se está acercando.
    }
  }

  // Verifica si la parada encontrada está dentro de un umbral aceptable.
  if (minDistance != double.infinity && minDistance > threshold) {
    return closestStop; // Retorna la parada más cercana si cumple con el criterio.
  }

  return null; // Retorna null si ninguna parada cumple con el criterio establecido.
}