
package de.ivu.elect.presentation.kandidatur;

import static java.util.stream.Collectors.toSet;

import java.util.Collection;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.boundary.ErsatzkandidaturPruefer;
import de.ivu.elect.business.kandidatur.boundary.ErsatzkandidaturPruefer.Result;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturArt;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeConversationSelect;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.presentation.personenregister.AbstractPersonenregisterPersonendatenSelectionViewCreateViewHelper;

public abstract class AbstractListenkandidaturCreateViewHelper extends AbstractPersonenregisterPersonendatenSelectionViewCreateViewHelper<Listenkandidatur> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient KandidaturCreateViewHelper kandidaturCreateViewHelper;

  @Inject
  protected transient ListeConversationSelect listeConversationSelect;

  @Inject
  protected transient ErsatzkandidaturPruefer ersatzkandidaturPruefer;

  public AbstractListenkandidaturCreateViewHelper() {
    super();
  }

  public void preRenderView() {
    kandidaturCreateViewHelper.checkAutoCompleteOptionsExist(getSelectedWahl());
  }

  @Override
  @Nullable
  public String checkPreCondition() {
    if (isListeForGebietSelected()) {
      return null;
    }

    return cancel();
  }

  protected boolean isListeForGebietSelected() {
    return isListeSelected() && isGebietSelected() && getSelectedGebiet().equals(getSelectedListe().getGebiet());
  }

  protected boolean isListeSelected() {
    return listeConversationSelect.isSelected();
  }

  protected Liste getSelectedListe() {
    return listeConversationSelect.getEntity();
  }

  public String getListeName() {
    Liste liste = getSelectedListe();

    if (liste != null) {
      return liste.getKurznameAufGebiet();
    }

    return "";
  }

  public void init(Liste liste, Long listenposition, Listenkandidatur listenkandidatur) {
    kandidaturCreateViewHelper.initKandidatur(liste.getGebiet(), listenkandidatur);

    Result listenkandidaturMarkiertAlsErsatzkandidaturHinzufuegenResult = ersatzkandidaturPruefer.checkListenkandidaturMarkiertAlsErsatzkandidaturHinzufuegen(liste.getWahl(), liste);

    ListenkandidaturArt listenkandidaturArtInitialized = ListenkandidaturArt.LISTENKANDIDATUR;

    if (listenkandidaturMarkiertAlsErsatzkandidaturHinzufuegenResult.isWeitereErsatzkandidaturZulaessig()) { // ELECTMUC-517
      Collection<Listenkandidatur> listenkandidaturenMarkiertAlsListenkandidatur = liste.getListenkandidaturen().stream() //
          .filter(one -> !one.isListenkandidaturMarkiertAlsErsatzkandidatur()) //
          .collect(toSet());

      long anzahlListenkandidaturenMaximal = listenkandidaturMarkiertAlsErsatzkandidaturHinzufuegenResult.getAnzahlKandidaturenMaximal();

      if (anzahlListenkandidaturenMaximal > 0 && listenkandidaturenMarkiertAlsListenkandidatur.size() >= anzahlListenkandidaturenMaximal) {
        listenkandidaturArtInitialized = ListenkandidaturArt.ERSATZKANDIDATUR;
      }
    }

    // NOTE, dass die Liste BEWUSST ERST NACH der Auswertung der bereits vorhandenen Listenkandidaturen gesetzt wird!!!
    listenkandidatur.setListe(liste);
    listenkandidatur.setListenkandidaturArt(listenkandidaturArtInitialized);
    listenkandidatur.setRelativePosition(listenposition);
  }

  protected void tryAttachStaatsangehoerigkeiten(Personendaten personendaten) {
    kandidaturCreateViewHelper.tryAttachStaatsangehoerigkeiten(personendaten);
  }
}
