// Copyright (c) 2010 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 "components/proxy_config/proxy_prefs.h"

#include "base/logging.h"
#include "base/stl_util.h"

namespace ProxyPrefs {

namespace {

// These names are exposed to the proxy extension API. They must be in sync
// with the constants of ProxyPrefs.
const char* kProxyModeNames[] = { kDirectProxyModeName,
                                  kAutoDetectProxyModeName,
                                  kPacScriptProxyModeName,
                                  kFixedServersProxyModeName,
                                  kSystemProxyModeName };

static_assert(base::size(kProxyModeNames) == kModeCount,
              "kProxyModeNames must have kModeCount elements");

}  // namespace

const char kDirectProxyModeName[] = "direct";
const char kAutoDetectProxyModeName[] = "auto_detect";
const char kPacScriptProxyModeName[] = "pac_script";
const char kFixedServersProxyModeName[] = "fixed_servers";
const char kSystemProxyModeName[] = "system";

bool IntToProxyMode(int in_value, ProxyMode* out_value) {
  DCHECK(out_value);
  if (in_value < 0 || in_value >= kModeCount)
    return false;
  *out_value = static_cast<ProxyMode>(in_value);
  return true;
}

bool StringToProxyMode(const std::string& in_value, ProxyMode* out_value) {
  DCHECK(out_value);
  for (int i = 0; i < kModeCount; i++) {
    if (in_value == kProxyModeNames[i])
      return IntToProxyMode(i, out_value);
  }
  return false;
}

const char* ProxyModeToString(ProxyMode mode) {
  return kProxyModeNames[mode];
}

std::string ConfigStateToDebugString(ConfigState state) {
  switch (state) {
    case CONFIG_POLICY:
      return "config_policy";
    case CONFIG_EXTENSION:
      return "config_extension";
    case CONFIG_OTHER_PRECEDE:
      return "config_other_precede";
    case CONFIG_SYSTEM:
      return "config_system";
    case CONFIG_FALLBACK:
      return "config_fallback";
    case CONFIG_UNSET:
      return "config_unset";
  }
  NOTREACHED();
  return "";
}

}  // namespace ProxyPrefs
