/*
import 'dart:io' show Platform;
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

abstract class IFirebaseService {
  Future<String> get token;

  Future<dynamic> backgroundMessageHandler(Map<String, dynamic> message);

  Future<dynamic> messageHandler(Map<String, dynamic> message);

  Future<dynamic> onLaunch(Map<String, dynamic> message);

  Future<dynamic> onResume(Map<String, dynamic> message);

  void subscribeForPromotions();

  void unsubscribeFromPromotions();
}

//https://medium.com/@SebastianEngel/easy-push-notifications-with-flutter-and-firebase-cloud-messaging-d96084f5954f
class FirebaseService implements IFirebaseService {
  FirebaseMessaging _firebaseMessaging;

  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  FirebaseService() {.
    _firebaseMessaging = FirebaseMessaging();

    //https://github.com/FirebaseExtended/flutterfire/issues/1695
    _firebaseMessaging.configure(
      onMessage: messageHandler,
      onBackgroundMessage:
      Platform.isAndroid ? myBackgroundMessageHandler : null,
      onLaunch: onLaunch,
      onResume: onResume,
    );

    //monitor firebase token changes
    //https://firebase.google.com/docs/cloud-messaging/android/client#sample-register
    ///The registration token may change when:
    //
    //The app deletes Instance ID
    //The app is restored on a new device
    //The user uninstalls/reinstall the app
    //The user clears app data.
    ///

    //for the first release we don't care about token refreshes
    /*Stream<String> fcmStream = _firebaseMessaging.onTokenRefresh;
    fcmStream.listen((token) {

    });*/

    //ios specific settings
    //taken from https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_messaging/example/lib/main.dart
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });

    var initializationSettingsAndroid =
    AndroidInitializationSettings('app_icon');
    var initializationSettingsIOS =
    IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification);
    var initializationSettings = InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: selectNotification);
  }

  Future<dynamic> onDidReceiveLocalNotification(int id, String title, String body, String payload)  async{
    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'new_message_channel_id',
        'Neue Nachricht',
        'Channel für neue Nachrichten',
        importance: Importance.Max,
        priority: Priority.High,
        ticker: 'ticker');
    var iOSPlatformChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.show(
        0,
        title,
        body,
        platformChannelSpecifics);
  }

  @override
  Future backgroundMessageHandler(Map<String, dynamic> message) async {
    await myBackgroundMessageHandler(message);
  }

  @override
  Future messageHandler(Map<String, dynamic> message) async {
    print("onMessage: $message");

// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project

    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'new_message_channel_id',
        'Neue Nachricht',
        'Channel für neue Nachrichten',
        importance: Importance.Max,
        priority: Priority.High,
        ticker: 'ticker');
    var iOSPlatformChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);

    if(Platform.isAndroid) {
      await flutterLocalNotificationsPlugin.show(
          0,
          message["notification"]["title"],
          message["notification"]["body"],
          platformChannelSpecifics);
    }else if(Platform.isIOS){
      await flutterLocalNotificationsPlugin.show(
          0,
          message["aps"]["alert"]["title"],
          message["aps"]["alert"]["body"],
          platformChannelSpecifics);
    }
  }

  Future selectNotification(String payload) async {
    if (payload != null) {
      debugPrint('notification payload: ' + payload);
    }
  }

  @override
  Future onLaunch(Map<String, dynamic> message) async {
    print("onLaunch: $message");
  }

  @override
  Future onResume(Map<String, dynamic> message) async {
    print("onResume: $message");
  }

  @override
  Future<String> get token => _firebaseMessaging.getToken();

  @override
  void subscribeForPromotions() {
    _firebaseMessaging.subscribeToTopic("promotions");
  }

  @override
  void unsubscribeFromPromotions() {
    _firebaseMessaging.unsubscribeFromTopic("promotions");
  }
}

Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) {
  debugPrint("BACKGROUND MESSAGE RECEIVED");
  print("BACKGROUND MESSAGE RECEIVED");
  return Future.value(() => true);

  /*if (message.containsKey('data')) {
    // Handle data message
    final dynamic data = message['data'];
  }

  if (message.containsKey('notification')) {
    // Handle notification message
    final dynamic notification = message['notification'];
  }*/

  // Or do other work.
}
*/