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


import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.LambdaEntitySelectOneMenuProperty;
import de.ivu.elect.presentation.ViewFormBuilder;

import javax.inject.Inject;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class WahlListeInSelectOneMenuFuerEntityUebernahmeBuilder extends ViewFormBuilder {

  @Inject
  private transient WahlExtendedDAO wahlExtendedDAO;

  @Inject
  private transient WahlSessionSelector wahlSessionSelector;

  @Inject
  protected transient UserLocale userLocale;

  public void addProperties(FormBuilder formbuilder, EntityUebernehmenParameter parameter, String msgKey) {
    formbuilder.addProperty(new LambdaEntitySelectOneMenuProperty<>(getListeVonWahlenOhneSelected(),
            parameter::setWahlQuelle, parameter::getWahlQuelle, getLabelerFunction(), msgKey, true, true));
  }

  private Function<Wahl, String> getLabelerFunction() {
    return w -> {
      Wahl wahl = wahlExtendedDAO.attach(w);

      return wahl.getName() + " (" + userLocale.formatDate(wahl.getWahldatum()) + ")";
    };
  }

  private List<Wahl> getListeVonWahlenOhneSelected() {
    Wahl selectedWahl = wahlSessionSelector.getEntity();
    return wahlExtendedDAO.findByAll(selectedWahl.getMandant()).stream().filter(w -> !w.equals(selectedWahl)).sorted((u, v) -> {

      int result = v.getWahldatum().compareTo(u.getWahldatum());

      if (result == 0) {
        result = u.getWahlart().getName().compareTo(v.getWahlart().getName());
      }

      if (result == 0) {
        result = u.getName().compareTo(v.getName());
      }
      return result;
    }).collect(Collectors.toList());
  }
}
