
package de.ivu.elect.presentation.kandidatur.exchange;

import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.GebietByBreadthFirstUndNummerOhneParentComparator;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.control.WahlvorschlagImportContext;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaBooleanProperty;
import de.ivu.elect.presentation.ViewFormBuilder;

public class WahlvorschlagImportViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient GebietExtendedDAO gebietExtendedDAO;

  public WahlvorschlagImportViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, WahlvorschlagImportContext context) {
    if (isContextPropertiesAttributeVonGruppeUebernehmenBearbeitbar()) {
      formBuilder.addProperty(new LambdaBooleanProperty(getMessage("wahlvorschlag.import.gruppe.kennwort.uebernehmen.label"), false, context::setKennwortVonGruppeUebernehmenWennNichtGesetzt,
          context::getKennwortVonGruppeUebernehmenWennNichtGesetzt));
      formBuilder.addProperty(new LambdaBooleanProperty(getMessage("wahlvorschlag.import.gruppe.kurzname.uebernehmen.label"), false, context::setKurznameVonGruppeUebernehmenWennNichtGesetzt,
          context::getKurznameVonGruppeUebernehmenWennNichtGesetzt));
    }
  }

  public WahlvorschlagImportContext createContext(Wahl wahl) {
    WahlvorschlagImportContext result = createNewContext(wahl);

    if (isContextPropertiesAttributeVonGruppeUebernehmenBearbeitbar()) {
      // ELECT-8588 (ELECT-4324 ELECT-5265), Standardwerte beim manuellen Import sind false!
      result.setKennwortVonGruppeUebernehmenWennNichtGesetzt(false);
      result.setKurznameVonGruppeUebernehmenWennNichtGesetzt(false);
    }

    return result;
  }

  protected WahlvorschlagImportContext createNewContext(Wahl wahl) {
    return new WahlvorschlagImportContext(wahl, getBerechtigeGebiete(wahl), gebietExtendedDAO);
  }

  protected List<Gebiet> getBerechtigeGebiete(Wahl wahl) {
    return gebietExtendedDAO.findByWahl(wahl).stream()
            .filter(g -> g.isListenwahlgebiet() || g.isDirektwahlgebiet())
            .sorted(GebietByBreadthFirstUndNummerOhneParentComparator.INSTANCE)
        .collect(Collectors.toList());
  }

  protected boolean isContextPropertiesAttributeVonGruppeUebernehmenBearbeitbar() {
    return true;
  }

}
