import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc.dart';
import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc_event.dart';
import '../repository/holidays_repository.dart';
import 'holidays_event.dart';
import 'holidays_state.dart';

class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, HolidaysRepository> {
  HolidaysBloc() {
    on<SetPastHolidaysVisible>((event, emit) {
      add(Emit((state) => state.copyWith(showPastHolidays: event.shouldBeVisible)));
    });

    on<DisclaimerDismissed>((event, emit) => add(
      Emit((state) => state.copyWith(showDisclaimer: false))
    ));
  }

  bool showPastHolidays() => innerState?.showPastHolidays ?? false;
  bool showDisclaimerOnEntry() => innerState?.showDisclaimer ?? false;
  List<Holiday>? getHolidays() => innerState?.holidays
      .where((element) => showPastHolidays() || DateTime.parse(element.end).isAfter(DateTime.now()))
      .toList() ?? [];

  @override
  fromNothing() => const HolidaysState(showPastHolidays: false, holidays: [], showDisclaimer: true);
  @override
  fromStorage(Map<String, dynamic> json) => HolidaysState.fromJson(json);
  @override
  Future<void> gatherData() async {
    var holidays = await repo.getHolidays();
    add(DataGathered((state) => state.copyWith(holidays: holidays)));
  }
  @override
  repository() => HolidaysRepository();
  @override
  Map<String, dynamic>? toStorage(state) => state.toJson();
}