// 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 UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
#define UI_MESSAGE_CENTER_MESSAGE_CENTER_H_

#include <stddef.h>

#include <memory>
#include <string>

#include "base/macros.h"
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/message_center_types.h"
#include "ui/message_center/notification_list.h"

class DownloadNotification;
class DownloadNotificationTestBase;

// Interface to manage the NotificationList. The client (e.g. Chrome) calls
// [Add|Remove|Update]Notification to create and update notifications in the
// list. It also sends those changes to its observers when a notification
// is shown, closed, or clicked on.
//
// MessageCenter is agnostic of profiles; it uses the string returned by
// Notification::id() to uniquely identify a notification. It is
// the caller's responsibility to formulate the id so that 2 different
// notification should have different ids. For example, if the caller supports
// multiple profiles, then caller should encode both profile characteristics and
// notification front end's notification id into a new id and set it into the
// notification instance before passing that in. Consequently the id passed to
// observers will be this unique id, which can be used with MessageCenter
// interface but probably not higher level interfaces.

namespace message_center {

namespace test {
class MessagePopupCollectionTest;
}

class LockScreenController;
class MessageCenterObserver;
class MessageCenterImplTest;
class NotificationBlocker;

class MESSAGE_CENTER_EXPORT MessageCenter {
 public:
  enum class RemoveType {
    // Remove all notifications.
    ALL,
    // Remove non-pinned notification (don't remove invisible ones).
    NON_PINNED,
  };

  // Creates the global message center object with default LockScreenController.
  static void Initialize();
  // Creates the global message center object with custom LockScreenController.
  static void Initialize(std::unique_ptr<LockScreenController> controller);

  // Returns the global message center object. Returns null if Initialize is
  // not called.
  static MessageCenter* Get();

  // Destroys the global message_center object.
  static void Shutdown();

  // Management of the observer list.
  virtual void AddObserver(MessageCenterObserver* observer) = 0;
  virtual void RemoveObserver(MessageCenterObserver* observer) = 0;

  // Queries of current notification list status.
  virtual size_t NotificationCount() const = 0;
  virtual bool HasPopupNotifications() const = 0;
  virtual bool IsQuietMode() const = 0;

  // Find the notification with the corresponding id. Returns null if not
  // found. The returned instance is owned by the message center.
  virtual Notification* FindVisibleNotificationById(const std::string& id) = 0;

  // Find all notifications with the corresponding |app_id|. Returns an
  // empty set if none are found.
  virtual NotificationList::Notifications FindNotificationsByAppId(
      const std::string& app_id) = 0;

  // Gets all notifications to be shown to the user in the message center.  Note
  // that queued changes due to the message center being open are not reflected
  // in this list.
  virtual const NotificationList::Notifications& GetVisibleNotifications() = 0;

  // Gets all notifications being shown as popups.  This should not be affected
  // by the change queue since notifications are not held up while the state is
  // VISIBILITY_TRANSIENT or VISIBILITY_SETTINGS.
  virtual NotificationList::PopupNotifications GetPopupNotifications() = 0;

  // Management of NotificationBlockers.
  virtual void AddNotificationBlocker(NotificationBlocker* blocker) = 0;
  virtual void RemoveNotificationBlocker(NotificationBlocker* blocker) = 0;

  // Basic operations of notification: add/remove/update.

  // Adds a new notification.
  virtual void AddNotification(std::unique_ptr<Notification> notification) = 0;

  // Updates an existing notification with id = old_id and set its id to new_id.
  virtual void UpdateNotification(
      const std::string& old_id,
      std::unique_ptr<Notification> new_notification) = 0;

  // Removes an existing notification.
  virtual void RemoveNotification(const std::string& id, bool by_user) = 0;
  virtual void RemoveNotificationsForNotifierId(
      const NotifierId& notifier_id) = 0;
  virtual void RemoveAllNotifications(bool by_user, RemoveType type) = 0;

  // Sets the icon image. Icon appears at the top-left of the notification.
  virtual void SetNotificationIcon(const std::string& notification_id,
                                   const gfx::Image& image) = 0;

  // Sets the large image for the notifications of type == TYPE_IMAGE. Specified
  // image will appear below of the notification.
  virtual void SetNotificationImage(const std::string& notification_id,
                                    const gfx::Image& image) = 0;

  // This should be called by UI classes when a notification is clicked to
  // trigger the notification's delegate callback and also update the message
  // center observers.
  virtual void ClickOnNotification(const std::string& id) = 0;

  // This should be called by UI classes when a notification button is clicked
  // to trigger the notification's delegate callback and also update the message
  // center observers.
  virtual void ClickOnNotificationButton(const std::string& id,
                                         int button_index) = 0;

  // This should be called by UI classes when a notification button with an
  // input is clicked to trigger the notification's delegate callback and also
  // update the message center observers.
  virtual void ClickOnNotificationButtonWithReply(
      const std::string& id,
      int button_index,
      const base::string16& reply) = 0;

  // Called by the UI classes when the settings buttons is clicked
  // to trigger the notification's delegate and update the message
  // center observers.
  virtual void ClickOnSettingsButton(const std::string& id) = 0;

  // This should be called by UI classes when a user select from notification
  // inline settings to disable notifications from the same origin of the
  // notification.
  virtual void DisableNotification(const std::string& id) = 0;

  // This should be called by UI classes after a visible notification popup
  // closes, indicating that the notification has been shown to the user.
  // |mark_notification_as_read|, if false, will unset the read bit on a
  // notification, increasing the unread count of the center.
  virtual void MarkSinglePopupAsShown(const std::string& id,
                                      bool mark_notification_as_read) = 0;

  // This should be called by UI classes when a notification is first displayed
  // to the user, in order to decrement the unread_count for the tray, and to
  // notify observers that the notification is visible.
  virtual void DisplayedNotification(
      const std::string& id,
      const DisplaySource source) = 0;

  // This can be called to change the quiet mode state (without a timeout).
  virtual void SetQuietMode(bool in_quiet_mode) = 0;

  // Temporarily enables quiet mode for |expires_in| time.
  virtual void EnterQuietModeWithExpire(const base::TimeDelta& expires_in) = 0;

  // Informs the notification list whether the message center is visible.
  // This affects whether or not a message has been "read".
  virtual void SetVisibility(Visibility visible) = 0;

  // Allows querying the visibility of the center.
  virtual bool IsMessageCenterVisible() const = 0;

  // Informs the MessageCenter whether there's a bubble anchored to a system
  // tray which holds notifications. If false, only toasts are shown (e.g. on
  // desktop Linux and Windows). When there's no message center view, updated
  // notifications will be re-appear as toasts even if they've already been
  // shown.
  virtual void SetHasMessageCenterView(bool has_message_center_view) = 0;
  virtual bool HasMessageCenterView() const = 0;

  // UI classes should call this when there is cause to leave popups visible for
  // longer than the default (for example, when the mouse hovers over a popup).
  virtual void PausePopupTimers() = 0;

  // UI classes should call this when the popup timers should restart (for
  // example, after the mouse leaves the popup.)
  virtual void RestartPopupTimers() = 0;

  // The user-visible "app name" for system-generated notifications, which is
  // used to identify the application that generated a notification. Only used
  // for MD style notifications, which means that currently it's only set and
  // used on Chrome OS. On Chrome OS, this is "Chrome OS".
  virtual const base::string16& GetSystemNotificationAppName() const = 0;
  virtual void SetSystemNotificationAppName(const base::string16& name) = 0;

 protected:
  friend class ::DownloadNotification;
  friend class ::DownloadNotificationTestBase;
  friend class MessageCenterImplTest;
  friend class MessageCenterImplTestWithChangeQueue;
  friend class MessageCenterImplTestWithoutChangeQueue;
  friend class UiControllerTest;
  friend class TrayViewControllerTest;
  friend class MessagePopupCollectionTest;
  virtual void DisableTimersForTest() = 0;

  MessageCenter();
  virtual ~MessageCenter();

 private:
  DISALLOW_COPY_AND_ASSIGN(MessageCenter);
};

}  // namespace message_center

#endif  // UI_MESSAGE_CENTER_MESSAGE_CENTER_H_
