// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_H_
#define CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_H_

#include <memory>
#include <set>
#include <string>
#include <vector>

#include "base/macros.h"
#include "chrome/browser/notifications/notification_common.h"

typedef void* ProfileID;

class GURL;
class Profile;

namespace message_center {
class Notification;
}

// This interface is used to manage the UI surfaces for non-native desktop
// notifications (hence, this is not used by Chrome OS and is not used for
// Windows Action Center notifications). There is just one instance for all
// profiles. This represents the middle layer of notification and it's aware of
// profile. It identifies a notification by the id string and a profile, hence
// two notifications from two different profiles, even though they may have
// identical ids, will not be considered the same notification. This interface
// will generate a new id behind the scene based on the id string and the
// profile's characteristics for each notification and use this new id to call
// lower layer MessageCenter interface which is profile agnostic. Therefore the
// ids passed into this interface are not the same as those passed into the
// MessageCenter interface.
class NotificationUIManager {
 public:
  // Convert a profile pointer into an opaque profile id, which can be safely
  // used by FindById() and CancelById() even after a profile may have been
  // destroyed.
  static ProfileID GetProfileID(Profile* profile) {
    return static_cast<ProfileID>(profile);
  }

  virtual ~NotificationUIManager() {}

  // Creates an initialized UI manager.
  static std::unique_ptr<NotificationUIManager> Create();

  // Adds a notification to be displayed.
  virtual void Add(const message_center::Notification& notification,
                   Profile* profile) = 0;

  // Updates the given notification, if it already exists.Returns true for
  // update and false to report a no-op.
  virtual bool Update(const message_center::Notification& notification,
                      Profile* profile) = 0;

  // Returns the pointer to a notification if it match the supplied ID, either
  // currently displayed or in the queue.
  // This function can be bound for delayed execution, where a profile pointer
  // may not be valid. Hence caller needs to call the static GetProfileID(...)
  // function to turn a profile pointer into a profile id and pass that in.
  virtual const message_center::Notification* FindById(
      const std::string& delegate_id,
      ProfileID profile_id) const = 0;

  // Removes any notifications matching the supplied ID, either currently
  // displayed or in the queue.  Returns true if anything was removed.
  // This function can be bound for delayed execution, where a profile pointer
  // may not be valid. Hence caller needs to call the static GetProfileID(...)
  // function to turn a profile pointer into a profile id and pass that in.
  virtual bool CancelById(const std::string& delegate_id,
                          ProfileID profile_id) = 0;

  // Returns the set of all delegate IDs for notifications from |profile_id|.
  virtual std::set<std::string> GetAllIdsByProfile(ProfileID profile_id) = 0;

  // Removes notifications matching the |source_origin| (which could be an
  // extension ID). Returns true if anything was removed.
  virtual bool CancelAllBySourceOrigin(const GURL& source_origin) = 0;

  // Removes notifications matching |profile_id|. Returns true if any were
  // removed.
  virtual bool CancelAllByProfile(ProfileID profile_id) = 0;

  // Cancels all pending notifications and closes anything currently showing.
  // Used when the app is terminating.
  virtual void CancelAll() = 0;

  // Cancels all pending notifications and closes anything currently showing.
  // After this is called, no new notifications can be added. Used when the app
  // is terminating.
  virtual void StartShutdown() = 0;

 protected:
  NotificationUIManager() {}

 private:
  DISALLOW_COPY_AND_ASSIGN(NotificationUIManager);
};

#endif  // CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_H_
