// Copyright (c) 2015 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

#include "shell/browser/notifications/notification_presenter.h"

#include <algorithm>

#include "shell/browser/notifications/notification.h"

namespace electron {

NotificationPresenter::NotificationPresenter() = default;

NotificationPresenter::~NotificationPresenter() {
  for (Notification* notification : notifications_)
    delete notification;
}

base::WeakPtr<Notification> NotificationPresenter::CreateNotification(
    NotificationDelegate* delegate,
    const std::string& notification_id) {
  Notification* notification = CreateNotificationObject(delegate);
  notification->set_notification_id(notification_id);
  notifications_.insert(notification);
  return notification->GetWeakPtr();
}

void NotificationPresenter::RemoveNotification(Notification* notification) {
  if (const auto nh = notifications_.extract(notification))
    delete nh.value();
}

void NotificationPresenter::CloseNotificationWithId(
    const std::string& notification_id) {
  auto it = std::ranges::find_if(
      notifications_, [&notification_id](const Notification* n) {
        return n->notification_id() == notification_id;
      });
  if (it != notifications_.end()) {
    Notification* notification = (*it);
    notification->Dismiss();
    notifications_.erase(notification);
  }
}

void NotificationPresenter::GetDeliveredNotifications(
    GetDeliveredNotificationsCallback callback) {
  // Default: return empty list. Overridden on macOS.
  std::move(callback).Run({});
}

void NotificationPresenter::RemoveDeliveredNotifications(
    const std::vector<std::string>& identifiers) {
  // Default: no-op. Overridden on macOS.
}

void NotificationPresenter::RemoveAllDeliveredNotifications() {
  // Default: no-op. Overridden on macOS.
}

void NotificationPresenter::RemoveDeliveredNotificationsByGroupId(
    const std::string& group_id) {
  // Default: no-op. Overridden on macOS.
}

}  // namespace electron
