/**
  * Create a StateCodeDataType.Enum as defined in UniversalCodes 2.0 from the given name of the
  * state.
  *
  * @param StateCode The state name
  * @return The StateCodeDataType type corresponding to the given State code.
  */
 public StateCodeDataType.Enum getStateCodeDataType(
     String countryAlternateCode, String stateName) {
   StateCodeDataType.Enum stateCodeDataType = null;
   State state = s2sUtilService.getStateFromName(countryAlternateCode, stateName);
   if (state != null) {
     StringBuilder stateDetail = new StringBuilder();
     stateDetail.append(state.getCode());
     stateDetail.append(": ");
     stateDetail.append(WordUtils.capitalizeFully(state.getName()));
     stateCodeDataType = StateCodeDataType.Enum.forString(stateDetail.toString());
   }
   return stateCodeDataType;
 }
  @Override
  public List<KeyValue> getKeyValues() {
    List<KeyValue> labels = new ArrayList<KeyValue>();
    List<State> baseCodes;
    if (StringUtils.isEmpty(countryCode)) {
      findCurrentPersonCountryCode();
      if (StringUtils.isEmpty(countryCode)) {
        labels.add(new ConcreteKeyValue("", ""));
        return labels;
      } else {
        baseCodes = LocationApiServiceLocator.getStateService().findAllStatesInCountry(countryCode);
      }
    } else {
      baseCodes = LocationApiServiceLocator.getStateService().findAllStatesInCountry(countryCode);
    }

    List<State> codes = new ArrayList<State>(baseCodes);
    Collections.sort(
        codes,
        new Comparator<State>() {
          @Override
          public int compare(State o1, State o2) {
            int countryCompare = o1.getCountryCode().compareTo(o2.getCountryCode());
            if (countryCompare == 0) {
              int stateCompare = o1.getName().compareTo(o2.getName());
              return stateCompare;
            } else {
              return countryCompare;
            }
          }
        });

    List<KeyValue> newLabels = new ArrayList<KeyValue>();
    newLabels.add(new ConcreteKeyValue("", ""));
    for (State state : codes) {
      if (state.isActive()) {
        newLabels.add(
            new ConcreteKeyValue(
                state.getCode(), state.getCountryCode() + " - " + state.getName()));
      }
    }
    labels = newLabels;

    clearInternalCache();
    return labels;
  }
  public static List<KeyValue> getKeyValues(String countryCodePassedIn) {
    List<KeyValue> labels = new ArrayList<KeyValue>();
    if (StringUtils.isNotEmpty(countryCodePassedIn)) {
      String determinedCountryCode;
      if (countryCodePassedIn.length() == 2) {
        determinedCountryCode = countryCodePassedIn;
      } else {
        ProposalCountryService proposalCountryService =
            KraServiceLocator.getService(ProposalCountryService.class);
        determinedCountryCode =
            proposalCountryService.convertAltCountryCodeToRealCountryCode(countryCodePassedIn);
      }

      List<State> baseCodes =
          LocationApiServiceLocator.getStateService().findAllStatesInCountry(determinedCountryCode);
      List<State> codes = new ArrayList<State>(baseCodes);
      Collections.sort(
          codes,
          new Comparator<State>() {
            @Override
            public int compare(State o1, State o2) {
              int countryCompare = o1.getCountryCode().compareTo(o2.getCountryCode());
              if (countryCompare == 0) {
                int stateCompare = o1.getName().compareTo(o2.getName());
                return stateCompare;
              } else {
                return countryCompare;
              }
            }
          });

      List<KeyValue> newLabels = new ArrayList<KeyValue>();
      newLabels.add(new ConcreteKeyValue("", ""));
      for (State state : codes) {
        if (state.isActive()) {
          newLabels.add(
              new ConcreteKeyValue(
                  state.getCode(), state.getCountryCode() + " - " + state.getName()));
        }
      }
      labels = newLabels;
    }

    return labels;
  }