import 'package:get/get.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:intl/intl.dart'; import '../../../routes/app_pages.dart'; import 'package:flutter/material.dart'; class HomeController extends GetxController { final db = FirebaseDatabase.instance.ref(); final historyList = >[].obs; var feSebelum = 0.0.obs; var feSesudah = 0.0.obs; var pompaOn = false.obs; @override void onInit() { super.onInit(); _setupListeners(); ambilHistoryTerbaru(); } void _setupListeners() { // Listener untuk kadar Fe dari Firebase Realtime Database db.child("kadar_fe").onValue.listen((event) { final data = Map.from(event.snapshot.value as Map); double sebelum = double.tryParse(data['sebelum'].toString()) ?? 0.0; double sesudah = double.tryParse(data['sesudah'].toString()) ?? 0.0; // Format ke 2 angka di belakang koma feSebelum.value = double.parse(sebelum.toStringAsFixed(2)); feSesudah.value = double.parse(sesudah.toStringAsFixed(2)); }); // Listener untuk status pompa db.child("relay/pompa").onValue.listen((event) { pompaOn.value = event.snapshot.value == true; }); } // Mengambil 3 history terbaru dari Firestore void ambilHistoryTerbaru() async { final snapshot = await FirebaseFirestore.instance .collection("history") .orderBy("timestamp", descending: true) .limit(3) .get(); historyList.assignAll(snapshot.docs.map((doc) { final data = doc.data(); final time = data['timestamp']; if (time is String) { data['formatted_time'] = time; } else if (time is Timestamp) { data['formatted_time'] = DateFormat("dd-MM-yyyy HH:mm").format(time.toDate()); } else { data['formatted_time'] = "Tidak diketahui"; } return data; }).toList()); } // Toggle status pompa ke Realtime Database void togglePompa() { final newValue = !pompaOn.value; db.child("relay/pompa").set(newValue); pompaOn.value = newValue; } // Navigasi ke halaman info dan histori void keInfo() => Get.toNamed(Routes.INFO); void keHistory() => Get.toNamed(Routes.HISTORY); // Penilaian hasil deteksi berdasarkan kadar Fe String get hasilDeteksi { final fe = feSesudah.value; if (fe <= 0.3) { return "Bersih"; } else if (fe > 0.3 && fe <= 1.0) { return "Perlu Penyaringan"; } else { return "Keruh (Tercemar)"; } } // Simpan data ke Firestore Future simpanKeFirestore() async { try { final now = DateTime.now(); final timestamp = DateFormat("dd-MM-yyyy HH:mm").format(now); // Pastikan nilai disimpan dengan 2 digit desimal await FirebaseFirestore.instance.collection("history").add({ "fe_sebelum": double.parse(feSebelum.value.toStringAsFixed(2)), "fe_sesudah": double.parse(feSesudah.value.toStringAsFixed(2)), "result": hasilDeteksi, "timestamp": timestamp, }); Get.snackbar( "Berhasil", "Data berhasil disimpan ke histori", snackPosition: SnackPosition.TOP, backgroundColor: const Color(0xFF1E3A8A), colorText: Colors.white, ); ambilHistoryTerbaru(); // Refresh list setelah simpan } catch (e) { Get.snackbar( "Gagal", "Terjadi kesalahan saat menyimpan data", snackPosition: SnackPosition.TOP, backgroundColor: Colors.red, colorText: Colors.white, ); debugPrint("Error simpan: $e"); } } }