// 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 <memory>
#include <utility>

#include <base/check.h>
#include <base/logging.h>

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

namespace policy {

PolicyProvider::PolicyProvider() {
#ifndef __ANDROID__
  device_policy_ = std::make_unique<DevicePolicyImpl>();
  install_attributes_reader_ = std::make_unique<InstallAttributesReader>();
#endif
}

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

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 {
  DCHECK(device_policy_is_loaded_)
      << "Trying to get policy data but policy was not loaded!";
  return *device_policy_;
}

bool PolicyProvider::IsConsumerDevice() const {
  if (!install_attributes_reader_->IsLocked())
    return false;

  const std::string& device_mode = install_attributes_reader_->GetAttribute(
      InstallAttributesReader::kAttrMode);
  return device_mode != InstallAttributesReader::kDeviceModeEnterprise &&
         device_mode != InstallAttributesReader::kDeviceModeEnterpriseAD;
}

bool PolicyProvider::IsEnterpriseEnrolledDevice() const {
  if (!install_attributes_reader_->IsLocked())
    return false;

  const std::string& device_mode = install_attributes_reader_->GetAttribute(
      InstallAttributesReader::kAttrMode);
  return device_mode == InstallAttributesReader::kDeviceModeEnterprise ||
         device_mode == InstallAttributesReader::kDeviceModeEnterpriseAD;
}

void PolicyProvider::SetDevicePolicyForTesting(
    std::unique_ptr<DevicePolicy> device_policy) {
  device_policy_ = std::move(device_policy);
  device_policy_is_loaded_ = true;
}

void PolicyProvider::SetInstallAttributesReaderForTesting(
    std::unique_ptr<InstallAttributesReader> install_attributes_reader) {
  install_attributes_reader_ = std::move(install_attributes_reader);
}

}  // namespace policy
