
package de.ivu.elect.presentation.stimmeingabe.action;

import javax.annotation.Nonnull;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietConversationSelect;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmen;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.menu.AbstractActionEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;
import de.ivu.elect.presentation.stimmeingabe.AbstractStimmeingabeListenkandidaturStimmenErfassenView;

@Named(StimmeingabeListenkandidaturStimmenErfassenAction.COMPONENT_NAME)
public class StimmeingabeListenkandidaturStimmenErfassenAction extends AbstractActionEntry<StimmeingabeGruppeStimmen> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmeingabeListenkandidaturStimmenErfassenAction";

  @View
  @Inject
  private transient Instance<AbstractStimmeingabeListenkandidaturStimmenErfassenView> views;

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect gebietSelect;

  @Inject
  private transient GruppeImGebietConversationSelect gruppeImGebietSelect;

  public StimmeingabeListenkandidaturStimmenErfassenAction() {
    super();
  }

  @Override
  protected UseCasePermission getRequiredPermission() {
    return UseCasePermission.STIMMEINGABE_ANZEIGEN;
  }

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

  @Override
  public boolean isDisabledInternal(@Nonnull StimmeingabeGruppeStimmen entity) {
    return !isGebietSelected() || !isStimmeingabeListenkandidaturStimmenErfassenViewHavingLetzterErgebniseingangAvailable() || !isStimmeingabeListenkandidaturStimmenApplicable(entity);
  }

  private boolean isStimmeingabeListenkandidaturStimmenErfassenViewHavingLetzterErgebniseingangAvailable() {
    AbstractStimmeingabeListenkandidaturStimmenErfassenView view = getStimmeingabeListenkandidaturStimmenErfassenView(getWahl());

    if (view != null) {
      if (view.isLetzterErgebniseingangAktuellVorhanden()) {
        return true;
      }

      addActionHintMessage();
    }

    return false;
  }

  private void addActionHintMessage() {
    messages.addInfoMessage("stimmeingabe.gruppe.stimmen.erfassen.action.stimmeingabe.listenkandidatur.stimmen.erfassen.hint");
  }

  private boolean isStimmeingabeListenkandidaturStimmenApplicable(StimmeingabeGruppeStimmen entity) {
    return entity != null && !entity.hasSystemGruppenStimmeingabe() && entity.hasStimmeingabeDieKeineZwischensummeIst() && hasStimmeingabeListenstimme(entity);
  }

  protected boolean hasStimmeingabeListenstimme(StimmeingabeGruppeStimmen entity) {
    return entity.hasStimmeingabeListenstimme();
  }

  private boolean isGebietSelected() {
    return gebietSelect.isSelected();
  }

  private Wahldurchfuehrungsgebiet getGebiet() {
    return gebietSelect.getEntity();
  }

  private Wahl getWahl() {
    return getGebiet().getWahl();
  }

  @Override
  protected String doIt(StimmeingabeGruppeStimmen entity) {
    gruppeImGebietSelect.setEntity(entity.getGruppeImGebiet());

    return getStimmeingabeListenkandidaturStimmenErfassenView(getWahl()).getViewId();
  }

  private AbstractStimmeingabeListenkandidaturStimmenErfassenView getStimmeingabeListenkandidaturStimmenErfassenView(Wahl wahl) {
    for (AbstractStimmeingabeListenkandidaturStimmenErfassenView view : views) {
      if (view.isApplicable(wahl)) {
        return view;
      }
    }

    return null;
  }

  @Override
  protected boolean isFireChangeEvent() {
    return false;
  }

  @Override
  protected void fireChangeEvent() {
    // Do nothing.
  }

  @Override
  public String getLabelKey() {
    return "stimmeingabe.gruppe.stimmen.erfassen.action.stimmeingabe.listenkandidatur.stimmen.erfassen";
  }

  @Override
  public String getIcon() {
    return appIcons.getIconEdit();
  }
}
