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

import java.io.File;
import java.io.Serializable;

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

import org.apache.commons.lang3.StringUtils;

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


import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isBlank;

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;

  public AbstractCustomParameterLoader() {
    super();
  }

  protected String resolveRequiredStringValue(C context) {
    E parameter = getParameter(context);

    requireParameterGesetz(context.getTemplate(), parameter);

    return parameter.getWert();
  }

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

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

  protected String resolveStringValue(C context) {
    return resolveValue(context);
  }

  protected int resolveIntegerValue(C context) {
    return Integer.parseInt(resolveValue(context));
  }

  protected long resolveLongValue(C context) {
    return Long.parseLong(resolveValue(context));
  }

  @Nullable
  protected Long resolveLongValueOptional(C context) {
    String value = resolveValue(context);
    if (StringUtils.isBlank(value)) {
      return null;
    }
    return Long.parseLong(value);
  }

  protected boolean resolveBooleanValue(C context) {
    return Boolean.parseBoolean(resolveValue(context));
  }

  protected String resolveStringValue(C context, String valueParameterNichtVorhanden) {
    E parameter = getParameter(context);

    if (parameter == null) {
      return valueParameterNichtVorhanden;
    }

    return resolveValue(context);
  }

  protected int resolveIntegerValue(C context, int defaultValue) {
    return Integer.parseInt(resolveStringValue(context, Integer.toString(defaultValue)));
  }

  protected boolean resolveBooleanValue(C context, boolean defaultValue) {
    return Boolean.parseBoolean(resolveStringValue(context, Boolean.toString(defaultValue)));
  }

  protected File resolveFileValue(C context) {
    String pathname = resolveStringValue(context);

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

    return new File(pathname);
  }

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

    if (nonNull(parameter)) {
      return (V) parameter.getWertEnumValue();
    }

    return null;
  }

  private String resolveValue(C context) {
    E parameter = getParameter(context);

    if (nonNull(parameter)) {
      return parameter.getWert();
    }

    return "";
  }

  protected abstract E getParameter(C context);
}
