import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../domain/usecases/get_attendance_records_usecase.dart'; import '../../../domain/usecases/get_extra_hours_usecase.dart'; import '../../../domain/usecases/get_rewards_usecase.dart'; import '../../../domain/usecases/get_punishments_usecase.dart'; import '../../../domain/models/finance_record.dart'; import '../../../domain/models/finance_category.dart'; import '../../../core/error/exceptions.dart'; // Events abstract class FinanceEvent {} class LoadFinanceDataEvent extends FinanceEvent { final String employeeId; final FinanceCategory category; LoadFinanceDataEvent({required this.employeeId, required this.category}); } // States abstract class FinanceState {} class FinanceInitial extends FinanceState {} class FinanceLoading extends FinanceState {} class FinanceLoaded extends FinanceState { final List records; final FinanceCategory category; FinanceLoaded({required this.records, required this.category}); } class FinanceError extends FinanceState { final String message; FinanceError({required this.message}); } // Bloc class FinanceBloc extends Bloc { final GetAttendanceRecordsUseCase getAttendanceRecordsUseCase; final GetExtraHoursUseCase getExtraHoursUseCase; final GetRewardsUseCase getRewardsUseCase; final GetPunishmentsUseCase getPunishmentsUseCase; FinanceBloc({ required this.getAttendanceRecordsUseCase, required this.getExtraHoursUseCase, required this.getRewardsUseCase, required this.getPunishmentsUseCase, }) : super(FinanceInitial()) { on(_onLoadFinanceData); } Future _onLoadFinanceData( LoadFinanceDataEvent event, Emitter emit, ) async { if (event.employeeId.isEmpty) { emit(FinanceError(message: 'Employee ID is missing or invalid')); return; } emit(FinanceLoading()); try { List records; switch (event.category) { case FinanceCategory.attendance: records = await getAttendanceRecordsUseCase.execute( employeeId: event.employeeId, ); break; case FinanceCategory.overtime: records = await getExtraHoursUseCase.execute( employeeId: event.employeeId, ); break; case FinanceCategory.bonus: records = await getRewardsUseCase.execute( employeeId: event.employeeId, ); break; case FinanceCategory.penalty: records = await getPunishmentsUseCase.execute( employeeId: event.employeeId, ); break; } emit(FinanceLoaded(records: records, category: event.category)); } on ServerException catch (e) { emit(FinanceError(message: e.message)); } on NetworkException catch (e) { emit(FinanceError(message: e.message)); } catch (e) { emit(FinanceError(message: 'Unexpected error occurred: ${e.toString()}')); } } }