// Copyright 2014 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 BUFFET_MANAGER_H_
#define BUFFET_MANAGER_H_

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

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/values.h>
#include <chromeos/dbus/data_serialization.h>
#include <chromeos/dbus/dbus_object.h>
#include <chromeos/dbus/exported_property_set.h>
#include <chromeos/errors/error.h>

#include "buffet/commands/command_manager.h"
#include "buffet/device_registration_info.h"
#include "buffet/org.chromium.Buffet.Manager.h"

namespace chromeos {
namespace dbus_utils {
class ExportedObjectManager;
}  // namespace dbus_utils
}  // namespace chromeos

namespace buffet {

class StateChangeQueue;
class StateManager;
class BuffetConfig;

template<typename... Types>
using DBusMethodResponse =
    scoped_ptr<chromeos::dbus_utils::DBusMethodResponse<Types...>>;

// The Manager is responsible for global state of Buffet.  It exposes
// interfaces which affect the entire device such as device registration and
// device state.
class Manager final : public org::chromium::Buffet::ManagerInterface {
 public:
  explicit Manager(
      const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
          object_manager);
  ~Manager();

  void Start(
      const base::FilePath& config_path,
      const base::FilePath& state_path,
      const base::FilePath& test_definitions_path,
      bool xmpp_enabled,
      const chromeos::dbus_utils::AsyncEventSequencer::CompletionAction& cb);

 private:
  // DBus methods:
  void CheckDeviceRegistered(DBusMethodResponse<std::string> response) override;
  void GetDeviceInfo(DBusMethodResponse<std::string> response) override;
  void RegisterDevice(DBusMethodResponse<std::string> response,
                      const chromeos::VariantDictionary& params) override;
  bool UpdateDeviceInfo(chromeos::ErrorPtr* error,
                        const std::string& in_name,
                        const std::string& in_description,
                        const std::string& in_location) override;
  void UpdateState(DBusMethodResponse<> response,
                   const chromeos::VariantDictionary& property_set) override;
  bool GetState(chromeos::ErrorPtr* error, std::string* state) override;
  void AddCommand(DBusMethodResponse<std::string> response,
                  const std::string& json_command) override;
  void GetCommand(DBusMethodResponse<std::string> response,
                  const std::string& id) override;
  void SetCommandVisibility(
      scoped_ptr<chromeos::dbus_utils::DBusMethodResponse<>> response,
      const std::vector<std::string>& in_names,
      const std::string& in_visibility) override;
  std::string TestMethod(const std::string& message) override;

  void OnCommandDefsChanged();

  org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this};
  chromeos::dbus_utils::DBusObject dbus_object_;

  std::shared_ptr<CommandManager> command_manager_;
  std::unique_ptr<StateChangeQueue> state_change_queue_;
  std::shared_ptr<StateManager> state_manager_;
  std::unique_ptr<DeviceRegistrationInfo> device_info_;

  // Token given by Command Manager to track the registered Command Definition
  // change callback.
  CommandManager::CallbackToken command_changed_callback_token_;

  DISALLOW_COPY_AND_ASSIGN(Manager);
};

}  // namespace buffet

#endif  // BUFFET_MANAGER_H_
