// import 'dart:convert';
// import 'dart:core';
// import 'dart:io';
// import 'dart:isolate';
// import 'dart:math';
// import 'dart:ui';
//
// import 'package:hmg_patient_app/config/shared_pref_kay.dart';
// import 'package:hmg_patient_app/core/model/geofencing/requests/GeoZonesRequestModel.dart';
// import 'package:hmg_patient_app/core/model/geofencing/requests/LogGeoZoneRequestModel.dart';
// import 'package:hmg_patient_app/core/model/geofencing/responses/GeoZonesResponseModel.dart';
// import 'package:hmg_patient_app/core/service/geofencing/GeofencingServices.dart';
// import 'package:hmg_patient_app/locator.dart';
// import 'package:hmg_patient_app/uitl/LocalNotification.dart';
// import 'package:hmg_patient_app/uitl/app_shared_preferences.dart';
// import 'package:flutter/cupertino.dart';
// import 'package:flutter/foundation.dart';
// import 'package:geofencing/geofencing.dart';
//
// class HMG_Geofencing {
//   var _testTrigger = true;
//   static var _isolatePortName = "hmg_geofencing_send_port";
//
//   List<GeoZonesResponseModel> _zones;
//   List<String> registeredGeofences = [];
//
//   final AndroidGeofencingSettings androidSettings = AndroidGeofencingSettings(initialTrigger: <GeofenceEvent>[GeofenceEvent.enter, GeofenceEvent.exit, GeofenceEvent.dwell], loiteringDelay: 1000 * 60);
//
//   final BuildContext context;
//   final List<GeofenceEvent> triggers =[];
//
//   HMG_Geofencing(this.context) {
//     triggers.add(GeofenceEvent.enter);
//     triggers.add(GeofenceEvent.exit);
//     // triggers.add(GeofenceEvent.dwell);
//   }
//
//   Future<HMG_Geofencing> loadZones() async{
//     _zones = await locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel());
//     return this;
//   }
//
//   void init() async {
//     // debug check (Testing Geo Zones)
//     if (kDebugMode) {
//       addTestingGeofences();
//     }
//     _saveZones();
//     await GeofencingManager.initialize();
//     await Future.delayed(Duration(seconds: 2));
//     _registerIsolatePort();
//     _registerGeofences().then((value) {
//       print(value.toString());
//       if(_testTrigger) {
//         var events = [GeofenceEvent.enter,GeofenceEvent.exit];
//         events.shuffle();
//         transitionTrigger(value, null, events.first);
//       }
//     });
//
//   }
//
//   void _saveZones() {
//     var list =[];
//     _zones.forEach((element) {
//       list.add(element.toJson());
//     });
//
//     var jsonString = jsonEncode(list);
//     AppSharedPreferences pref = AppSharedPreferences();
//     pref.setString(HMG_GEOFENCES, jsonString);
//   }
//
//   Future<List<String>> _registerGeofences() async {
//     registeredGeofences = await GeofencingManager.getRegisteredGeofenceIds();
//
//     var maxLimit = Platform.isIOS ? 20 : 100;
//
//     if (registeredGeofences.length < maxLimit) {
//       var notRegistered = _zones.where((element) => !(registeredGeofences.contains(element.geofenceId()))).toList();
//       for (int i = 0; i < notRegistered.length; i++) {
//         var zone = notRegistered.elementAt(i);
//         var lat = double.tryParse(zone.latitude);
//         var lon = double.tryParse(zone.longitude);
//         var rad = double.tryParse(zone.radius.toString());
//
//         if (lat != null || lon != null || rad != null) {
//           await GeofencingManager.registerGeofence(GeofenceRegion(zone.geofenceId(), lat, lon, rad, triggers), transitionTrigger);
//           registeredGeofences.add(zone.geofenceId());
//           if (registeredGeofences.length >= maxLimit) {
//             break;
//           }
//           await Future.delayed(Duration(milliseconds: 100));
//           print("Geofence: ${zone.description} registered");
//         } else {
//           print("Geofence: ${zone.description} registered");
//         }
//       }
//     }
//     return registeredGeofences;
//   }
//
//   void addTestingGeofences() {
//     _zones.add(GeoZonesResponseModel.get("24.777577,46.652675", 150, "msH"));
//     _zones.add(GeoZonesResponseModel.get("24.691136,46.650116", 150, "zkH"));
//     _zones.add(GeoZonesResponseModel.get("24.7087913,46.6656461", 150, "csO"));
//   }
//
//   static void transitionTrigger(List<String> id, Location location, GeofenceEvent event) {
//     var dataToSend = id.map((element) => {"event": event, "geofence_id": element}).toList() ?? [];
//     final SendPort send = IsolateNameServer.lookupPortByName(_isolatePortName);
//     send?.send(dataToSend);
//   }
//
//   ReceivePort _port = ReceivePort();
//   void _registerIsolatePort() async{
//     IsolateNameServer.registerPortWithName(_port.sendPort, _isolatePortName);
//     _port.listen((dynamic data) {
//
//       Future result = AppSharedPreferences().getStringWithDefaultValue(HMG_GEOFENCES,"[]");
//       result.then((jsonString){
//
//         List jsonList = json.decode(jsonString) ?? [];
//         List<GeoZonesResponseModel> geoList = jsonList.map((e) => GeoZonesResponseModel().fromJson(e)).toList() ?? [];
//
//         (data as List).forEach((element) async {
//           GeofenceEvent geofenceEvent = element["event"];
//           String geofence_id = element["geofence_id"];
//
//           GeoZonesResponseModel geoZone = _findByGeofenceFrom(geoList, by: geofence_id);
//           if(geoZone != null) {
//             LocalNotification.getInstance().showNow(
//                 title: "GeofenceEvent: ${_nameOf(geofenceEvent)}",
//                 subtitle: geoZone.description,
//                 payload: json.encode(geoZone.toJson()));
//
//             _logGeoZoneToServer(zoneId: geoZone.geofId, transition: _idOf(geofenceEvent));
//           }
//
//           await Future.delayed(Duration(milliseconds: 700));
//
//         });
//
//       });
//     });
//   }
//
//   _logGeoZoneToServer({int zoneId, int transition}){
//     locator<GeofencingServices>()
//         .logGeoZone(LogGeoZoneRequestModel(GeoType: transition, PointsID: zoneId ?? 1))
//         .then((response){
//
//     }).catchError((error){
//
//     });
//
//   }
//
//   GeoZonesResponseModel _findByGeofenceFrom(List<GeoZonesResponseModel> list, { String by}) {
//     var have = list.where((element) => element.geofenceId() == by).toList().first;
//     return have;
//   }
//
//   String _nameOf(GeofenceEvent event) {
//     switch (event) {
//       case GeofenceEvent.enter:
//         return "Enter";
//       case GeofenceEvent.exit:
//         return "Exit";
//       case GeofenceEvent.dwell:
//         return "dWell";
//       default:
//         return event.toString();
//     }
//   }
//
//   int _idOf(GeofenceEvent event){
//     switch (event) {
//       case GeofenceEvent.enter:
//         return 1;
//       case GeofenceEvent.exit:
//         return 2;
//       case GeofenceEvent.dwell:
//         return 3;
//       default:
//         return -1;
//     }
//   }
// }
