Untitled

 avatar
unknown
plain_text
5 months ago
6.4 kB
3
Indexable
import 'package:flutter/cupertino.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:woozy_search/woozy_search.dart';

import '../../../../src/find/domain/entities/charger.dart';
import '../../../../src/find/domain/entities/charger_station.dart';
import '../../../../src/find/domain/entities/filter.dart';

class ChargeStationsProvider extends ChangeNotifier {
  List<ChargeStation>? _favoriteChargeStations;
  List<ChargeStation>? _chargeStations;
  List<ChargeStation>? _filteredChargeStations;

  final Woozy<ChargeStation> _searcher = Woozy<ChargeStation>();

  List<ChargeStation>? get chargeStations =>
      _filteredChargeStations ?? _chargeStations;

  List<ChargeStation>? get favoriteChargeStations => _favoriteChargeStations;

  void initChargeStations(List<ChargeStation> chargeStations) {
    _chargeStations = chargeStations;
    _filteredChargeStations = chargeStations;
    notifyListeners();

    _searcher
        .setEntries(chargeStations.map((station) => station.name).toList());
    notifyListeners();
  }

  void initFavoriteChargeStations(List<ChargeStation> favoriteChargeStations) {
    if (_favoriteChargeStations != favoriteChargeStations) {
      _favoriteChargeStations = favoriteChargeStations;
    }
    notifyListeners();
  }

  set favoriteChargeStations(List<ChargeStation>? favoriteChargeStations) {
    if (_favoriteChargeStations != favoriteChargeStations) {
      _favoriteChargeStations = favoriteChargeStations;
      Future.delayed(Duration.zero, notifyListeners);
    }
  }

  ChargeStation? _favoriteChargeStationItem;
  ChargeStation? get favoriteChargeStationItem => _favoriteChargeStationItem;

  void selectFavoriteChargeStation(ChargeStation? favoriteChargeStationItem) {
    _favoriteChargeStationItem = favoriteChargeStationItem;
    notifyListeners();
  }

  set favoriteChargeStationItem(ChargeStation? favoriteChargeStationItem) {
    if (_favoriteChargeStationItem != favoriteChargeStationItem) {
      _favoriteChargeStationItem = favoriteChargeStationItem;
      Future.delayed(Duration.zero, notifyListeners);
    }
  }

  bool isFavoriteChargeStations(ChargeStation chargerStation) {
    if (_favoriteChargeStations != null) {
      for (var favoriteChargeStation in _favoriteChargeStations!) {
        if (favoriteChargeStation == chargerStation) {
          return true;
        }
      }
    }
    return false;
  }

  void addFavoriteChargeStations(String chargerStationId) {
    try {
      final ChargeStation chargerStation = _chargeStations!.firstWhere(
        (element) => element.id == chargerStationId,
      );
      _favoriteChargeStations!.add(chargerStation);
    } catch (e) {
      return;
    }
    notifyListeners();
  }

  void deleteFavoriteChargeStations(String chargerStationId) {
    try {
      final ChargeStation chargerStation = _favoriteChargeStations!.firstWhere(
        (element) => element.id == chargerStationId,
      );
      _favoriteChargeStations!.remove(chargerStation);
    } catch (e) {
      return;
    }
    notifyListeners();
  }

  void toggleFavoriteStatus(ChargeStation chargerStation) {
    if (isFavoriteChargeStations(chargerStation)) {
      deleteFavoriteChargeStations(chargerStation.id);
    } else {
      addFavoriteChargeStations(chargerStation.id);
    }
    notifyListeners();
  }

  ChargeStation? _chargeStationItem;
  ChargeStation? get chargeStationItem => _chargeStationItem;

  void selectChargeStation(ChargeStation? chargerStationItem) {
    _chargeStationItem = chargerStationItem;
    notifyListeners();
  }

  set chargeStationItem(ChargeStation? chargerStationItem) {
    if (_chargeStationItem != chargerStationItem) {
      _chargeStationItem = chargerStationItem;
      Future.delayed(Duration.zero, notifyListeners);
    }
  }

  Set<Marker> _markers = {};
  Set<Marker> get markers => _markers;

  void initMarkers(Set<Marker> markers) {
    if (_markers != markers) {
      _markers = markers;
    }
    notifyListeners();
  }

  // Function to get charger types and their counts
  Map<String, int> getChargerTypeCounts(List<Charger> chargers) {
    Map<String, int> chargerTypeCounts = {};

    for (var charger in chargers) {
      if (chargerTypeCounts.containsKey(charger.chargerType)) {
        chargerTypeCounts[charger.chargerType] =
            chargerTypeCounts[charger.chargerType]! + 1;
      } else {
        chargerTypeCounts[charger.chargerType] = 1;
      }
    }

    return chargerTypeCounts;
  }

  // Search functionality using Woozy
  void searchChargeStations(String query) {
    if (query.isEmpty) {
      _filteredChargeStations = _chargeStations; // Show all if query is empty
    } else {
      final results = _searcher.search(query);
      _filteredChargeStations = results
          .map((result) => _chargeStations!
              .firstWhere((station) => station.name == result.text))
          .toList();
    }
    notifyListeners();
  }

  Filter _filter = const Filter(
    minimumPower: 0,
    connectors: [],
    chargeStations: [],
  );

  Filter get filter => _filter;

  void setFilter(Filter filter) {
    _filter = filter;
    notifyListeners();
  }

  List<ChargeStation>? _filterListChargeStations;
  List<ChargeStation>? get filterListChargeStations =>
      _filterListChargeStations;

  void setFilterListChargeStations(List<ChargeStation> chargeStations) {
    _filterListChargeStations = chargeStations;
    notifyListeners();
  }

  set filterListChargeStations(List<ChargeStation>? filterListChargeStations) {
    if (_filterListChargeStations != filterListChargeStations) {
      _filterListChargeStations = filterListChargeStations;
      Future.delayed(Duration.zero, notifyListeners);
    }
  }

  // void filterChargeStations(int minimumPower, List<String> selectedConnectors) {
  //   _filteredChargeStations = _chargeStations!
  //       .where((station) {
  //         return station.chargers.any((charger) {
  //           final matchesPower = charger.power <= minimumPower;
  //           final matchesConnector = selectedConnectors.contains(charger.chargerType);
  //           return matchesPower && matchesConnector;
  //         });
  //       })
  //       .toList();
  //   notifyListeners();
  // }
}
Editor is loading...
Leave a Comment