import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:firebase_database/firebase_database.dart'; import '../models/penjadwalan_model.dart'; class PenjadwalanProvider extends ChangeNotifier { final FirebaseDatabase _database = FirebaseDatabase.instance; late DatabaseReference _penjadwalanRef; List _penjadwalans = []; bool _isLoading = true; StreamSubscription? _subscription; List get penjadwalans => _penjadwalans; bool get isLoading => _isLoading; /// Initialize provider dengan user ID dan load data dari Firebase Future initializeWithUser(String userId) async { _penjadwalanRef = _database.ref('kontrol/penjadwalan'); // Clear previous listener await _subscription?.cancel(); // Load data dari Firebase dengan real-time listener _subscription = _penjadwalanRef.onValue.listen((event) { if (event.snapshot.exists) { final data = event.snapshot.value as Map; _penjadwalans = data.entries.map((entry) { return Penjadwalan.fromJson({ 'id': entry.key, ...entry.value as Map, }); }).toList(); // Sort berdasarkan nomor untuk urutan yang rapi _penjadwalans.sort((a, b) { int numA = int.tryParse(a.id.replaceAll('penjadwalan', '')) ?? 999; int numB = int.tryParse(b.id.replaceAll('penjadwalan', '')) ?? 999; return numA.compareTo(numB); }); } else { _penjadwalans = []; } _isLoading = false; notifyListeners(); }); _isLoading = false; notifyListeners(); } /// Get next penjadwalan number (penjadwalan1, penjadwalan2, dst) String _getNextPenjadwalanKey() { if (_penjadwalans.isEmpty) return 'penjadwalan1'; int maxNum = 0; for (var p in _penjadwalans) { int num = int.tryParse(p.id.replaceAll('penjadwalan', '')) ?? 0; if (num > maxNum) maxNum = num; } return 'penjadwalan${maxNum + 1}'; } /// Clear semua data saat logout Future clearData() async { await _subscription?.cancel(); _penjadwalans = []; _isLoading = true; notifyListeners(); } List getPenjadwalanByKandang(String kandangId) { return _penjadwalans.where((p) => p.kandangId == kandangId).toList(); } Future addPenjadwalan( String kandangId, String kandangNama, String jam, String durasi, String keterangan, ) async { try { final newId = _getNextPenjadwalanKey(); final newPenjadwalan = Penjadwalan( id: newId, kandangId: kandangId, kandangNama: kandangNama, jam: jam, durasi: durasi, keterangan: keterangan, aktif: true, ); await _penjadwalanRef.child(newId).set(newPenjadwalan.toJson()); // Data akan automatically di-update via listener } catch (e) { print('Error adding penjadwalan: $e'); } } Future updatePenjadwalan( String id, String jam, String durasi, String keterangan, bool aktif, ) async { try { final index = _penjadwalans.indexWhere((p) => p.id == id); if (index != -1) { final updated = Penjadwalan( id: id, kandangId: _penjadwalans[index].kandangId, kandangNama: _penjadwalans[index].kandangNama, jam: jam, durasi: durasi, keterangan: keterangan, aktif: aktif, ); await _penjadwalanRef.child(id).set(updated.toJson()); // Data akan automatically di-update via listener } } catch (e) { print('Error updating penjadwalan: $e'); } } Future deletePenjadwalan(String id) async { try { await _penjadwalanRef.child(id).remove(); // Data akan automatically di-update via listener } catch (e) { print('Error deleting penjadwalan: $e'); } } Future togglePenjadwalan(String id) async { try { final index = _penjadwalans.indexWhere((p) => p.id == id); if (index != -1) { final updated = Penjadwalan( id: _penjadwalans[index].id, kandangId: _penjadwalans[index].kandangId, kandangNama: _penjadwalans[index].kandangNama, jam: _penjadwalans[index].jam, durasi: _penjadwalans[index].durasi, keterangan: _penjadwalans[index].keterangan, aktif: !_penjadwalans[index].aktif, ); await _penjadwalanRef.child(id).set(updated.toJson()); // Data akan automatically di-updated via listener } } catch (e) { print('Error toggling penjadwalan: $e'); } } @override void dispose() { _subscription?.cancel(); super.dispose(); } }