import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:injectable/injectable.dart';

import '../../../../core/utils/logger.dart';
import '../../data/repositories/notification_feed_repository.dart';
import 'notification_event.dart';
import 'notification_state.dart';

@injectable
class NotificationBloc extends Bloc<NotificationEvent, NotificationState> {
  final NotificationFeedRepository _repository;

  NotificationBloc(this._repository) : super(NotificationInitial()) {
    on<LoadNotificationsRequested>(_onLoadNotificationsRequested);
    on<NotificationMarkedAsRead>(_onNotificationMarkedAsRead);
  }

  Future<void> _onLoadNotificationsRequested(LoadNotificationsRequested event, Emitter<NotificationState> emit) async {
    emit(NotificationLoading());
    try {
      final items = await _repository.getNotifications();
      emit(NotificationLoaded(items: items));
    } catch (e, st) {
      AppLogger.error('NotificationBloc: chargement notifications échoué', error: e, stackTrace: st);
      emit(NotificationError('Erreur de chargement: $e'));
    }
  }

  Future<void> _onNotificationMarkedAsRead(NotificationMarkedAsRead event, Emitter<NotificationState> emit) async {
    if (state is NotificationLoaded) {
      final currentState = state as NotificationLoaded;
      try {
        await _repository.markAsRead(event.id);
        final updatedItems = currentState.items.map((item) {
          if (item.id == event.id) {
            return NotificationItem(
              id: item.id,
              title: item.title,
              body: item.body,
              date: item.date,
              isRead: true,
              category: item.category,
            );
          }
          return item;
        }).toList();
        emit(NotificationLoaded(items: updatedItems));
      } catch (e, st) {
        AppLogger.error('NotificationBloc: marquer comme lu échoué', error: e, stackTrace: st);
        emit(NotificationError('Impossible de marquer comme lu'));
      }
    }
  }
}
