import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hl_lieferservice/feature/car_selection/repository/car_selection_repository.dart'; import 'package:hl_lieferservice/feature/cars/model/selection.dart'; import 'package:hl_lieferservice/domain/repository/cars_repository.dart'; import 'events.dart'; import 'state.dart'; class CarSelectBloc extends Bloc { final CarSelectionRepository repository; /// Fahrzeuge des angemeldeten Accounts vom Server — gegen sie wird eine /// gespeicherte Tagesauswahl geprüft. final CarsRepository carsRepository; CarSelectBloc({required this.repository, required this.carsRepository}) : super(CarSelectInitial()) { on(_load); on(_confirm); on(_change); on(_cancel); } Future _load( CarSelectLoad event, Emitter emit, ) async { try { emit(CarSelectLoading()); final CarSelection? stored = await repository.getSelection(event.userId); final today = DateTime.now(); final bool validForToday = stored != null && stored.selectedCarId != null && stored.selectedCarPlate != null && stored.date.year == today.year && stored.date.month == today.month && stored.date.day == today.day; if (validForToday) { // Die lokale Auswahl ist nur ein Zeiger. Sie gilt nur, wenn das // Fahrzeug laut Server (frisch geladen) zu diesem Account gehört // und aktiv ist — sonst z. B. ein Fahrzeug eines anderen Fahrers, // das auf diesem Gerät gewählt wurde. final ownCars = await carsRepository.listMine(); final car = ownCars .where((c) => c.id == stored.selectedCarId && c.active) .firstOrNull; if (car != null) { emit(CarSelectComplete(selectedCar: car)); return; } await repository.clearSelection(event.userId); } emit(CarSelectRequired()); } catch (e, st) { debugPrint('CarSelectBloc._load failed: $e'); debugPrint('Stacktrace: $st'); emit(CarSelectFailed()); } } void _change(CarSelectChange event, Emitter emit) { final previousCar = state is CarSelectComplete ? (state as CarSelectComplete).selectedCar : null; emit(CarSelectRequired(previousCar: previousCar)); } void _cancel(CarSelectCancel event, Emitter emit) { // Restore without touching SharedPreferences — no tour reload needed. emit(CarSelectComplete(selectedCar: event.car)); } Future _confirm( CarSelectConfirm event, Emitter emit, ) async { try { final today = DateTime.now(); await repository.saveSelection( event.userId, CarSelection( date: today, selectedCarId: event.car.id, selectedCarPlate: event.car.plate, ), ); emit(CarSelectComplete(selectedCar: event.car)); } catch (e, st) { debugPrint('CarSelectBloc._confirm failed: $e'); debugPrint('Stacktrace: $st'); emit(CarSelectFailed()); } } }