// Copyright 2012 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/notifications/notification_test_util.h"

#include "chrome/browser/ui/browser.h"
#include "url/origin.h"

StubNotificationUIManager::StubNotificationUIManager() = default;

StubNotificationUIManager::~StubNotificationUIManager() = default;

unsigned int StubNotificationUIManager::GetNotificationCount() const {
  return notifications_.size();
}

const message_center::Notification&
StubNotificationUIManager::GetNotificationAt(unsigned int index) const {
  DCHECK_GT(GetNotificationCount(), index);
  return notifications_[index].first;
}

bool StubNotificationUIManager::SilentDismissById(
    const std::string& delegate_id,
    ProfileNotification::ProfileID profile_id) {
  auto iter = notifications_.begin();
  for (; iter != notifications_.end(); ++iter) {
    if (iter->first.id() != delegate_id || iter->second != profile_id)
      continue;
    notifications_.erase(iter);
    return true;
  }
  return false;
}

void StubNotificationUIManager::Add(
    const message_center::Notification& notification,
    Profile* profile) {
  if (is_shutdown_started_)
    return;

  notifications_.push_back(
      std::make_pair(notification, ProfileNotification::GetProfileID(profile)));
}

bool StubNotificationUIManager::Update(
    const message_center::Notification& notification,
    Profile* profile) {
  const ProfileNotification::ProfileID profile_id =
      ProfileNotification::GetProfileID(profile);

  auto iter = notifications_.begin();
  for (; iter != notifications_.end(); ++iter) {
    const message_center::Notification& old_notification = iter->first;
    if (old_notification.id() == notification.id() &&
        old_notification.origin_url() == notification.origin_url() &&
        iter->second == profile_id) {
      notifications_.erase(iter);
      notifications_.push_back(std::make_pair(notification, profile_id));
      return true;
    }
  }

  return false;
}

const message_center::Notification* StubNotificationUIManager::FindById(
    const std::string& delegate_id,
    ProfileNotification::ProfileID profile_id) const {
  auto iter = notifications_.begin();
  for (; iter != notifications_.end(); ++iter) {
    if (iter->first.id() != delegate_id || iter->second != profile_id)
      continue;

    return &iter->first;
  }

  return nullptr;
}

bool StubNotificationUIManager::CancelById(
    const std::string& delegate_id,
    ProfileNotification::ProfileID profile_id) {
  auto iter = notifications_.begin();
  for (; iter != notifications_.end(); ++iter) {
    if (iter->first.id() != delegate_id || iter->second != profile_id)
      continue;

    iter->first.delegate()->Close(false /* by_user */);
    notifications_.erase(iter);
    return true;
  }

  return false;
}

std::set<std::string> StubNotificationUIManager::GetAllIdsByProfile(
    ProfileNotification::ProfileID profile_id) {
  std::set<std::string> delegate_ids;
  for (const auto& pair : notifications_) {
    if (pair.second == profile_id) {
      delegate_ids.insert(pair.first.id());
    }
  }
  return delegate_ids;
}

std::set<std::string> StubNotificationUIManager::GetAllIdsByProfileAndOrigin(
    ProfileNotification::ProfileID profile_id,
    const GURL& origin) {
  std::set<std::string> delegate_ids;
  for (const auto& pair : notifications_) {
    if (pair.second == profile_id &&
        url::IsSameOriginWith(pair.first.origin_url(), origin)) {
      delegate_ids.insert(pair.first.id());
    }
  }
  return delegate_ids;
}

bool StubNotificationUIManager::CancelAllBySourceOrigin(
    const GURL& source_origin) {
  last_canceled_source_ = source_origin;
  return true;
}

void StubNotificationUIManager::CancelAll() {
  for (const auto& pair : notifications_)
    pair.first.delegate()->Close(false /* by_user */);
  notifications_.clear();
}

void StubNotificationUIManager::StartShutdown() {
  is_shutdown_started_ = true;
  CancelAll();
}
