// Copyright (c) 2011 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 LIBBRILLO_POLICY_LIBPOLICY_H_
#define LIBBRILLO_POLICY_LIBPOLICY_H_

#include <memory>
#include <string>

#include <base/macros.h>

#include "install_attributes/libinstallattributes.h"

#pragma GCC visibility push(default)

namespace policy {

class DevicePolicy;

// This class holds device settings that are to be enforced across all users.
//
// If there is a policy on disk at creation time, we will load it at verify
// its signature.
class PolicyProvider {
 public:
  // The default constructor does not load policy.
  PolicyProvider();
  virtual ~PolicyProvider();

  // Constructor for tests only!
  explicit PolicyProvider(std::unique_ptr<DevicePolicy> device_policy);
  PolicyProvider(const PolicyProvider&) = delete;
  PolicyProvider& operator=(const PolicyProvider&) = delete;

  // This function will ensure the freshness of the contents that the getters
  // are delivering. Normally contents are cached to prevent unnecessary load.
  virtual bool Reload();

  virtual bool device_policy_is_loaded() const;

  // Returns a value from the device policy cache.
  virtual const DevicePolicy& GetDevicePolicy() const;

  // Returns true if the device is not an enterprise enrolled device, so it
  // won't have device policy before the next powerwash. Returns false if device
  // is still in OOBE (so device mode is not determined yet).
  virtual bool IsConsumerDevice() const;

  void SetDevicePolicyForTesting(std::unique_ptr<DevicePolicy> device_policy);
  void SetInstallAttributesReaderForTesting(
      std::unique_ptr<InstallAttributesReader> install_attributes_reader);

 private:
  std::unique_ptr<DevicePolicy> device_policy_;
  bool device_policy_is_loaded_ = false;
  std::unique_ptr<InstallAttributesReader> install_attributes_reader_;
};
}  // namespace policy

#pragma GCC visibility pop

#endif  // LIBBRILLO_POLICY_LIBPOLICY_H_
