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

import static java.util.Collections.singletonList;

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.boundary.WaehlerBenannteKandidaturKonfiguration;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeConversationSelect;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.presentation.menu.AbstractMenuItemEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractListenkandidaturMenuItemEntry extends AbstractMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ListeConversationSelect listeConversationSelect;

  @Inject
  private transient WaehlerBenannteKandidaturKonfiguration waehlerBenannteKandidaturKonfiguration;

  public AbstractListenkandidaturMenuItemEntry() {
    super();
  }

  @Override
  public boolean isDisabledInternal() {
    return !isListeSelected();
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return getBearbeitenGebietSecurity();
  }

  @Override
  protected Gebiet getGebietFuerSecurity() {
    Liste liste = getSelectedListe();

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

    return super.getGebietFuerSecurity();
  }

  @Override
  public String getTargetViewId() {
    return null; // damit ViewStack nicht zurückgesetzt wird
  }

  @Override
  public String doAction() {
    return getViewId(getMandant());
  }

  protected abstract String getViewId(Mandant mandant);

  @Override
  protected List<String> getAdditionalTopicViewIds() {
    return singletonList(getViewId(getMandant()));
  }

  protected boolean isEinzelbewerberListeSelected() {
    Liste liste = getSelectedListe();

    return liste != null && liste.isEinzelbewerber();
  }

  protected boolean isWaehlerBenannteListeSelected() {
    return isListeSelected() && waehlerBenannteKandidaturKonfiguration.isWaehlerBenannteListe(getSelectedListe());
  }

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

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