// Copyright 2018 The Chromium OS 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 VM_TOOLS_NOTIFICATIOND_NOTIFICATION_DAEMON_H_
#define VM_TOOLS_NOTIFICATIOND_NOTIFICATION_DAEMON_H_

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <base/macros.h>
#include <brillo/message_loops/base_message_loop.h>

#include "vm_tools/notificationd/dbus_interface.h"
#include "vm_tools/notificationd/dbus_service.h"
#include "vm_tools/notificationd/notification_shell_client.h"
#include "vm_tools/notificationd/notification_shell_interface.h"

namespace vm_tools {
namespace notificationd {

// Handles D-BUS server for notification and Wayland client for notification.
// Once the D-BUS server recieves notification event, the daemon forwards it via
// the Wayland client.
class NotificationDaemon : public DBusInterface,
                           public NotificationShellInterface {
 public:
  // Creates and returns a NotificationDaemon. Returns nullptr if the the daemon
  // failed to be initialized for any reason.
  static std::unique_ptr<NotificationDaemon> Create(
      const std::string& display_name,
      const std::string& virtwl_device,
      base::Closure quit_closure);

  ~NotificationDaemon() override = default;

  // DBusInterface overrides.
  bool GetCapabilities(std::vector<std::string>* out_capabilities) override;
  bool Notify(const NotifyArgument& input, uint32_t* out_id) override;
  bool GetServerInformation(ServerInformation* output) override;
  bool CloseNotification(uint32_t id) override;

  // NotificationShellInterface overrides.
  void OnClosed(const std::string& notification_key, bool by_user) override;
  void OnClicked(const std::string& notification_key,
                 int32_t button_index) override;

 private:
  // Used for conversion from the events of notification-shell (clicking buttons
  // and body) to those of org.freedesktop.Notifications (ActionInvoled).
  struct ClickAction {
    std::vector<std::string> action_keys_for_buttons;
    bool default_action_enabled = false;
  };

  NotificationDaemon() = default;

  // Initializes the notification daemon. Returns true on success.
  bool Init(const std::string& display_name,
            const std::string& virtwl_device,
            base::Closure quit_closure);

  std::unique_ptr<NotificationShellClient> notification_shell_client_;
  std::unique_ptr<DBusService> dbus_service_;

  // Incremental notification id handled by this daemon. Notification id starts
  // from 1 according to the spec of org.freedesktop.Notifications.
  uint32_t id_count_ = 1;

  // Clicking action conversion mapping for each notification id.
  std::map<uint32_t, ClickAction> click_actions;

  FRIEND_TEST(DBusServiceTest, GetCapabilities);
  FRIEND_TEST(DBusServiceTest, Notify);
  FRIEND_TEST(DBusServiceTest, GetServerInformation);
  DISALLOW_COPY_AND_ASSIGN(NotificationDaemon);
};

}  // namespace notificationd
}  // namespace vm_tools

#endif  // VM_TOOLS_NOTIFICATIOND_NOTIFICATION_DAEMON_H_
