TKK_E32230814/railway-worker/lib/models/jadwal_model.dart

118 lines
3.0 KiB
Dart

/// Model untuk Jadwal Penyiraman
/// Digunakan untuk menyimpan konfigurasi jadwal di Firebase
class JadwalModel {
final String id; // jadwal_1, jadwal_2, etc.
final bool aktif;
final String waktu; // Format: "HH:mm"
final int durasi; // Dalam detik
final List<int> potAktif; // Array pot yang aktif [1, 2, 3, 4, 5]
final bool pompaAir;
final bool pompaPupuk;
final bool pompaPengaduk;
JadwalModel({
required this.id,
this.aktif = true,
required this.waktu,
this.durasi = 60,
this.potAktif = const [],
this.pompaAir = true,
this.pompaPupuk = false,
this.pompaPengaduk = false,
});
/// Create from Firebase JSON
factory JadwalModel.fromJson(String id, Map<String, dynamic> json) {
return JadwalModel(
id: id,
aktif: json['aktif'] ?? true,
waktu: json['waktu'] ?? '08:00',
durasi: json['durasi'] ?? 60,
potAktif: _parsePotAktif(json['pot_aktif']),
pompaAir: json['pompa_air'] ?? true,
pompaPupuk: json['pompa_pupuk'] ?? false,
pompaPengaduk: json['pompa_pengaduk'] ?? false,
);
}
/// Parse pot_aktif to List<int>
static List<int> _parsePotAktif(dynamic potAktif) {
if (potAktif == null) return [];
if (potAktif is List) {
return potAktif
.map((e) => e is int ? e : int.tryParse(e.toString()) ?? 0)
.toList();
}
return [];
}
/// Convert to Firebase JSON
Map<String, dynamic> toJson() {
return {
'aktif': aktif,
'waktu': waktu,
'durasi': durasi,
'pot_aktif': potAktif,
'pompa_air': pompaAir,
'pompa_pupuk': pompaPupuk,
'pompa_pengaduk': pompaPengaduk,
};
}
/// Copy with new values
JadwalModel copyWith({
String? id,
bool? aktif,
String? waktu,
int? durasi,
List<int>? potAktif,
bool? pompaAir,
bool? pompaPupuk,
bool? pompaPengaduk,
}) {
return JadwalModel(
id: id ?? this.id,
aktif: aktif ?? this.aktif,
waktu: waktu ?? this.waktu,
durasi: durasi ?? this.durasi,
potAktif: potAktif ?? this.potAktif,
pompaAir: pompaAir ?? this.pompaAir,
pompaPupuk: pompaPupuk ?? this.pompaPupuk,
pompaPengaduk: pompaPengaduk ?? this.pompaPengaduk,
);
}
/// Get durasi dalam menit untuk display
int get durasiMenit => (durasi / 60).round();
/// Check if pot is selected
bool isPotAktif(int potNumber) {
return potAktif.contains(potNumber);
}
/// Get formatted time for display
String get waktuFormatted {
return waktu;
}
/// Get pot aktif as string for display
String get potAktifString {
if (potAktif.isEmpty) return 'Tidak ada pot';
if (potAktif.length == 5) return 'Semua pot (1-5)';
return 'Pot ${potAktif.join(', ')}';
}
/// Validate jadwal
bool get isValid {
return waktu.isNotEmpty &&
durasi > 0 &&
potAktif.isNotEmpty &&
potAktif.every((pot) => pot >= 1 && pot <= 5);
}
@override
String toString() {
return 'JadwalModel(id: $id, aktif: $aktif, waktu: $waktu, durasi: ${durasi}s, pot: $potAktif)';
}
}