
package de.ivu.elect.presentation.wahlvorschlag.form;

import static java.util.Arrays.asList;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

import de.ivu.elect.business.kandidatur.control.StimmzettelFormatterKandidaturFormatDarstellung;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.ViewFormBuilder;

public class WahlvorschlagDokumentErzeugenViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  public WahlvorschlagDokumentErzeugenViewFormBuilder() {
    super();
  }

  public void addPropertyKandidaturFormatDarstellung(FormBuilder formBuilder, Wahl wahl, Supplier<StimmzettelFormatterKandidaturFormatDarstellung> getter,
      Consumer<StimmzettelFormatterKandidaturFormatDarstellung> setter, boolean hasNoSelectionItem) {
    if (wahl != null) {
      boolean wahlMitListenkandidaturen = wahl.isWahlMitListenkandidatenStimmen();
      boolean wahlMitDirektkandidaturen = wahl.isWahlMitDirektkandidatengebieten();

      if (wahlMitDirektkandidaturen || wahlMitListenkandidaturen) {
        String labelMsgKeySuffix = "";

        if (wahlMitDirektkandidaturen) {
          if (wahlMitListenkandidaturen) {
            labelMsgKeySuffix = "KANDIDATUR";
          } else {
            labelMsgKeySuffix = "DIREKTKANDIDATUR";
          }
        } else {
          labelMsgKeySuffix = "LISTENKANDIDATUR";
        }

        if (isKandidaturFormatDarstellungSupported(wahl) && isNotBlank(labelMsgKeySuffix)) {
          addPropertyKandidaturFormatDarstellung(formBuilder, getter, setter, "StimmzettelFormatterKandidaturFormatDarstellung.label." + labelMsgKeySuffix, hasNoSelectionItem);
        }
      }
    }
  }

  public void addPropertyKandidaturFormatDarstellung(FormBuilder formBuilder, Supplier<StimmzettelFormatterKandidaturFormatDarstellung> getter,
      Consumer<StimmzettelFormatterKandidaturFormatDarstellung> setter, String labelMsgKey, boolean hasNoSelectionItem) {
    List<StimmzettelFormatterKandidaturFormatDarstellung> values = new ArrayList<>(asList(StimmzettelFormatterKandidaturFormatDarstellung.values()));
    values.removeIf(StimmzettelFormatterKandidaturFormatDarstellung::isInfotextNewlineRequired); // Nur einzeilig...

    if (!values.isEmpty()) {
      formBuilder.addProperty(new LambdaEnumProperty<>(getMessage(labelMsgKey), false, setter, getter, StimmzettelFormatterKandidaturFormatDarstellung.class, values, hasNoSelectionItem));
    }
  }

  protected boolean isKandidaturFormatDarstellungSupported(Wahl wahlMitKandidaturen) {
    return false;
  }
}
