package de.ivu.elect.business.hochrechnung.boundary;

import java.util.Set;
import java.util.function.BiFunction;

import de.ivu.elect.business.hochrechnung.entity.HochrechnungsalgorithmusArt;
import de.ivu.elect.business.hochrechnung.entity.KoordinatenInformationen;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;

public interface HochrechnungsalgorithmusKonfiguration {

  /*
  uncomment if you want to make VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen it chosable. Now it's set as default.
  VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen getVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen();
  void setVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen(VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen vorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen);*/

  void addObservingProperties(FormBuilder formBuilder, LambdaEnumProperty observedProperty, BiFunction<String, Object[], String> messageGetter);

  default void addAbstractObservingLambdaProperty(FormBuilder formBuilder, LambdaEnumProperty<HochrechnungsalgorithmusArt> observedProperty, Property observerProperty, Set<HochrechnungsalgorithmusArt> valueWhenToShowObserver, boolean defaultRequired) {
    observerProperty.setVisibleOnPageLoad(false);
    observerProperty.setVisible(observedProperty.getValue() != null && valueWhenToShowObserver.contains(observedProperty.getValue()));
    observerProperty.appendObservedPropertyValueChangedConsumer(other -> {
      if (other.equals(observedProperty)) {
        observerProperty.setVisible(observedProperty.getValue() != null && valueWhenToShowObserver.contains(observedProperty.getValue()));
      }
      if (observerProperty.isVisible()) {
        observerProperty.setRequired(defaultRequired);
      } else {
        observerProperty.setRequired(false);
      }
    });
    if (observerProperty.isVisible()) {
      observerProperty.setRequired(defaultRequired);
    } else {
      observerProperty.setRequired(false);
    }
    formBuilder.addProperty(observerProperty).withObservedProperty(observedProperty);
  }

  /*
  uncomment if you want to make VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen it chosable. Now it's set as default.
  default void addLambdaVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmenEnumProperty (FormBuilder formBuilder, VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen defaultValue, LambdaEnumProperty observedProperty, BiFunction<String, Object[], String> messageGetter) {
    this.setVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen(defaultValue);

    LambdaEnumProperty<VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen> lambdaVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmenEnumProperty = new LambdaEnumProperty<>(
        messageGetter.apply("ergebniseingang.fiktive.ergebniseingaenge.erzeugen.vorlaeufiges.ergebnis.uebernehemen", new Object[0]), true,
        this::setVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen, this::getVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen,
        VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen.class, Arrays.asList(VorlaefigesErgebnisAlsFiktivesErgebnisUebernehmen.values()), true);

    Set<HochrechnungsalgorithmusArt> showByHochrechnungsalgorithmusArt = new HashSet<>();
    showByHochrechnungsalgorithmusArt.add(getHochrechnungsalgorithmusArt());
    addAbstractObservingLambdaProperty(formBuilder, observedProperty, lambdaVorlaefigesErgebnisAlsFiktivesErgebnisUebernehmenEnumProperty,
        showByHochrechnungsalgorithmusArt, true);
  }*/

  HochrechnungsalgorithmusArt getHochrechnungsalgorithmusArt();

  void adjustDefaultSelectionNachKoordinatenInformationen(KoordinatenInformationen koordinatenInformationen);
}