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

import java.util.function.Function;

import de.ivu.elect.business.entschaedigung.entity.Entschaedigungsart;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartConstants;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTK;
import de.ivu.elect.business.entschaedigung.entity.EntschaedigungsartTemplate;
import de.ivu.elect.jee.entity.tk.EntityTK;
import de.ivu.elect.jee.faces.IMessages;
import de.ivu.elect.jee.faces.Messages;

public class EntschaedigungsartImportTKFactory {

  private EntschaedigungsartImportTKFactory() {
    super();
  }

  public static EntityTK create(Entschaedigungsart entschaedigungsart) {
    if (entschaedigungsart.isTemplateStandard()) {
      return new EntschaedigungsartTKByTemplate(entschaedigungsart);
    }

    return new EntschaedigungsartTK(entschaedigungsart.getBezeichnung(), entschaedigungsart.getKriteriumPersonendatenArt(), entschaedigungsart.getTemplate());
  }

  /**
   * !!!AUTO-GENERATED!!!
   *
   * Alternativer TK, erzeugt mit Takatuka, der verwendet wird, falls Entschaedigungsart#getTemplate ein Standard-Template liefert, also die Entschädigungsart per Enum-Wert identifiziert werden kann.
   *
   * @see EntschaedigungsartImportTKFactory
   * @see EntschaedigungsartTemplate
   */
  private static class EntschaedigungsartTKByTemplate implements de.ivu.elect.jee.entity.tk.EntityTK, java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private final int hashCode;

    protected final java.lang.String kriteriumPersonendatenArt;

    protected final java.lang.String template;

    public EntschaedigungsartTKByTemplate(Entschaedigungsart entschaedigungsart) {
      this(entschaedigungsart.getKriteriumPersonendatenArt(), entschaedigungsart.getTemplate());
    }

    public EntschaedigungsartTKByTemplate(String kriteriumPersonendatenArt, String template) {
      super();

      this.kriteriumPersonendatenArt = kriteriumPersonendatenArt;
      this.template = template;

      this.hashCode = calculateHashCode();
    }

    public static <E extends Entschaedigungsart> java.util.Map<EntschaedigungsartTKByTemplate, E> mappeEntschaedigungsartNachTK(java.util.Collection<E> entities) {
      return entities.stream().collect(java.util.stream.Collectors.toMap(EntschaedigungsartTKByTemplate::new, Function.<E> identity(), (u, v) -> v));
    }

    public static Function<Entschaedigungsart, EntschaedigungsartTKByTemplate> getEntschaedigungsartToTKFunction() {
      return EntschaedigungsartTKByTemplate::new;
    }

    public java.lang.String getKriteriumPersonendatenArt() {
      return kriteriumPersonendatenArt;
    }

    public java.lang.String getTemplate() {
      return template;
    }

    @Override
    public int hashCode() {
      return hashCode;
    }

    protected int calculateHashCode() {
      int result = 1;

      result = result + (kriteriumPersonendatenArt == null ? 0 : kriteriumPersonendatenArt.hashCode());
      result = result + (template == null ? 0 : template.hashCode());

      return result;
    }

    @Override
    public boolean equals(Object obj) {
      if (this == obj) {
        return true;
      }

      if (obj == null) {
        return false;
      }

      if (hashCode() != obj.hashCode()) {
        return false;
      }

      if (getClass() != obj.getClass()) {
        return false;
      }

      EntschaedigungsartTKByTemplate other = (EntschaedigungsartTKByTemplate) obj;

      if (kriteriumPersonendatenArt == null) {
        if (other.kriteriumPersonendatenArt != null) {
          return false;
        }
      } else if (!kriteriumPersonendatenArt.equals(other.kriteriumPersonendatenArt)) {
        return false;
      }
      if (template == null) {
        if (other.template != null) {
          return false;
        }
      } else if (!template.equals(other.template)) {
        return false;
      }

      return true;
    }

    protected boolean hatAttribute() {
      return true;
    }

    @Override
    public String getEntityMessageKey() {
      return EntschaedigungsartConstants.MESSAGE_KEY_ENTITY_EINZAHL;
    }

    @Override
    public java.util.List<de.ivu.elect.jee.entity.tk.EntityFieldValue> getAllEntityFieldValues() {
      java.util.List<de.ivu.elect.jee.entity.tk.EntityFieldValue> result = new java.util.ArrayList<>();

      result.addAll(getEntityFieldValuesForEntity());

      return result;
    }

    @Override
    public java.util.List<de.ivu.elect.jee.entity.tk.EntityFieldValue> getEntityFieldValuesForEntity() {
      java.util.List<de.ivu.elect.jee.entity.tk.EntityFieldValue> result = new java.util.ArrayList<>();

      result.add(new de.ivu.elect.jee.entity.tk.EntityFieldValue(EntschaedigungsartConstants.MESSAGE_KEY_ENTITY_EINZAHL, EntschaedigungsartConstants.MESSAGE_KEY_KRITERIUM_PERSONENDATEN_ART_EINZAHL,
          kriteriumPersonendatenArt));
      result.add(new de.ivu.elect.jee.entity.tk.EntityFieldValue(EntschaedigungsartConstants.MESSAGE_KEY_ENTITY_EINZAHL, EntschaedigungsartConstants.MESSAGE_KEY_ENTSCHAEDIGUNGSART_TEMPLATE_EINZAHL,
          template));

      return result;
    }

    @Override
    public String toString() {
      return "EntschaedigungsartTKByTemplate[" + toStringParameter() + "]";
    }

    protected String toStringParameter() {
      String result = "" + "kriteriumPersonendatenArt=" + kriteriumPersonendatenArt + ", template=" + template;

      return result;
    }

    @Override
    public String toStringLokalisiert(IMessages messages) {
      return messages.getMessageForMessageKey(getEntityMessageKey()) + " [" + messages.getMessageForMessageKey(EntschaedigungsartConstants.MESSAGE_KEY_KRITERIUM_PERSONENDATEN_ART_EINZAHL) + "="
          + kriteriumPersonendatenArt + ", " + messages.getMessageForMessageKey(EntschaedigungsartConstants.MESSAGE_KEY_ENTSCHAEDIGUNGSART_TEMPLATE_EINZAHL) + "=" + template + "]";
    }
  }
}
