// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file

part of repositories;

class NotificationChangeEvent implements M.NotificationChangeEvent {
  final NotificationRepository repository;
  NotificationChangeEvent(this.repository);
}

class NotificationRepository implements M.NotificationRepository {
  final List<M.Notification> _list = new List<M.Notification>();

  final StreamController<M.NotificationChangeEvent> _onChange =
      new StreamController<M.NotificationChangeEvent>.broadcast();
  Stream<M.NotificationChangeEvent> get onChange => _onChange.stream;

  void add(M.Notification notification) {
    assert(notification != null);
    _list.add(notification);
    _notify();
  }

  Iterable<M.Notification> list() => _list;

  void delete(M.Notification notification) {
    if (_list.remove(notification))
    _notify();
  }

  void deleteAll() {
    if (_list.isNotEmpty) {
      _list.clear();
      _notify();
    }
  }

  NotificationRepository();

  void _notify() {
    _onChange.add(new NotificationChangeEvent(this));
  }

  void deleteWhere(bool test(M.Notification element)) {
    int length = _list.length;
    _list.removeWhere(test);
    if (_list.length != length) _notify();
  }

  void deletePauseEvents({M.Isolate isolate}) {
    if (isolate == null) {
      deleteWhere((notification) {
        return notification is M.EventNotification &&
               M.Event.isPauseEvent(notification.event);
      });
    } else {
      deleteWhere((notification) {
        return notification is M.EventNotification &&
               M.Event.isPauseEvent(notification.event) &&
               notification.event.isolate == isolate;
      });
    }
  }

  void deleteDisconnectEvents() {
    deleteWhere((notification) {
      return notification is M.EventNotification &&
             notification.event is M.ConnectionClosedEvent;
    });
  }
}
