import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import '../../../../core/utils/logger.dart'; import '../../domain/entities/rapport_trimestriel.dart'; import '../../domain/repositories/reporting_repository.dart'; // ── Events ─────────────────────────────────────────────────────────── abstract class ReportingEvent extends Equatable { const ReportingEvent(); @override List get props => []; } class LoadRapports extends ReportingEvent { final int? annee; const LoadRapports({this.annee}); @override List get props => [annee]; } class GenererRapport extends ReportingEvent { final int annee; final int trimestre; const GenererRapport({required this.annee, required this.trimestre}); @override List get props => [annee, trimestre]; } class SignerRapport extends ReportingEvent { final String id; final String signataireId; const SignerRapport({required this.id, required this.signataireId}); @override List get props => [id, signataireId]; } class ArchiverRapport extends ReportingEvent { final String id; const ArchiverRapport(this.id); @override List get props => [id]; } // ── States ─────────────────────────────────────────────────────────── abstract class ReportingState extends Equatable { const ReportingState(); @override List get props => []; } class ReportingInitial extends ReportingState { const ReportingInitial(); } class ReportingLoading extends ReportingState { const ReportingLoading(); } class ReportingLoaded extends ReportingState { final List rapports; final int annee; const ReportingLoaded({required this.rapports, required this.annee}); @override List get props => [rapports, annee]; } class ReportingError extends ReportingState { final String message; const ReportingError(this.message); @override List get props => [message]; } // ── Bloc ───────────────────────────────────────────────────────────── @injectable class ReportingBloc extends Bloc { final ReportingRepository repository; ReportingBloc(this.repository) : super(const ReportingInitial()) { on(_onLoad); on(_onGenerer); on(_onSigner); on(_onArchiver); } Future _onLoad(LoadRapports event, Emitter emit) async { emit(const ReportingLoading()); try { final annee = event.annee ?? DateTime.now().year; final rapports = await repository.lister(annee: annee); emit(ReportingLoaded(rapports: rapports, annee: annee)); } catch (e, st) { AppLogger.error('ReportingBloc: load', error: e, stackTrace: st); emit(ReportingError(e.toString())); } } Future _onGenerer(GenererRapport event, Emitter emit) async { final current = state; try { await repository.generer(annee: event.annee, trimestre: event.trimestre); // Reload list add(LoadRapports(annee: current is ReportingLoaded ? current.annee : event.annee)); } catch (e) { emit(ReportingError(e.toString())); } } Future _onSigner(SignerRapport event, Emitter emit) async { final current = state; try { await repository.signer(event.id, event.signataireId); add(LoadRapports(annee: current is ReportingLoaded ? current.annee : null)); } catch (e) { emit(ReportingError(e.toString())); } } Future _onArchiver(ArchiverRapport event, Emitter emit) async { final current = state; try { await repository.archiver(event.id); add(LoadRapports(annee: current is ReportingLoaded ? current.annee : null)); } catch (e) { emit(ReportingError(e.toString())); } } }