
package de.ivu.elect.business.lokalisierung.control;

import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.faces.context.FacesContext;

import de.ivu.elect.business.lokalisierung.entity.LokalisierungLocale;

public class LokalisierungResourceBundle extends ResourceBundle {

  public static final LokalisierungResourceBundle INSTANCE = new LokalisierungResourceBundle();

  public LokalisierungResourceBundle() {
    super();
  }

  @Override
  protected Object handleGetObject(String key) {
    return getObjectNonNull(key, true);
  }

  public Object getObjectNonNull(String key, boolean nonNull) {
    String result = LokalisierungStore.getPropertyForKeyAndLocale(key, LokalisierungLocale.byLocale(getLocale()));

    if (result == null && nonNull) {
      result = "???" + key + "???"; // Vermeidet das Schmeißen einer "MissingResourceException", die nur Zeit kostet und am Ende in FacesMessageUtil wieder gefangen wird, um es durch das selbe Pattern zu ersetzen...
    }

    return result;
  }

  @Override
  public boolean containsKey(String key) {
    return LokalisierungStore.containsKey(key);
  }

  @Nonnull
  @Override
  public Enumeration<String> getKeys() {
    return LokalisierungStore.getKeys();
  }

  @Override
  protected Set<String> handleKeySet() {
    return LokalisierungStore.handleKeySet();
  }

  @Nullable
  protected static Locale getUserPreferredLocale() {
    FacesContext facesContext = FacesContext.getCurrentInstance();

    // ELECT-3395, ACHTUNG: ein Null-Check ist u.U. NICHT ausreichend...
    if (facesContext == null || facesContext.getViewRoot() == null) {
      return null;
    }

    return facesContext.getViewRoot().getLocale();
  }

  public static Locale getLocaleOrDefault() {
    Locale locale = getUserPreferredLocale(); // ELECT-3395, per Default die Browsereinstellungen benutzen...

    if (locale == null) {
      return Locale.getDefault();
    }

    return locale;
  }

  @Override
  public Locale getLocale() {
    return getLocaleOrDefault();
  }
}
