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

import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import javax.persistence.Transient;

import java.util.Objects;

import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabePlausiFormatter;

public abstract class AbstractStimmeingabePlausiKonfiguration implements StimmeingabePlausiKonfigurationBase {

  private static final long serialVersionUID = 1L;

  @Transient
  private transient StimmeingabePlausiKonfiguration stimmeingabePlausiKonfigurationDefault;

  public AbstractStimmeingabePlausiKonfiguration() {
    super();
  }

  public boolean isFehlerartError() {
    return StimmeingabePlausiFehlerart.ERROR.equals(getFehlerart());
  }

  public boolean isFehlerartWarning() {
    return StimmeingabePlausiFehlerart.WARNING.equals(getFehlerart());
  }

  public String formatFehlermeldung(StimmeingabePlausiFormatter stimmeingabePlausiFormatter) {
    return trimToEmpty(getCustomData(StimmeingabePlausiKonfigurationCustomData.class).formatFehlermeldungBeispiel((StimmeingabePlausiKonfiguration) this, stimmeingabePlausiFormatter));
  }

  public boolean isStimmeingabePlausiKonfigurationDefaultOverridden() {
    if (isPersistent() && getStimmeingabePlausiKonfigurationDefault() != null) {
      return !equalsIgnoreCase(getStimmeingabePlausiKonfigurationDefault().getBeschreibung(), getBeschreibung())
          || !Objects.equals(getStimmeingabePlausiKonfigurationDefault().getFehlerart(), getFehlerart())
          || !Objects.equals(getStimmeingabePlausiKonfigurationDefault().getStatus(), getStatus())
          || !equalsIgnoreCase(getStimmeingabePlausiKonfigurationDefault().getFehlerschluessel(), getFehlerschluessel())
          || !equalsIgnoreCase(getStimmeingabePlausiKonfigurationDefault().getFehlermeldungFormat(), getFehlermeldungFormat())
          || getCustomData(StimmeingabePlausiKonfigurationCustomData.class).isCustomDataDefaultOverridden(getStimmeingabePlausiKonfigurationDefault().getCustomData(StimmeingabePlausiKonfigurationCustomData.class));
    }

    return false;
  }

  protected abstract boolean isPersistent();

  public StimmeingabePlausiKonfiguration getStimmeingabePlausiKonfigurationDefault() {
    return stimmeingabePlausiKonfigurationDefault;
  }

  public void setStimmeingabePlausiKonfigurationDefault(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfigurationDefault) {
    if (stimmeingabePlausiKonfigurationDefault != null) {
      if (!Objects.equals(stimmeingabePlausiKonfigurationDefault.getErgebniseingangsart(), getErgebniseingangsart())
          || !Objects.equals(stimmeingabePlausiKonfigurationDefault.getGebietsart(), getGebietsart()) || !Objects.equals(stimmeingabePlausiKonfigurationDefault.getTyp(), getTyp())) {
        throw new IllegalArgumentException("Standard StimmeingabePlausiKonfiguration weicht von den erwarteten Werte ab [IST = [ergebniseingangsart = "
            + stimmeingabePlausiKonfigurationDefault.getErgebniseingangsart() + ", gebietsart = " + stimmeingabePlausiKonfigurationDefault.getGebietsart() + ", typ = "
            + stimmeingabePlausiKonfigurationDefault.getTyp() + "], ERWARTET = [ergebniseingangsart = " + getErgebniseingangsart() + ", gebietsart = "
            + getGebietsart() + ", typ = " + getTyp() + "]]");
      }
    }

    this.stimmeingabePlausiKonfigurationDefault = stimmeingabePlausiKonfigurationDefault;
  }

  public void copyTo(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration) {
    StimmeingabePlausiKonfiguration template = (StimmeingabePlausiKonfiguration) this;

    template.copyEntityAttributesToOtherEntity(stimmeingabePlausiKonfiguration);

    stimmeingabePlausiKonfiguration.setWahl(template.getWahl());
    stimmeingabePlausiKonfiguration.setStimmeingabePlausiKonfigurationDefault(template.getStimmeingabePlausiKonfigurationDefault());
  }

  public void copyFrom(StimmeingabePlausiKonfiguration template) {
    template.copyTo((StimmeingabePlausiKonfiguration) this);
  }
}
