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

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

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();

  @Override
  protected Object handleGetObject(@Nonnull 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(@Nonnull String key) {
    return LokalisierungStore.containsKey(key);
  }

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

  @Nullable
  protected static Locale getUserPreferredLocale() {
    // ELECT-3395
    //
    // ACHTUNG: Potentielle Fehlerquelle!!! Ein Null-Check ist u.U. NICHT ausreichend.
    //

    if (FacesContext.getCurrentInstance() == null || FacesContext.getCurrentInstance().getViewRoot() == null) {
      return null;
    }
    return FacesContext.getCurrentInstance().getViewRoot().getLocale();
  }

  public static Locale getLocaleOrDefault() {
    // ELECT-3395
    //
    // Per Default die Browsereinstellungen benutzen.
    //

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

    return locale;
  }


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

}
