
package de.ivu.elect.business.stimmeingabe.control.plausi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.ivu.elect.business.stimmeingabe.entity.*;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.protokollierung.AttributTyp;
import de.ivu.elect.presentation.stimmeingabe.form.StimmeingabePlausiAnzahlComparedToAnzahlKonfiguriertCustomDataAnzahlProperty;

public class StimmeingabeAnzahlComparedToAnzahlPlausiCustomData
    extends
      AbstractStimmeingabePlausiKonfigurationCustomData
    implements
      StimmeingabePlausiAnzahlComparedToAnzahlKonfiguriertCustomData {

  private static final long serialVersionUID = 1L;

  private Long anzahl;

  public StimmeingabeAnzahlComparedToAnzahlPlausiCustomData() {
    this(null);
  }

  public StimmeingabeAnzahlComparedToAnzahlPlausiCustomData(Long anzahl) {
    super();

    this.anzahl = anzahl;
  }

  @Override
  public Long getAnzahl() {
    return anzahl;
  }

  public void setAnzahl(Long anzahl) {
    notifyEntity("AbstractStimmeingabeAnzahlComparedToAnzahlPlausiKonfigurationCustomData.anzahl", AttributTyp.LONG,
        this.anzahl, this.anzahl = anzahl);
  }

  @Override
  public Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Object>> getParameters() {
    Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Object>> result = new HashMap<>();

    List<Object> parameterValues = new ArrayList<>();
    addAnzahlParameter(parameterValues);
    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANZAHL, parameterValues);

    return result;
  }

  protected void addAnzahlParameter(List<Object> parameterValues) {
    parameterValues.add(getAnzahl());
  }

  @Override
  public Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> getProperties(
      StimmeingabePlausiKonfigurationPropertyContext context) {
    Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> result = new HashMap<>();

    List<Property> anzahlProperties = new ArrayList<>();
    addAnzahlProperty(anzahlProperties, context);
    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANZAHL, anzahlProperties);

    return result;
  }

  protected void addAnzahlProperty(List<Property> anzahlProperties,
      StimmeingabePlausiKonfigurationPropertyContext context) {
    anzahlProperties
        .add(new StimmeingabePlausiAnzahlComparedToAnzahlKonfiguriertCustomDataAnzahlProperty(this, context));
  }

  @Override
  public String formatFehlermeldungBeispiel(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration,
      StimmeingabePlausiFormatter stimmeingabePlausiFormatter) {
    return stimmeingabePlausiFormatter.formatFehlermeldungBeispiel(stimmeingabePlausiKonfiguration.getWahl(),
        stimmeingabePlausiKonfiguration.getErgebniseingangsart(), stimmeingabePlausiKonfiguration.getTyp(),
        stimmeingabePlausiKonfiguration.getFehlerart(), getAnzahl(), null);
  }

  @Override
  public boolean isCustomDataDefaultOverridden(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof StimmeingabeAnzahlComparedToAnzahlPlausiCustomData) {
      StimmeingabeAnzahlComparedToAnzahlPlausiCustomData dataDefault = (StimmeingabeAnzahlComparedToAnzahlPlausiCustomData) customDataDefault;
      if (dataDefault.getAnzahl() == null) {
        if (getAnzahl() == null) {
          return false;
        }
        return true;
      }
      return !dataDefault.getAnzahl().equals(getAnzahl());
    }
    return true;
  }

  @Override
  public void resetToDefault(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof StimmeingabeAnzahlComparedToAnzahlPlausiCustomData) {
      StimmeingabeAnzahlComparedToAnzahlPlausiCustomData dataDefault = (StimmeingabeAnzahlComparedToAnzahlPlausiCustomData) customDataDefault;
      setAnzahl(dataDefault.getAnzahl());
    }
  }
}
