import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:shared_preferences/shared_preferences.dart'; class NotifikasiService { static final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin(); // Flag internal untuk mencegah pengiriman notifikasi duplikat static final Map _notifikasiTerkirim = { 'alarm1': false, 'alarm2': false, 'stok0_kotak1': false, 'stok0_kotak2': false, 'stok3_kotak1': false, 'stok3_kotak2': false, }; static Future init() async { const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); await _notificationsPlugin.initialize(initializationSettings); } static Future simpanKeFirestore( String userId, String title, String body, ) async { final firestore = FirebaseFirestore.instance; await firestore .collection('users') .doc(userId) .collection('notifikasi') .add({ 'judul': title, 'pesan': body, 'timestamp': FieldValue.serverTimestamp(), }); } static Future showNotification(String title, String body) async { print('showNotification dipanggil dengan judul: $title, body: $body'); // Dihapus karena penyimpanan ke Firestore sudah dilakukan di tempat lain // final user = FirebaseAuth.instance.currentUser; // if (user != null) { // await simpanKeFirestore(user.uid, title, body); // } const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'obat_channel_id', 'Obat Channel', importance: Importance.max, priority: Priority.high, ); const NotificationDetails platformDetails = NotificationDetails( android: androidDetails, ); await _notificationsPlugin.show( DateTime.now().millisecondsSinceEpoch ~/ 1000, title, body, platformDetails, ); } static Future listenToAllNotifikasiWithUserId(String userId) async { final ref = FirebaseDatabase.instance.ref(); for (int kotak = 1; kotak <= 2; kotak++) { ref.child('status/alarm$kotak').onValue.listen((event) async { print("Alarm $kotak listener dipanggil"); bool alarmAktif = event.snapshot.value == true; final alarmKey = 'alarm$kotak'; final userIdSnapshot = await ref.child('jadwal/kotak$kotak/userId').get(); if (!userIdSnapshot.exists || userIdSnapshot.value != userId) { _notifikasiTerkirim[alarmKey] = false; return; } if (alarmAktif) { if (!_notifikasiTerkirim[alarmKey]!) { String title = 'Alarm Kotak $kotak Aktif'; String body = 'Waktunya minum obat'; await showNotification(title, body); await simpanKeFirestore(userId, title, body); _notifikasiTerkirim[alarmKey] = true; } } else { _notifikasiTerkirim[alarmKey] = false; } }); } for (int kotak = 1; kotak <= 2; kotak++) { ref.child('jadwal/kotak$kotak/jumlahObat').onValue.listen((event) async { final jumlahValue = event.snapshot.value; int jumlah = 0; if (jumlahValue is int) { jumlah = jumlahValue; } else if (jumlahValue is String) { jumlah = int.tryParse(jumlahValue) ?? 0; } final userIdSnapshot = await ref.child('jadwal/kotak$kotak/userId').get(); if (!userIdSnapshot.exists || userIdSnapshot.value != userId) { for (int i = 0; i <= 3; i++) { _notifikasiTerkirim['stok${i}_kotak$kotak'] = false; } return; } if (jumlah == 0) { final key = 'stok0_kotak$kotak'; if (!_notifikasiTerkirim[key]!) { String title = 'Obat Kotak $kotak Habis'; String body = 'Isi ulang obat segera!'; await showNotification(title, body); await simpanKeFirestore(userId, title, body); _notifikasiTerkirim[key] = true; } for (int i = 1; i <= 3; i++) { _notifikasiTerkirim['stok${i}_kotak$kotak'] = false; } } else if (jumlah > 0 && jumlah <= 3) { final key = 'stok$jumlah\_kotak$kotak'; if (!_notifikasiTerkirim[key]!) { String title = 'Obat Sisa di Kotak $kotak'; String body = 'Obat tinggal $jumlah, waktunya isi ulang'; await showNotification(title, body); await simpanKeFirestore(userId, title, body); _notifikasiTerkirim[key] = true; } for (int i = 1; i <= 3; i++) { if (i != jumlah) { _notifikasiTerkirim['stok${i}_kotak$kotak'] = false; } } _notifikasiTerkirim['stok0_kotak$kotak'] = false; } else { for (int i = 0; i <= 3; i++) { _notifikasiTerkirim['stok${i}_kotak$kotak'] = false; } } }); } } } void syncTimestampIfAuthorizedWithListener(String userId) { final ref = FirebaseDatabase.instance.ref(); ref.child('status/kotak1').onValue.listen((event) async { final now = DateTime.now(); final timestamp = now.toIso8601String(); final statusValue = event.snapshot.value; if (statusValue != true) return; final userIdSnap1 = await ref.child('jadwal/kotak1/userId').get(); final obatSnap1 = await ref.child('jadwal/kotak1/obat1').get(); if (userIdSnap1.value != userId) return; final namaObat = obatSnap1.value?.toString() ?? 'Tidak diketahui'; await FirebaseFirestore.instance .collection('users') .doc(userId) .collection('history') .add({ 'timestamp': timestamp, 'namaObat': namaObat, 'kotak': 'Kotak 1', }); print('✅ History Kotak 1 dikirim: $namaObat'); await ref.child('status/kotak1').set(false); }); ref.child('status/kotak2').onValue.listen((event) async { final now = DateTime.now(); final timestamp = now.toIso8601String(); final statusValue = event.snapshot.value; if (statusValue != true) return; final userIdSnap2 = await ref.child('jadwal/kotak2/userId').get(); final obatSnap2 = await ref.child('jadwal/kotak2/obat2').get(); if (userIdSnap2.value != userId) return; final namaObat = obatSnap2.value?.toString() ?? 'Tidak diketahui'; await FirebaseFirestore.instance .collection('users') .doc(userId) .collection('history') .add({ 'timestamp': timestamp, 'namaObat': namaObat, 'kotak': 'Kotak 2', }); print('✅ History Kotak 2 dikirim: $namaObat'); await ref.child('status/kotak2').set(false); }); }