// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/apps/app_service/app_notifications.h"

#include "base/containers/contains.h"

namespace apps {

AppNotifications::AppNotifications() = default;

AppNotifications::~AppNotifications() = default;

void AppNotifications::AddNotification(const std::string& app_id,
                                       const std::string& notification_id) {
  app_id_to_notification_ids_[app_id].insert(notification_id);
  notification_id_to_app_ids_[notification_id].insert(app_id);
}

void AppNotifications::RemoveNotification(const std::string& notification_id) {
  auto it = notification_id_to_app_ids_.find(notification_id);
  CHECK(it != notification_id_to_app_ids_.end());

  for (const auto& app_id : it->second) {
    auto app_id_it = app_id_to_notification_ids_.find(app_id);
    app_id_it->second.erase(notification_id);
    if (app_id_it->second.empty()) {
      app_id_to_notification_ids_.erase(app_id_it);
    }
  }
  notification_id_to_app_ids_.erase(it);
}

void AppNotifications::RemoveNotificationsForApp(const std::string& app_id) {
  auto it = app_id_to_notification_ids_.find(app_id);
  if (it == app_id_to_notification_ids_.end()) {
    return;
  }

  for (const auto& notification_id : it->second) {
    auto notification_id_it = notification_id_to_app_ids_.find(notification_id);
    notification_id_it->second.erase(app_id);
    if (notification_id_it->second.empty()) {
      notification_id_to_app_ids_.erase(notification_id_it);
    }
  }
  app_id_to_notification_ids_.erase(it);
}

bool AppNotifications::HasNotification(const std::string& app_id) {
  return base::Contains(app_id_to_notification_ids_, app_id);
}

std::set<std::string> AppNotifications::GetAppIdsForNotification(
    const std::string& notification_id) {
  auto it = notification_id_to_app_ids_.find(notification_id);
  if (it == notification_id_to_app_ids_.end()) {
    return {};
  }
  return it->second;
}

AppPtr AppNotifications::CreateAppWithHasBadgeStatus(
    AppType app_type,
    const std::string& app_id) {
  auto app = std::make_unique<App>(app_type, app_id);
  app->has_badge = HasNotification(app_id);
  return app;
}

}  // namespace apps
