
import 'dart:typed_data';

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:get/route_manager.dart';

import '../Controller/Dashboard/Tabs/Completedordercontroller.dart';
import '../Controller/Dashboard/Tabs/Ongoingordercontroller.dart';
import '../Controller/Dashboard/Tabs/Ordercontroller.dart';
import '../View/Home/Homeview.dart';
import '../maindev.dart';



class LocalNotificationService {


  static final instance = FirebaseMessaging.instance;
  static final FlutterLocalNotificationsPlugin _notificationsPlugin =
  FlutterLocalNotificationsPlugin();
  int? moduleId;
  String? notificationOrderId;
  int? locationId;
  static void setValues(message){

  }

  static void initialize(BuildContext context) async{

    instance.requestPermission(
      alert: true,
      badge: true,
      sound: true,
    );
    await _notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
    final DarwinInitializationSettings initializationSettingsIOS = DarwinInitializationSettings(
      requestSoundPermission: false,
      requestBadgePermission: false,
      requestAlertPermission: false,
    );
    final InitializationSettings initializationSettings =
    InitializationSettings(
        android: AndroidInitializationSettings("ic_launcher"),
        iOS: initializationSettingsIOS
    );

    _notificationsPlugin.initialize(
        initializationSettings,
        onDidReceiveNotificationResponse: (NotificationResponse response) {
          if (response.payload != null) {
            selectNotification(response.payload!);
          }
        });


    // TextToSpeech tts = TextToSpeech();

    CurrentOrderController currentOrderController = Get.put(CurrentOrderController());
    OnGoingOrderController onGoingOrderController = Get.put(OnGoingOrderController());
    CompletedOrderController completedOrderController = Get.put(CompletedOrderController())  ;


    FirebaseMessaging.instance.getInitialMessage().then((message) async{
      if (message != null) {

        RemoteNotification notification = message.notification!;
        AndroidNotification? android = message.notification?.android;
        if (android != null) {

          display(message);
          currentOrderController.getOrder('created');
          onGoingOrderController.getCurrentOrder();
          completedOrderController.getCompletedOrder();

        }
      }
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) async{
      print('message before data ');
      print(message.data);
      RemoteNotification notification = message.notification!;
      AndroidNotification? android = message.notification?.android;
      print('message before if data ');

      if (android != null) {

        display(message);
        currentOrderController.getOrder('created');
        onGoingOrderController.getCurrentOrder();
        completedOrderController.getCompletedOrder();

        print('message after if data ');
      }
    });

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async{
      print('A new onMessageOpenedApp event was published!');
      // message.data['orderid'];
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      if (notification != null && android != null) {

        Get.to(()=> HomeView(selectedIndex: 0,));

      }
    });

  }


  static Future<dynamic> selectNotification(String? payload) async {

    try {
      Get.to(()=> HomeView(selectedIndex: 0,));
    } on Exception catch (e) {
      print(e);
    }
  }



  static void display(RemoteMessage message) async {
    print('message notification${message.notification}');
    print('message mutableContent${message.mutableContent}');

    try {
      final id = DateTime.now().millisecondsSinceEpoch ~/1000;


      final NotificationDetails notificationDetails = NotificationDetails(

        android:  AndroidNotificationDetails(
          "Nearlexpress Business",
          "Nearlexpress Business Notification",
          importance: Importance.max,
          priority: Priority.high,
          icon: 'ic_launcher',
          playSound: true,
          sound: RawResourceAndroidNotificationSound('ring'),
          largeIcon: const DrawableResourceAndroidBitmap('ic_launcher'),
          vibrationPattern: Int64List.fromList([500, 1000, 500]),
          enableVibration:true,
        ),
      );

      await _notificationsPlugin.show(
        id,
        message.notification!.title,
        message.notification!.body,
        notificationDetails,
        payload: message.data.toString(),
      );
    } on Exception catch (e) {
      print(e);
    }
  }


}