import 'package:get/get.dart'; import '../models/home_model.dart'; import '../services/appwrite_service.dart'; import '../widgets/add_weight_dialog.dart'; class HomeController extends GetxController { final isLoggedIn = false.obs; final isloading = false.obs; final List weights = [].obs; final appwriteService = AppwriteService(); @override void onInit() { _loadDataList(); super.onInit(); } @override void onReady() {} @override void onClose() {} void _loadDataList() async { isloading.value = true; if (weights.isNotEmpty) { weights.clear(); } isLoggedIn.value = await appwriteService.login(); if (isLoggedIn.value) { final documents = await appwriteService.getDocumentsFromCollection(); if (documents.isEmpty) { print( 'Keine Dokumente gefunden. Stelle sicher, dass die Collection Einträge enthält.', ); } else { print( 'Dokumente erfolgreich geladen: ${documents.length} Einträge gefunden.', ); weights.assignAll( documents.map((doc) => WeightModel.fromJson(doc.data)), ); } } else { print('Fehler beim Einloggen. Keine Daten geladen.'); } isloading.value = false; update(); } void addWeightEntry(WeightModel entry) { weights.add(entry); var map = WeightModel.toMapForAppwrite(entry); appwriteService.createDocumentInCollection(map); update(); } void editWeightEntry(WeightModel updated) { final idx = weights.indexWhere( (w) => w.documentId == updated.documentId && w.date == updated.date, ); if (idx != -1) { weights[idx] = updated; var map = WeightModel.toMapForAppwrite(updated); appwriteService.updateDocumentInCollection(updated.documentId, map); update(); } } /// Gewicht des Eintrags unmittelbar VOR [date] einer Person. /// Wird für die weightChange-Berechnung beim Bearbeiten genutzt. double getPreviousWeight(String personName, DateTime date) { final before = weights .where((w) => w.name == personName && w.date.isBefore(date)) .toList(); if (before.isEmpty) return 0.0; before.sort((a, b) => b.date.compareTo(a.date)); return before.first.weight; } /// Gibt das zuletzt eingetragene Gewicht einer Person zurück. /// 0.0 wenn noch kein Eintrag existiert (wird als "erster Eintrag" behandelt). double getLastWeight(String personName) { final personEntries = weights.where((w) => w.name == personName).toList(); if (personEntries.isEmpty) return 0.0; personEntries.sort((a, b) => b.date.compareTo(a.date)); return personEntries.first.weight; } void addWeight(String personName) {} // ── Dialog-Logik ───────────────────────────────────────────────────────── Future openAddDialog(String personName, String userId) async { final entry = await AddWeightDialog.show( userId: userId, personName: personName, lastWeight: getLastWeight(personName), ); if (entry != null) addWeightEntry(entry); } Future openEditDialog(WeightModel existing) async { final updated = await AddWeightDialog.showEdit( entry: existing, previousWeight: getPreviousWeight(existing.name, existing.date), ); if (updated != null) editWeightEntry(updated); } }