
package de.ivu.elect.presentation.wahlvorschlag;

import java.util.Collection;

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

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagsdokumentExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagReihenfolgeBestaetigenEvent;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlagsdokument;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.kandidatur.ListenkandidaturCreateViewResolver;
import de.ivu.elect.presentation.kandidatur.ListenkandidaturSearchView;
import de.ivu.elect.presentation.wahlvorschlag.form.ListeViewFormBuilder;
import de.ivu.elect.presentation.wahlvorschlag.form.WahlvorschlagsdokumenteViewFormBuilder;

@OnlineHilfeId("259")
@Named(ListeEditView.COMPONENT_NAME)
public class ListeEditView extends AbstractListeEditView {

  private static final long serialVersionUID = 1L;

  public static final String PARENT_VIEW_ID = WahlvorschlagSearchView.VIEW_ID;

  @Inject
  protected transient WahlvorschlagsdokumentExtendedDAO wahlvorschlagsdokumentExtendedDAO;

  @View
  @Inject
  protected transient ListenkandidaturSearchView listenkandidaturSearchView;

  @Inject
  protected transient ListenkandidaturCreateViewResolver listenkandidaturCreateViewResolver;

  @Inject
  protected transient ListeViewFormBuilder listeViewFormBuilder;

  @Inject
  protected transient WahlvorschlagsdokumenteViewFormBuilder wahlvorschlagsdokumenteViewFormBuilder;

  @Inject
  private transient WahlvorschlagReihenfolgeBestaetigenEvent wahlvorschlagReihenfolgeBestaetigenEvent;

  private Collection<Wahlvorschlagsdokument> wahlvorschlagsdokumente;

  public ListeEditView() {
    super();
  }

  @Override
  protected boolean isGebietBearbeitenRechtPruefen() {
    return true;
  }

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

    return cancel();
  }

  private boolean isListeForGebietSelected() {
    return isListeSelected() && isGebietSelected() && getSelectedGebiet().equals(getEntity().getGebiet());
  }

  private boolean isListeSelected() {
    return isEntitySet();
  }

  public String getListeName() {
    if (getEntity() == null) {
      return null;
    }

    return getEntity().getKurznameAufGebiet();
  }

  public String getGebietName() {
    return getSelectedGebietNameFormatted();
  }

  private Collection<Wahlvorschlagsdokument> getWahlvorschlagsdokumente() {
    if (wahlvorschlagsdokumente == null) {
      wahlvorschlagsdokumente = findWahlvorschlagsdokumente();
    }

    return wahlvorschlagsdokumente;
  }

  private Collection<Wahlvorschlagsdokument> findWahlvorschlagsdokumente() {
    return wahlvorschlagsdokumentExtendedDAO.findByWahlvorschlag(getEntity());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Liste liste) {
    boolean readonly = false;

    listeViewFormBuilder.addProperties(formBuilder, liste, readonly);

    wahlvorschlagsdokumenteViewFormBuilder.addProperties(formBuilder, getSelectedWahl(), liste, getWahlvorschlagsdokumente(), readonly);
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.LISTE_EDIT)
  public String save() {
    super.save();

    return getParentViewId();
  }

  @Override
  protected void callSave(Liste entity) {
    super.callSave(entity);
    wahlvorschlagReihenfolgeBestaetigenEvent.sendWahlvorschlagReihenfolgeBestaetigenEvent(entity.getPk());
  }

  @Redirect
  @Override
  public String cancel() {
    // HINT: springt sonst vereinzelt zu falschen Views, insb. zum ListenkandidaturEwoSelectionView
    return PARENT_VIEW_ID;
  }
}
