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

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

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

import static java.util.Arrays.asList;

public class WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData extends AbstractStimmeingabePlausiKonfigurationCustomData {

  private Double maximaleAbweichung;

  public WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData() {
    this(null);
  }

  public WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData(Double maximaleAbweichung) {
    super();
    this.maximaleAbweichung = maximaleAbweichung;
  }

  public Double getMaximaleAbweichung() {
    return maximaleAbweichung;
  }

  public void setMaximaleAbweichung(Double maximaleAbweichung) {
    notifyEntity("WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData.maximaleAbweichung",
        AttributTyp.DOUBLE, this.maximaleAbweichung, this.maximaleAbweichung = maximaleAbweichung);
  }

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

    return result;
  }

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

    return result;
  }

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

  @Override
  public String formatFehlermeldungBeispiel(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration, StimmeingabePlausiFormatter stimmeingabePlausiFormatter) {
    String abweichungZurVorperiodeInProzent = "x";
    String anzahlWahlberechtigteVorperiode = "y";
    return stimmeingabePlausiFormatter.formatFehlermeldungBeispiel(stimmeingabePlausiKonfiguration.getWahl(),
        stimmeingabePlausiKonfiguration.getErgebniseingangsart(), stimmeingabePlausiKonfiguration.getTyp(),
        stimmeingabePlausiKonfiguration.getFehlerart(), null, getMaximaleAbweichung(), abweichungZurVorperiodeInProzent, anzahlWahlberechtigteVorperiode);
  }

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

  @Override
  public void resetToDefault(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData) {
      WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData dataDefault = (WahlberechtigteGesamtComparedToVorperiodeKleinerGleichSchwellwertCustomData) customDataDefault;
      setMaximaleAbweichung(dataDefault.getMaximaleAbweichung());
    }
  }
}
