import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../domain/mission/drone_profile.dart'; import 'database_provider.dart'; /// Haelt das aktuell aktive Drohnenprofil (Doku 3.5/7.3) - bestimmt u.a. den /// gueltigen Geschwindigkeits-/Hoehenbereich der Drehraeder sowie die /// Flugpfad-Machbarkeitspruefung (Kurvenradius, Steig-/Sinkrate). /// /// T1-Ranger-Konstanten dienen nur als Startwert, bevor initialize() die /// Datenbank gelesen hat (verhindert einen Zustand ganz ohne Profil waehrend /// des asynchronen Ladens). class ActiveDroneProfileNotifier extends Notifier { @override DroneProfile build() => DroneProfile.t1Ranger(); /// Stellt sicher, dass mindestens ein Profil in der Datenbank existiert, /// und laedt das zuletzt aktive (oder das erste vorhandene) Profil - /// analog dem drones/activeDrone-Bootstrap im HTML-Demonstrator. Future initialize() async { final droneRepo = ref.read(droneProfileRepositoryProvider); final settingsRepo = ref.read(appSettingsRepositoryProvider); final seededId = await droneRepo.ensureSeeded(); final settings = await settingsRepo.load(); final all = await droneRepo.loadAll(); final activeId = settings.activeDroneProfileId ?? seededId; final active = all.firstWhere( (p) => p.id == activeId, orElse: () => all.first, ); state = active; if (settings.activeDroneProfileId != active.id) { await settingsRepo.setActiveDroneProfileId(active.id); } } /// Loggt den Wechsel NICHT selbst (Doku: "Wechsel der Mission oder des /// Drohnenprofils ... nur im fly modus loggen") - dieser Provider kennt /// den App-Modus (AppModeCubit, flutter_bloc) nicht. FlyScreen beobachtet /// stattdessen selbst per ref.listen(activeDroneProfileProvider, ...) und /// loggt dort, existiert also nur, waehrend der Fly-Modus aktiv ist. Future select(DroneProfile profile) async { state = profile; await ref.read(appSettingsRepositoryProvider).setActiveDroneProfileId(profile.id); } /// Nach dem Bearbeiten des aktiven Profils dessen Werte neu einlesen. Future reloadIfActive(int id) async { if (state.id != id) return; final all = await ref.read(droneProfileRepositoryProvider).loadAll(); final updated = all.where((p) => p.id == id); if (updated.isNotEmpty) state = updated.first; } /// Nach dem Loeschen des aktiven Profils auf das erste verbleibende /// zurueckfallen (analog `if (wasActive) applyDroneProfile(drones[0])`). Future fallBackTo(DroneProfile profile) async { state = profile; await ref.read(appSettingsRepositoryProvider).setActiveDroneProfileId(profile.id); } } final activeDroneProfileProvider = NotifierProvider( ActiveDroneProfileNotifier.new);