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

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

#include <base/callback_forward.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>

namespace org {
namespace chromium {
class SessionManagerInterfaceProxy;
}
}  // namespace org

namespace brillo {
namespace dbus_utils {
class DBusObject;
}
class Error;
}  // namespace brillo

namespace authpolicy {

// Exposes methods from the Session Manager daemon.
class SessionManagerClient {
 public:
  explicit SessionManagerClient(brillo::dbus_utils::DBusObject* dbus_object);
  virtual ~SessionManagerClient();

  // Exposed Session Manager methods.
  // See Session Manager for a description of the arguments.

  // Asynchronous to achieve higher IO queue depth when writing many policies.
  void StoreUnsignedPolicyEx(
      const std::vector<uint8_t>& descriptor_blob,
      const std::vector<uint8_t>& policy_blob,
      const base::Callback<void(bool success)>& callback);

  // Blocking for convenience / code simplicity.
  bool ListStoredComponentPolicies(const std::vector<uint8_t>& descriptor_blob,
                                   std::vector<std::string>* component_ids);

  // Connect to the signal invoked when the session state changes. See
  // session_manager_impl.cc for a list of possible states.
  void ConnectToSessionStateChangedSignal(
      const base::Callback<void(const std::string& state)>& callback);

  // Retrieves the session state immediately. Returns an empty string on error.
  std::string RetrieveSessionState();

 private:
  // Callback called when StoreUnsignedPolicyEx() succeeds. Prints errors and
  // calls |callback|.
  void OnStorePolicySuccess(const base::Callback<void(bool success)>& callback);

  // Callback called when StoreUnsignedPolicyEx() fails. Prints errors and calls
  // |callback|.
  void OnStorePolicyError(const base::Callback<void(bool success)>& callback,
                          brillo::Error* error);

  // Callback called on SessionStateChanged signal. Calls callback with the new
  // session state.
  void OnSessionStateChanged(
      const base::Callback<void(const std::string& state)>& callback,
      const std::string& state);

  std::unique_ptr<org::chromium::SessionManagerInterfaceProxy> proxy_;
  base::WeakPtrFactory<SessionManagerClient> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(SessionManagerClient);
};

}  // namespace authpolicy

#endif  // AUTHPOLICY_SESSION_MANAGER_CLIENT_H_
