// 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 "components/autofill/core/browser/state_names.h"

#include <stddef.h>

#include "base/macros.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"

namespace autofill {
namespace state_names {

namespace {

// TODO(jhawkins): Add more states/provinces.  See http://crbug.com/45039.

struct StateData {
  const char* const name;
  const char abbreviation[3];
};

const StateData kStateData[] = {
    {"alabama", "al"},
    {"alaska", "ak"},
    {"arizona", "az"},
    {"arkansas", "ar"},
    {"california", "ca"},
    {"colorado", "co"},
    {"connecticut", "ct"},
    {"delaware", "de"},
    {"district of columbia", "dc"},
    {"florida", "fl"},
    {"georgia", "ga"},
    {"hawaii", "hi"},
    {"idaho", "id"},
    {"illinois", "il"},
    {"indiana", "in"},
    {"iowa", "ia"},
    {"kansas", "ks"},
    {"kentucky", "ky"},
    {"louisiana", "la"},
    {"maine", "me"},
    {"maryland", "md"},
    {"massachusetts", "ma"},
    {"michigan", "mi"},
    {"minnesota", "mn"},
    {"mississippi", "ms"},
    {"missouri", "mo"},
    {"montana", "mt"},
    {"nebraska", "ne"},
    {"nevada", "nv"},
    {"new hampshire", "nh"},
    {"new jersey", "nj"},
    {"new mexico", "nm"},
    {"new york", "ny"},
    {"north carolina", "nc"},
    {"north dakota", "nd"},
    {"ohio", "oh"},
    {"oklahoma", "ok"},
    {"oregon", "or"},
    {"pennsylvania", "pa"},
    {"puerto rico", "pr"},
    {"rhode island", "ri"},
    {"south carolina", "sc"},
    {"south dakota", "sd"},
    {"tennessee", "tn"},
    {"texas", "tx"},
    {"utah", "ut"},
    {"vermont", "vt"},
    {"virginia", "va"},
    {"washington", "wa"},
    {"west virginia", "wv"},
    {"wisconsin", "wi"},
    {"wyoming", "wy"},
};

}  // namespace

base::string16 GetAbbreviationForName(const base::string16& name) {
  for (const StateData& state : kStateData) {
    if (base::LowerCaseEqualsASCII(name, state.name))
      return base::ASCIIToUTF16(state.abbreviation);
  }
  return base::string16();
}

base::string16 GetNameForAbbreviation(const base::string16& abbreviation) {
  for (const StateData& state : kStateData) {
    if (base::LowerCaseEqualsASCII(abbreviation, state.abbreviation))
      return base::ASCIIToUTF16(state.name);
  }
  return base::string16();
}

void GetNameAndAbbreviation(const base::string16& value,
                            base::string16* name,
                            base::string16* abbreviation) {
  base::string16 full = GetNameForAbbreviation(value);
  base::string16 abbr = value;
  if (full.empty()) {
    abbr = GetAbbreviationForName(value);
    full = value;
  }

  if (name)
    name->swap(full);
  if (abbreviation)
    abbreviation->swap(abbr);
}

}  // namespace state_names
}  // namespace autofill
