import 'package:be_happy/domain/entities/client_notification.dart';

import '../../data/network/api_service.dart';
import '../../domain/repositories/notification_repository.dart';
import '../models/client_notification_dto.dart';

class NotificationRepositoryImpl implements NotificationRepository {
  final ApiService _apiService;

  NotificationRepositoryImpl(this._apiService);

  @override
  Stream<ClientNotification> getNotificationsStream() {
    return _apiService.getNotificationsStream().map((data) {
      // Создаем DTO из данных API
      final dto = ClientNotificationDto.fromJson(data);
      // Преобразуем в entity
      return dto.toEntity();
    });
  }

  @override
  Future<ClientNotification> cancelNotification(int id) async {
    final data = await _apiService.cancelNotification(id);
    if (data == null) {
      throw Exception("Failed to cancel notification");
    }
    final dto = ClientNotificationDto.fromJson(data);
    return dto.toEntity();
  }

  @override
  void closeStream() {
    // соединение закрывается автоматически при отписке от stream
  }

  @override
  Future<List<ClientNotification>> getNotifications() async {
    try {
      final List<Map<String, dynamic>> data = await _apiService.getNotifications();
      final notifications = data.map((json) {
        final dto = ClientNotificationDto.fromJson(json);
        return dto.toEntity();
      }).toList();

      // dev.log('NotificationRepository: Загружено ${notifications.length} уведомлений');

      return notifications;
    } catch (e, stackTrace) {
      // dev.log('NotificationRepository: Ошибка: $e', stackTrace: stackTrace);
      throw Exception('Не удалось загрузить уведомления: $e');
    }
  }
}
