import 'package:flutter/foundation.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/bloc/app_events.dart'; import 'package:hl_lieferservice/bloc/app_states.dart'; import 'package:hl_lieferservice/data/network/backend_config.dart'; import 'package:hl_lieferservice/data/network/backend_environment.dart'; import 'package:hl_lieferservice/data/network/environment_repository.dart'; /// Aktiviert das Networking für eine Umgebung (Registrierung im Locator). typedef EnvironmentActivator = void Function(BackendConfig config); /// App-Bootstrap-Bloc. /// /// Liest die Server-Umgebungen aus `assets/hl_server_config.json`, /// bestimmt die aktive Umgebung (gespeicherte Wahl, sonst Default) und /// registriert dafür das Networking. Ein Umgebungswechsel läuft über /// denselben Weg; die UI baut ihren Bloc-Baum pro Umgebung neu auf. class AppBloc extends Bloc { AppBloc({ required EnvironmentRepository repository, required EnvironmentActivator activate, }) : _repository = repository, _activate = activate, super(const AppInitial()) { on(_onLoad); on(_onSwitch); } final EnvironmentRepository _repository; final EnvironmentActivator _activate; Future _onLoad(AppLoadConfig event, Emitter emit) async { emit(const AppConfigLoading()); try { final catalog = await _repository.loadCatalog('assets/${event.path}'); final storedId = await _repository.loadSelectedId(); // Unbekannte ID (Umgebung aus der Config entfernt) → Default. final active = catalog.byId(storedId) ?? catalog.defaultEnvironment; _activate(catalog.configFor(active)); emit(AppConfigLoaded(catalog: catalog, active: active)); } catch (e, st) { debugPrint('AppBloc: Server-Config nicht ladbar: $e\n$st'); emit(AppConfigLoadingFailed( message: 'Server-Konfiguration konnte nicht geladen werden.\n$e', )); } } Future _onSwitch( AppSwitchEnvironment event, Emitter emit, ) async { final current = state; if (current is! AppConfigLoaded) return; if (current.active.id == event.environmentId) return; final BackendEnvironment? next = current.catalog.byId(event.environmentId); if (next == null) return; await _repository.saveSelectedId(next.id); _activate(current.catalog.configFor(next)); emit(AppConfigLoaded(catalog: current.catalog, active: next)); } }