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

import static java.util.Arrays.asList;

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.AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomDataAnteilProperty;

public abstract class AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData
    extends
      AbstractStimmeingabePlausiKonfigurationCustomData
    implements
      StimmeingabePlausiAnzahlComparedToAnzahlAnteilKonfiguriertCustomData {

  private static final long serialVersionUID = 1L;

  private Double anteil;

  public AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData() {
    this(null);
  }

  public AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData(Double anteil) {
    super();

    this.anteil = anteil;
  }

  @Override
  public Double getAnteil() {
    return anteil;
  }

  public void setAnteil(Double anteil) {
    notifyEntity("AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData.anteil",
        AttributTyp.DOUBLE, this.anteil, this.anteil = anteil);
  }

  @Override
  public Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Object>> getParameters() {
    Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Object>> result = new HashMap<>();
    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANTEIL, asList(getAnteil()));

    return result;
  }

  @Override
  public Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> getProperties(
      StimmeingabePlausiKonfigurationPropertyContext context) {
    Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> result = new HashMap<>();
    List<Property> anteilProperties = new ArrayList<>();
    addAnteilProperty(anteilProperties, context);
    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANTEIL, anteilProperties);

    return result;
  }

  protected void addAnteilProperty(List<Property> anteilProperties,
      StimmeingabePlausiKonfigurationPropertyContext context) {
    anteilProperties.add(
        new AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomDataAnteilProperty(this, context));
  }

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

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

  @Override
  public void resetToDefault(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData) {
      AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData dataDefault = (AbstractStimmeingabeAnzahlComparedToAnzahlAnteilPlausiKonfigurationCustomData) customDataDefault;
      setAnteil(dataDefault.getAnteil());
    }
  }
}
