// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIBHWSEC_PROXY_PROXY_H_
#define LIBHWSEC_PROXY_PROXY_H_

#ifndef BUILD_LIBHWSEC
#error "Don't include this file outside libhwsec!"
#endif

// Forward declarations
namespace hwsec::overalls {
class Overalls;
}  // namespace hwsec::overalls
namespace trunks {
class CommandTransceiver;
class DbusTransceiver;
class TrunksFactory;
}  // namespace trunks
namespace org::chromium {
class TpmManagerProxyInterface;
class TpmNvramProxyInterface;
}  // namespace org::chromium
namespace crossystem {
class Crossystem;
}  // namespace crossystem
namespace libstorage {
class Platform;
}  // namespace libstorage

namespace hwsec {

// Proxy is a layer to abstract the communication between backend and the
// underlying services(e.g. tcsd, trunksd, tpm_managerd). And provide the
// ability to replace with mock or simulator proxy.
class Proxy {
 public:
  static inline constexpr int kDefaultDBusTimeoutMs = 300000;
  virtual ~Proxy() = default;

  // These functions shouldn't be virtual function.
  hwsec::overalls::Overalls& GetOveralls() const;
  trunks::CommandTransceiver& GetTrunksCommandTransceiver() const;
  trunks::DbusTransceiver* GetTrunksDbusTransceiver() const;
  trunks::TrunksFactory& GetTrunksFactory() const;
  org::chromium::TpmManagerProxyInterface& GetTpmManager() const;
  org::chromium::TpmNvramProxyInterface& GetTpmNvram() const;
  crossystem::Crossystem& GetCrossystem() const;
  libstorage::Platform& GetPlatform() const;

 protected:
  Proxy() = default;

  void SetOveralls(hwsec::overalls::Overalls* overalls);
  void SetTrunksCommandTransceiver(
      trunks::CommandTransceiver* trunks_command_transceiver);
  void SetTrunksDbusTransceiver(
      trunks::DbusTransceiver* trunks_dbus_transceiver);
  void SetTrunksFactory(trunks::TrunksFactory* trunks_factory);
  void SetTpmManager(org::chromium::TpmManagerProxyInterface* tpm_manager);
  void SetTpmNvram(org::chromium::TpmNvramProxyInterface* tpm_nvram);
  void SetCrossystem(crossystem::Crossystem* crossystem);
  void SetPlatform(libstorage::Platform* platform);

 private:
  hwsec::overalls::Overalls* overalls_ptr_;
  trunks::CommandTransceiver* trunks_command_transceiver_;
  trunks::DbusTransceiver* trunks_dbus_transceiver_ = nullptr;
  trunks::TrunksFactory* trunks_factory_ptr_;
  org::chromium::TpmManagerProxyInterface* tpm_manager_;
  org::chromium::TpmNvramProxyInterface* tpm_nvram_;
  crossystem::Crossystem* crossystem_;
  libstorage::Platform* platform_;
};

}  // namespace hwsec

#endif  // LIBHWSEC_PROXY_PROXY_H_
