import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:finlytic_app/features/calendar/repositories/calendar_repository.dart'; import 'calendar_event.dart'; import 'calendar_state.dart'; export 'calendar_event.dart'; export 'calendar_state.dart'; class CalendarBloc extends Bloc { final CalendarRepository repository; CalendarBloc({required this.repository}) : super(CalendarInitial()) { on(_onFetchEvents); on(_onFilterCategoryChanged); on(_onFilterDateSelected); on(_onMonthChanged); } Future _onFetchEvents(FetchCalendarEvents event, Emitter emit) async { emit(CalendarLoading()); try { final events = await repository.fetchEvents(event.year, event.month); emit(CalendarLoaded( allEvents: events, currentMonth: DateTime(event.year, event.month), )); } catch (e) { emit(const CalendarError("Fehler beim Laden des Kalenders.")); } } void _onFilterCategoryChanged(FilterCategoryChanged event, Emitter emit) { if (state is CalendarLoaded) { final current = state as CalendarLoaded; emit(current.copyWith(selectedCategory: event.category)); } } void _onFilterDateSelected(FilterDateSelected event, Emitter emit) { if (state is CalendarLoaded) { final current = state as CalendarLoaded; if (event.date == null) { emit(current.copyWith(clearSelectedDate: true)); } else if (current.selectedDate != null && current.selectedDate!.year == event.date!.year && current.selectedDate!.month == event.date!.month && current.selectedDate!.day == event.date!.day) { emit(current.copyWith(clearSelectedDate: true)); } else { emit(current.copyWith(selectedDate: event.date)); } } } void _onMonthChanged(MonthChanged event, Emitter emit) { if (state is CalendarLoaded) { final current = state as CalendarLoaded; emit(current.copyWith( currentMonth: event.newMonth, clearSelectedDate: true, )); // Trigger new fetch for the selected month add(FetchCalendarEvents(year: event.newMonth.year, month: event.newMonth.month)); } } }