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

import static java.util.Arrays.asList;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;

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.AbstractLongProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.protokollierung.AttributTyp;

public class StimmeingabeAnzahlKonvertierbarPlausiCustomData extends AbstractStimmeingabePlausiKonfigurationCustomData {

  private static final long serialVersionUID = 1L;

  private static final long ANZAHL_MAX_DEFAULT = 1000000000L; // ELECTVAPP-37

  private Long anzahlMax;

  public StimmeingabeAnzahlKonvertierbarPlausiCustomData() {
    this(ANZAHL_MAX_DEFAULT);
  }

  public StimmeingabeAnzahlKonvertierbarPlausiCustomData(Long anzahlMax) {
    super();

    this.anzahlMax = anzahlMax;
  }

  public Long getAnzahlMax() {
    if (anzahlMax == null) {
      anzahlMax = ANZAHL_MAX_DEFAULT;
    }

    return anzahlMax;
  }

  public void setAnzahlMax(Long anzahlMax) {
    notifyEntity("StimmeingabeAnzahlKonvertierbarPlausiCustomData.anzahlMax", AttributTyp.LONG, this.anzahlMax, this.anzahlMax = anzahlMax);
  }

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

    return result;
  }

  @Override
  public Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> getProperties(StimmeingabePlausiKonfigurationPropertyContext context) {
    Map<StimmeingabePlausiKonfigurationCustomDataKategorie, List<Property>> result = new HashMap<>();
    result.put(StimmeingabePlausiKonfigurationCustomDataKategorie.ANZAHL, asList(new AnzahlMaxProperty(this::setAnzahlMax, this::getAnzahlMax)));

    return result;
  }

  @Override
  public String formatFehlermeldungBeispiel(StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration, StimmeingabePlausiFormatter stimmeingabePlausiFormatter) {
    String anzahlMinDummy = "0";
    String anzahlMaxDummy = "x";

    return stimmeingabePlausiFormatter.formatFehlermeldungBeispiel(stimmeingabePlausiKonfiguration.getWahl(), stimmeingabePlausiKonfiguration.getErgebniseingangsart(),
        stimmeingabePlausiKonfiguration.getTyp(), stimmeingabePlausiKonfiguration.getFehlerart(), null, null, anzahlMinDummy, anzahlMaxDummy);
  }

  @Override
  public boolean isCustomDataDefaultOverridden(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof StimmeingabeAnzahlKonvertierbarPlausiCustomData) {
      return !Objects.equals(((StimmeingabeAnzahlKonvertierbarPlausiCustomData) customDataDefault).getAnzahlMax(), getAnzahlMax());
    }

    return true;
  }

  @Override
  public void resetToDefault(StimmeingabePlausiKonfigurationCustomData customDataDefault) {
    if (customDataDefault instanceof StimmeingabeAnzahlKonvertierbarPlausiCustomData) {
      setAnzahlMax(((StimmeingabeAnzahlKonvertierbarPlausiCustomData) customDataDefault).getAnzahlMax());
    }
  }

  public static class AnzahlMaxProperty extends AbstractLongProperty {

    private final Consumer<Long> setter;

    private final Supplier<Long> getter;

    public AnzahlMaxProperty(Consumer<Long> setter, Supplier<Long> getter) {
      super();

      this.setter = setter;
      this.getter = getter;
    }

    @Override
    public boolean getDefaultRequired() {
      return true;
    }

    @Override
    public Long getDefaultValue() {
      return ANZAHL_MAX_DEFAULT;
    }

    @Override
    public String getDefaultLabel() {
      return getMessage("StimmeingabeAnzahlKonvertierbarPlausiCustomData.anzahlMax.label");
    }

    @Override
    public Long getValue() {
      return getter.get();
    }

    @Override
    public void setValue(Long value) {
      setter.accept(value);
    }

    @Override
    public long getMinValue() {
      return 0L;
    }
  }
}
