// 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_(Extension::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(
    Extension::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::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,
    Extension::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
