// Copyright 2014 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 "chrome/browser/policy/network_prediction_policy_handler.h"

#include "base/values.h"
#include "chrome/browser/net/prediction_options.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/core/common/policy_map.h"
#include "components/prefs/pref_value_map.h"
#include "grit/components_strings.h"
#include "policy/policy_constants.h"

namespace policy {

NetworkPredictionPolicyHandler::NetworkPredictionPolicyHandler() {
}

NetworkPredictionPolicyHandler::~NetworkPredictionPolicyHandler() {
}

bool NetworkPredictionPolicyHandler::CheckPolicySettings(
    const PolicyMap& policies,
    PolicyErrorMap* errors) {
  // Deprecated boolean preference.
  const base::Value* network_prediction_enabled =
      policies.GetValue(key::kDnsPrefetchingEnabled);
  // New enumerated preference.
  const base::Value* network_prediction_options =
      policies.GetValue(key::kNetworkPredictionOptions);

  if (network_prediction_enabled &&
      !network_prediction_enabled->IsType(base::Value::TYPE_BOOLEAN)) {
    errors->AddError(key::kDnsPrefetchingEnabled,
                     IDS_POLICY_TYPE_ERROR,
                     ValueTypeToString(base::Value::TYPE_BOOLEAN));
  }

  if (network_prediction_options &&
      !network_prediction_options->IsType(base::Value::TYPE_INTEGER)) {
    errors->AddError(key::kNetworkPredictionOptions,
                     IDS_POLICY_TYPE_ERROR,
                     ValueTypeToString(base::Value::TYPE_INTEGER));
  }

  if (network_prediction_enabled && network_prediction_options) {
    errors->AddError(key::kDnsPrefetchingEnabled,
                     IDS_POLICY_OVERRIDDEN,
                     key::kNetworkPredictionOptions);
  }

  return true;
}

void NetworkPredictionPolicyHandler::ApplyPolicySettings(
    const PolicyMap& policies,
    PrefValueMap* prefs) {
  const base::Value* network_prediction_options =
      policies.GetValue(key::kNetworkPredictionOptions);
  int int_setting;
  if (network_prediction_options &&
      network_prediction_options->GetAsInteger(&int_setting)) {
    prefs->SetInteger(prefs::kNetworkPredictionOptions, int_setting);
    return;
  }

  // Observe deprecated policy setting for compatibility.
  const base::Value* network_prediction_enabled =
      policies.GetValue(key::kDnsPrefetchingEnabled);
  bool bool_setting;
  if (network_prediction_enabled &&
      network_prediction_enabled->GetAsBoolean(&bool_setting)) {
    // Some predictive network actions, most notably prefetch, used to be
    // hardwired never to run on cellular network.  In order to retain this
    // behavior (unless explicitly overriden by kNetworkPredictionOptions),
    // kNetworkPredictionEnabled = true is translated to
    // kNetworkPredictionOptions = WIFI_ONLY.
    prefs->SetInteger(prefs::kNetworkPredictionOptions,
                      bool_setting
                          ? chrome_browser_net::NETWORK_PREDICTION_WIFI_ONLY
                          : chrome_browser_net::NETWORK_PREDICTION_NEVER);
  }
}

}  // namespace policy
