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

import static org.apache.commons.lang3.StringUtils.isBlank;

import java.io.File;
import java.io.Serializable;
import java.util.Date;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractCustomParameterLoader<T extends CustomParameterTemplate, E extends CustomParameter<T>, C extends CustomParameterLoaderContext<T>> implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  protected AbstractCustomParameterLoader() {
    super();
  }

  @Nullable
  protected String resolveStringValue(C context) {
    return getValue(context);
  }

  @Nullable
  protected Date resolveDateValue(C context) {
    return CustomParameter.parseDate(getValue(context));
  }

  protected int resolveIntegerValue(C context) {
    return resolveIntegerValue(context, 0);
  }

  protected int resolveIntegerValue(C context, int defaultValue) {
    String value = getValue(context);

    if (isBlank(value)) {
      return defaultValue; // ELECT-13809, NPE vermeiden...
    }

    return Integer.parseInt(value);
  }

  protected long resolveLongValue(C context) {
    return resolveLongValue(context, 0L);
  }

  protected long resolveLongValue(C context, long defaultValue) {
    String value = getValue(context);

    if (isBlank(value)) {
      return defaultValue; // ELECT-13809, NPE vermeiden...
    }

    return Long.parseLong(value);
  }

  protected boolean resolveBooleanValue(C context) {
    return resolveBooleanValue(context, false);
  }

  protected boolean resolveBooleanValue(C context, boolean defaultValue) {
    String value = getValue(context);

    if (isBlank(value)) {
      return defaultValue;
    }

    return Boolean.parseBoolean(value);
  }

  protected File resolveFileValue(C context) {
    String value = getValue(context);

    if (value == null) {
      return new File("");
    }

    return new File(value);
  }

  @Nullable
  public <V extends Enum< ? >> V resolveEnumValue(C context, Class<V> enumClass) {
    E parameter = getParameter(context);

    if (parameter != null) {
      return parameter.getWertEnumValue(enumClass);
    }

    return null;
  }

  @Nullable
  protected String getValue(C context) {
    E parameter = getParameter(context);

    if (parameter != null) {
      return parameter.getWert();
    }

    return "";
  }

  @Nullable
  protected String getValueRequired(C context) {
    E parameter = getParameter(context);

    requireParameterGesetz(context.getTemplate(), parameter);

    return parameter.getWert();
  }

  protected void setValue(C context, String wert) {
    getParameter(context).setWert(wert);
  }

  protected abstract E getParameter(C context);

  protected void requireParameterGesetz(T template, E parameter) {
    if (parameter == null || isBlank(parameter.getWert())) {
      Object templateName;

      try {
        templateName = messages.lokalisiere((Enum) template);
      } catch (Exception e) {
        // kann passieren, wenn im Hintergrund ohne FacesContext ausgeführt wird
        templateName = template;
      }

      handleParameterNichtNichtGesetz(templateName);
    }
  }

  protected abstract void handleParameterNichtNichtGesetz(Object template);
}
