import 'dart:convert';
import 'dart:io';

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:google_api_availability/google_api_availability.dart';
import 'package:huawei_push/huawei_push.dart' as h_push;
import 'package:test_sa/controllers/notification/notification_manger.dart';
import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/service_request_latest/views/service_request_detail_main_view.dart';
import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart';
import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart';
import 'package:test_sa/views/pages/user/ppm/ppm_details_page.dart';

@pragma('vm:entry-point')
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {}

class FirebaseNotificationManger {
  static FirebaseMessaging messaging = FirebaseMessaging.instance;
  static String? token;

  static Future<void> getToken() async {
    NotificationSettings settings = await messaging.requestPermission(alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true);

    if (Platform.isAndroid) {
      try {
        if (!(await isGoogleServicesAvailable())) {
          h_push.Push.enableLogger();
          final result = await h_push.Push.setAutoInitEnabled(true);
          h_push.Push.onMessageReceivedStream.listen(_onMessageReceived, onError: _onMessageReceiveError);

          h_push.Push.getTokenStream.listen((hToken) {
            // onToken(token);
            // print("Huawei Token: ${hToken}");
            token = hToken;
          }, onError: (e) {
            print("Huawei TokenError" + e.toString());
          });
          h_push.Push.getToken('');
        } else {
          if (settings.authorizationStatus == AuthorizationStatus.authorized) {
            try {
              token = await messaging.getToken();
            } catch (ex) {}
          }
        }
      } catch (ex) {
        print("Notification Exception: " + ex.toString());
      }
    } else {
      if (settings.authorizationStatus == AuthorizationStatus.authorized) {
        try {
          token = await messaging.getToken();
        } catch (ex) {}
      }
    }
    //print("pushToken:$token");
  }

  static void _onMessageReceived(h_push.RemoteMessage remoteMessage) {
    print("onMessageReceivedStream:${remoteMessage.toMap()}");
  }

  static void _onMessageReceiveError(Object error) {
    print("onMessageReceivedStream:${error.toString()}");
  }

  static Future<bool> isGoogleServicesAvailable() async {
    GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability();
    String status = availability.toString().split('.').last;
    if (status == "success") {
      return true;
    }
    return false;
  }

  static void handleMessage(context, Map<String, dynamic> messageData) {
    if (messageData["requestType"] != null && messageData["requestNumber"] != null) {
      Widget? serviceClass;

      if (messageData["requestType"] == "Service request to engineer") {
        serviceClass = ServiceRequestDetailMain(requestId: messageData["requestNumber"] ?? '');
      } else if (messageData["requestType"] == "Gas Refill") {
        serviceClass = GasRefillDetailsPage(
          priority: messageData["priority"],
          date: messageData["createdOn"],
          model: GasRefillModel(id: int.parse(messageData["requestNumber"].toString())),
        );
      } else if (messageData["requestType"] == "Asset Transfer") {
        serviceClass = DeviceTransferDetails(model: AssetTransfer(id: int.parse(messageData["requestNumber"].toString())));
      } else if (messageData["requestType"] == "PPM") {
        serviceClass = PpmDetailsPage(requestId: int.parse(messageData["requestNumber"].toString()));
      }
      // else if (data["requestType"] == "WorkOrder") {
      //
      // }

      if (serviceClass != null) {
        Navigator.of(context).push(MaterialPageRoute(builder: (_) => serviceClass!));
      }
    }
  }

  static initialized(BuildContext context) async {
//TOD0 add platform check here also
    if (!(await isGoogleServicesAvailable())) {
      var initialNotification = await h_push.Push.getInitialNotification();
      if (initialNotification != null) {
        Map<String, dynamic> remoteData = Map<String, dynamic>.from(initialNotification["extras"] as Map);
        handleMessage(context, remoteData);
      }

      h_push.Push.onNotificationOpenedApp.listen((message) {
        try {
          if (message is Map<String, dynamic>) {
            Map<String, dynamic> remoteData = message;
            remoteData = remoteData["extras"];
            handleMessage(context, remoteData);
          }
        } catch (ex) {
          print("parsingError:$ex");
        }
      }, onError: (e) => print("onNotificationOpenedApp Error${e.toString()}"));
      return;
    }

    NotificationSettings settings;

    try {
      settings = await messaging.requestPermission(
        alert: true,
        announcement: false,
        badge: true,
        carPlay: false,
        criticalAlert: false,
        provisional: false,
        sound: true,
      );
    } catch (error) {
      return;
    }

    if (settings.authorizationStatus != AuthorizationStatus.authorized) {
      return;
    }

    await FirebaseMessaging.instance.setAutoInitEnabled(true);
    await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true);

    FirebaseMessaging.instance.getInitialMessage().then((initialMessage) {
      if (initialMessage != null) {
        handleMessage(context, initialMessage.data);
      }
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print('notification i got is ${message.toMap()}');
      if (Platform.isAndroid) {
        if (message.data["notificationType"] != 'NurseConfirmArrive') {
          NotificationManger.showNotification(
              title: message.notification?.title ?? "", subtext: message.notification?.body ?? "", hashcode: int.tryParse("1234" ?? "") ?? 1, payload: json.encode(message.data), context: context);
        }
      }
      return;
    });
    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      handleMessage(context, message.data);
    });
    FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
  }
}
