
package de.ivu.elect.dokumente.stimmzettel;

import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatterKandidaturFormatDarstellung;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportContext;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.dokumente.DokumentVorlageLambdaProperty;
import de.ivu.elect.presentation.wahlvorschlag.form.WahlvorschlagDokumentErzeugenViewFormBuilder;

public abstract class AbstractStimmzettelExportFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlvorschlagDokumentErzeugenViewFormBuilder wahlvorschlagDokumentErzeugenViewFormBuilder;

  protected AbstractStimmzettelExportFormBuilder() {
    super();
  }

  protected void addCommonProperties(FormBuilder formBuilder, StimmzettelExportContext context, boolean dokumentVorlageErwartet, List<DokumentVorlage> dokumentVorlagen,
      List<FileType> targetFileTypes) {
    if (dokumentVorlageErwartet) {
      addPropertyDokumentVorlage(formBuilder, context::getDokumentVorlage, context::setDokumentVorlage, dokumentVorlagen);
    }

    addPropertyTargetFileType(formBuilder, context::getTargetFileType, context::setTargetFileType, targetFileTypes);
  }

  protected void addPropertyDokumentVorlage(FormBuilder formBuilder, Supplier<DokumentVorlage> getter, Consumer<DokumentVorlage> setter, List<DokumentVorlage> values) {
    if (values.size() > 1) { // ELECT-16281
      formBuilder.addProperty(new DokumentVorlageLambdaProperty(values, getter, setter));
    }
  }

  protected void addPropertyTargetFileType(FormBuilder formBuilder, Supplier<FileType> getter, Consumer<FileType> setter, List<FileType> values) {
    addPropertyTargetFileType(formBuilder, getter, setter, "dokument.erzeugen.zieldatei.typ", values, false);
  }

  protected void addPropertyTargetFileType(FormBuilder formBuilder, Supplier<FileType> getter, Consumer<FileType> setter, String labelMsgKey, List<FileType> values, boolean hasNoSelectionItem) {
    if (!values.isEmpty()) { // ELECT-9240
      formBuilder.addProperty(new LambdaEnumProperty<>(getMessage(labelMsgKey), values.get(0), false, setter, getter, FileType.class, values, hasNoSelectionItem));
    }
  }

  protected void addPropertyKandidaturFormatDarstellung(FormBuilder formBuilder, StimmzettelExportContext context, boolean hasNoSelectionItem) {
    wahlvorschlagDokumentErzeugenViewFormBuilder.addPropertyKandidaturFormatDarstellung(formBuilder, context.getWahl(), context::getKandidaturFormatDarstellung,
        context::setKandidaturFormatDarstellung, hasNoSelectionItem);
  }

  protected void addPropertyKandidaturFormatDarstellung(FormBuilder formBuilder, StimmzettelExportContext context, String labelMsgKey,
      Function<StimmzettelFormatterKandidaturFormatDarstellung, String> itemLabeler, Comparator<StimmzettelFormatterKandidaturFormatDarstellung> itemComparator, boolean hasNoSelectionItem) {
    wahlvorschlagDokumentErzeugenViewFormBuilder.addPropertyKandidaturFormatDarstellung(formBuilder, context::getKandidaturFormatDarstellung, context::setKandidaturFormatDarstellung, labelMsgKey,
        itemLabeler, itemComparator, hasNoSelectionItem);
  }
}
