import 'dart:convert';
import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:firebase_core/firebase_core.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

class AppNotifications {
  static final AppNotifications _instance = AppNotifications._internal();

  AppNotifications._internal();

  factory AppNotifications() => _instance;

  Future<void> requestPermissions() async {
    if (Platform.isIOS) {
      await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true, badge: true, sound: true);
    } else if (Platform.isAndroid) {
      AndroidFlutterLocalNotificationsPlugin? androidImplementation = flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();
      bool? granted = await androidImplementation?.requestPermission();
      if (granted == false) {
        if (kDebugMode) {
          print("-------------------- Permission Granted ------------------------");
          print(granted);
        }
        await Permission.notification.request();
      }
    }
  }

  void init(String? firebaseToken) async {
    await requestPermissions();
    AppState().setDeviceToken = firebaseToken;
    await Permission.notification.isDenied.then((bool value) {
      if (value) {
        Permission.notification.request();
      }
    });
    RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();

    if (initialMessage != null) _handleMessage(initialMessage);

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      if (message.notification != null) _handleMessage(message);
    });

    FirebaseMessaging.onMessageOpenedApp.listen(_handleOpenApp);

    FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler);

    FirebaseMessaging.instance.onTokenRefresh.listen((String token) {
      AppState().setDeviceToken = token;
    });
  }

  void _handleMessage(RemoteMessage message) {
    Utils.saveStringFromPrefs("isAppOpendByChat", "true");
  }

  void _handleOpenApp(RemoteMessage message) {
    Utils.saveStringFromPrefs("isAppOpendByChat", "true");
    Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
  }
}

AndroidNotificationChannel channel = const AndroidNotificationChannel(
  "high_importance_channel",
  "High Importance Notifications",
  importance: Importance.high,
);

Future<dynamic> backgroundMessageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  Utils.saveStringFromPrefs("isAppOpendByChat", "true");
  logger.w(message.data["user_chat_history_response"]);
  Utils.saveStringFromPrefs("notificationData", message.data["user_chat_history_response"].toString());
}
