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

import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap;

public enum LokalisierungLocale {

  DEUTSCH(Locale.GERMAN) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return true;
    }
  }, ENGLISCH(Locale.ENGLISH) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return true;
    }
  }, DAENISCH(new Locale("da")) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return true;
    }
  }, FRANZOESISCH(Locale.FRENCH) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return false;
    }
  }, NIEDERLAENDISCH(new Locale("nl")) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return false;
    }
  }, POLNISCH(new Locale("pl")) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return false;
    }

  }, ARABISCH(new Locale("ar")) {
    @Override
    public boolean isInIso_8859_1Enthalten() {
      return false;
    }
  };

  private final Locale locale;

  private LokalisierungLocale(Locale locale) {
    this.locale = locale;
  }

  public Locale getLocale() {
    return locale;
  }

  private static final ConcurrentHashMap<Locale, LokalisierungLocale> cache = new ConcurrentHashMap<>();

  /**
   * Kann die Sprache als "normale" ISO-kodierte Property-Datei exportiert werden, oder müssen die Zeichen escaped werden?
   */
  public abstract boolean isInIso_8859_1Enthalten();

  public static LokalisierungLocale byLocale(Locale locale) {
    if (cache.containsKey(locale)) {
      return cache.get(locale);
    }
    for (LokalisierungLocale lokalisierungLocale : values()) {
      if (lokalisierungLocale.getLocale().equals(locale)) {
        cache.put(locale, lokalisierungLocale);
        return lokalisierungLocale;
      }
    }

    for (LokalisierungLocale lokalisierungLocale : values()) {
      if (lokalisierungLocale.getLocale().getLanguage().equalsIgnoreCase(locale.getLanguage())) {
        cache.put(locale, lokalisierungLocale);
        return lokalisierungLocale;
      }
    }
    cache.put(locale, LokalisierungLocale.getFuehrendesLocale()); // Im Zweifel fallback auf fuehrendes Locale
    return LokalisierungLocale.getFuehrendesLocale();
  }

  /**
   * In dieser Sprache findet die Entwicklung statt, keys sind in dieser Sprache vollständig
   */
  public static LokalisierungLocale getFuehrendesLocale() {
    return DEUTSCH;
  }
}
