
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.AbstractStimmeingabePlausiKonfigurationCustomData;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationCustomData;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationCustomDataKategorie;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationPropertyContext;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.protokollierung.AttributTyp;
import de.ivu.elect.presentation.stimmeingabe.form.StimmeingabePlausiAnzahlComparedToAnzahlKonfiguriertCustomDataAnzahlGruppenRelevantProperty;

public class GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData extends AbstractStimmeingabePlausiKonfigurationCustomData {

  private static final long serialVersionUID = 1L;

  private Long anzahlGruppenRelevant;

  public GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData() {
    this(null);
  }

  public GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData(Long anzahlGruppenRelevant) {
    super();

    this.anzahlGruppenRelevant = anzahlGruppenRelevant;
  }

  public Long getAnzahlGruppenRelevant() {
    return anzahlGruppenRelevant;
  }

  public void setAnzahlGruppenRelevant(Long anzahlGruppenRelevant) {
    notifyEntity("GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData.anzahlGruppenRelevant", AttributTyp.LONG, this.anzahlGruppenRelevant,
        this.anzahlGruppenRelevant = anzahlGruppenRelevant);
  }

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

    return result;
  }

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

    List<Property> anzahlProperties = new ArrayList<>();
    addAnzahlGruppenRelevantProperty(anzahlProperties, context);

    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANZAHL, anzahlProperties);

    return result;
  }

  private void addAnzahlGruppenRelevantProperty(List<Property> anzahlProperties, StimmeingabePlausiKonfigurationPropertyContext context) {
    anzahlProperties.add(new StimmeingabePlausiAnzahlComparedToAnzahlKonfiguriertCustomDataAnzahlGruppenRelevantProperty(this, context));
  }

  @Override
  public String formatFehlermeldungBeispiel(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration, StimmeingabePlausiFormatter stimmeingabePlausiFormatter) {
    Long anzahlGebieteIdentischDummy = 1L;
    String gebietNummerDummy = "x";

    return stimmeingabePlausiFormatter.formatFehlermeldungBeispiel(stimmeingabePlausiKonfiguration.getWahl(), stimmeingabePlausiKonfiguration.getErgebniseingangsart(),
        stimmeingabePlausiKonfiguration.getTyp(), stimmeingabePlausiKonfiguration.getFehlerart(), null, null, anzahlGebieteIdentischDummy, gebietNummerDummy, getAnzahlGruppenRelevant());
  }

  @Override
  public boolean isCustomDataDefaultOverridden(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData) {
      GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData dataDefault = (GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData) customDataDefault;

      if (dataDefault.getAnzahlGruppenRelevant() == null) {
        if (getAnzahlGruppenRelevant() == null) {
          return false;
        }

        return true;
      }

      return !dataDefault.getAnzahlGruppenRelevant().equals(getAnzahlGruppenRelevant());
    }

    return true;
  }

  @Override
  public void resetToDefault(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData) {
      GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData dataDefault = (GruppeStimmenAnzahlenUngleichGruppeStimmenAnzahlenInAnderenErfassungsgebietenPlausiCustomData) customDataDefault;

      setAnzahlGruppenRelevant(dataDefault.getAnzahlGruppenRelevant());
    }
  }
}
