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

import 'package:unionflow_mobile_apps/core/network/api_client.dart';
import '../../presentation/bloc/notification_state.dart';

/// Repository pour l'onglet Notifications (flux DRY).
/// Utilise ApiClient et mappe vers NotificationItem.
@lazySingleton
class NotificationFeedRepository {
  final ApiClient _apiClient;

  NotificationFeedRepository(this._apiClient);

  /// Récupère le membre connecté (GET /api/membres/me) pour obtenir l'id.
  Future<String> _getMembreId() async {
    final response = await _apiClient.get('/api/membres/me');
    final id = response.data['id']?.toString();
    if (id == null || id.isEmpty) {
      throw Exception('Membre connecté introuvable');
    }
    return id;
  }

  /// Liste des notifications du membre connecté (GET /api/notifications/membre/{membreId}).
  Future<List<NotificationItem>> getNotifications() async {
    try {
      final membreId = await _getMembreId();
      final response = await _apiClient.get('/api/notifications/membre/$membreId');
      final List<dynamic> data = response.data is List ? response.data as List : [];
      return data
          .map((json) => _itemFromJson(json as Map<String, dynamic>))
          .toList();
    } on DioException catch (e) {
      if (e.type == DioExceptionType.cancel) rethrow;
      if (e.response?.statusCode == 404) return [];
      rethrow;
    }
  }

  /// Marque une notification comme lue (POST /api/notifications/{id}/marquer-lue).
  Future<void> markAsRead(String id) async {
    await _apiClient.post('/api/notifications/$id/marquer-lue');
  }

  static NotificationItem _itemFromJson(Map<String, dynamic> json) {
    final id = json['id']?.toString() ?? '';
    final sujet = json['sujet']?.toString() ?? 'Notification';
    final corps = json['corps']?.toString() ?? '';
    final dateEnvoi = json['dateEnvoi']?.toString();
    final dateLecture = json['dateLecture']?.toString();
    final date = dateEnvoi != null
        ? DateTime.tryParse(dateEnvoi) ?? DateTime.now()
        : DateTime.now();
    final isRead = dateLecture != null || json['statut']?.toString() == 'LUE';
    final type = (json['typeNotification']?.toString() ?? 'SYSTEME').toLowerCase();
    final category = type.contains('cotisation') || type.contains('finance')
        ? 'finance'
        : type.contains('event') || type.contains('evenement')
            ? 'event'
            : 'system';
    return NotificationItem(
      id: id,
      title: sujet,
      body: corps,
      date: date,
      isRead: isRead,
      category: category,
    );
  }
}
