// 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.

#include "policy/libpolicy.h"

#include <base/logging.h>

#include "policy/device_policy.h"
#ifndef __ANDROID__
#include "policy/device_policy_impl.h"
#endif

namespace policy {

PolicyProvider::PolicyProvider()
    : device_policy_(nullptr),
      device_policy_is_loaded_(false) {
#ifndef __ANDROID__
  device_policy_.reset(new DevicePolicyImpl());
#endif
}

PolicyProvider::PolicyProvider(std::unique_ptr<DevicePolicy> device_policy)
    : device_policy_(std::move(device_policy)),
      device_policy_is_loaded_(true) {}

PolicyProvider::~PolicyProvider() {}

bool PolicyProvider::Reload() {
  if (!device_policy_)
    return false;
  device_policy_is_loaded_ = device_policy_->LoadPolicy();
  if (!device_policy_is_loaded_) {
    LOG(WARNING) << "Could not load the device policy file.";
  }
  return device_policy_is_loaded_;
}

bool PolicyProvider::device_policy_is_loaded() const {
  return device_policy_is_loaded_;
}

const DevicePolicy& PolicyProvider::GetDevicePolicy() const {
  if (!device_policy_is_loaded_)
    DCHECK("Trying to get policy data but policy was not loaded!");

  return *device_policy_;
}

}  // namespace policy
