// Copyright 2013 The Chromium 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 "extensions/browser/test_management_policy.h"

#include "base/strings/utf_string_conversions.h"

namespace extensions {

TestManagementPolicyProvider::TestManagementPolicyProvider()
    : may_load_(true),
      may_modify_status_(true),
      must_remain_enabled_(false),
      must_remain_disabled_(false),
      must_remain_installed_(false),
      disable_reason_(disable_reason::DISABLE_NONE) {
  error_message_ = base::UTF8ToUTF16(expected_error());
}

TestManagementPolicyProvider::TestManagementPolicyProvider(
    int prohibited_actions) {
  SetProhibitedActions(prohibited_actions);
  error_message_ = base::UTF8ToUTF16(expected_error());
}

void TestManagementPolicyProvider::SetProhibitedActions(
    int prohibited_actions) {
  may_load_ = (prohibited_actions & PROHIBIT_LOAD) == 0;
  may_modify_status_ = (prohibited_actions & PROHIBIT_MODIFY_STATUS) == 0;
  must_remain_enabled_ = (prohibited_actions & MUST_REMAIN_ENABLED) != 0;
  must_remain_disabled_ = (prohibited_actions & MUST_REMAIN_DISABLED) != 0;
  must_remain_installed_ = (prohibited_actions & MUST_REMAIN_INSTALLED) != 0;
}

void TestManagementPolicyProvider::SetDisableReason(
    disable_reason::DisableReason reason) {
  disable_reason_ = reason;
}

std::string TestManagementPolicyProvider::GetDebugPolicyProviderName() const {
  return "the test management policy provider";
}

bool TestManagementPolicyProvider::UserMayLoad(const Extension* extension,
                                               base::string16* error) const {
  if (error && !may_load_)
    *error = error_message_;
  return may_load_;
}

bool TestManagementPolicyProvider::UserMayModifySettings(
    const Extension* extension, base::string16* error) const {
  if (error && !may_modify_status_)
    *error = error_message_;
  return may_modify_status_;
}

bool TestManagementPolicyProvider::ExtensionMayModifySettings(
    const Extension* source_extension,
    const Extension* extension,
    base::string16* error) const {
  if (error && !may_modify_status_)
    *error = error_message_;
  return may_modify_status_;
}

bool TestManagementPolicyProvider::MustRemainEnabled(const Extension* extension,
                                                     base::string16* error)
    const {
  if (error && must_remain_enabled_)
    *error = error_message_;
  return must_remain_enabled_;
}

bool TestManagementPolicyProvider::MustRemainDisabled(
    const Extension* extension,
    disable_reason::DisableReason* reason,
    base::string16* error) const {
  if (must_remain_disabled_) {
    if (error)
      *error = error_message_;
    if (reason)
      *reason = disable_reason_;
  }
  return must_remain_disabled_;
}

bool TestManagementPolicyProvider::MustRemainInstalled(
    const Extension* extension,
    base::string16* error) const {
  if (error && must_remain_installed_)
    *error = error_message_;
  return must_remain_installed_;
}

}  // namespace extensions
