import 'package:get/get.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; import '../../../routes/app_pages.dart'; class HomeController extends GetxController { final tinggiPakan = 0.0.obs; final statusPakan = ''.obs; final pembersih = false.obs; final pakan = false.obs; final mode = 'Manual'.obs; bool pakanNotifSent = false; final database = FirebaseDatabase.instance.ref(); final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); final box = GetStorage(); @override void onInit() { super.onInit(); _initNotifications(); _listenToFirebase(); } void _initNotifications() async { const androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); final initSettings = InitializationSettings(android: androidInit); await flutterLocalNotificationsPlugin.initialize(initSettings); } void _showNotification(String title, String body) async { const androidDetails = AndroidNotificationDetails( 'channel_id', 'Peringatan', channelDescription: 'Notifikasi penting', importance: Importance.max, priority: Priority.high, playSound: true, ); const platformDetails = NotificationDetails(android: androidDetails); await flutterLocalNotificationsPlugin.show( 0, title, body, platformDetails, ); _saveNotificationToStorage(title, body); } void _saveNotificationToStorage(String title, String body) { final now = DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now()); final List history = box.read('notification_history') ?? []; history.add({ 'judul': title, 'deskripsi': body, 'waktu': now, }); box.write('notification_history', history); } void _listenToFirebase() { database.child('sensor_data').onValue.listen((event) { final data = event.snapshot.value; if (data != null && data is Map) { double pakanValue = 0.0; if (data['tinggi_pakan'] != null) { if (data['tinggi_pakan'] is double) { pakanValue = data['tinggi_pakan']; } else if (data['tinggi_pakan'] is int) { pakanValue = (data['tinggi_pakan'] as int).toDouble(); } else if (data['tinggi_pakan'] is String) { pakanValue = double.tryParse(data['tinggi_pakan']) ?? 0.0; } } tinggiPakan.value = double.parse(pakanValue.toStringAsFixed(2)); if (pakanValue <= 1.0 && !pakanNotifSent) { _showNotification("Pakan Habis", "Pakan ikan telah habis. Segera isi kembali."); statusPakan.value = "Habis"; pakanNotifSent = true; } else if (pakanValue > 1.0 && pakanValue <= 4.0) { statusPakan.value = "Masih Berisi"; pakanNotifSent = false; } else if (pakanValue > 4.0) { statusPakan.value = "Penuh"; pakanNotifSent = false; } } }); database.child('kontrol_alat').onValue.listen((event) { final data = event.snapshot.value; if (data != null && data is Map) { pembersih.value = data['pembersih'] ?? false; pakan.value = data['pakan'] ?? false; } }); } void togglePembersih(bool value) { database.child('kontrol_alat/pembersih').set(value); } void togglePakan(bool value) { database.child('kontrol_alat/pakan').set(value); } void keNotifikasi() => Get.toNamed(Routes.NOTIFIKASI); }