
package de.ivu.elect.presentation.kandidatur;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.boundary.EinzelbewerberBoundaryCreate;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeFactory;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.presentation.kandidatur.form.EinzelbewerberKandidaturViewFormBuilder;

public class EinzelbewerberListenkandidaturCreateViewHelper extends AbstractListenkandidaturCreateViewHelper {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient ListeFactory listeFactory;

  @Inject
  protected transient EinzelbewerberBoundaryCreate einzelbewerberBoundaryCreate;

  @Inject
  protected transient EinzelbewerberKandidaturViewFormBuilder einzelbewerberKandidaturViewFormBuilder;

  public EinzelbewerberListenkandidaturCreateViewHelper() {
    super();
  }

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

    return cancel();
  }

  private boolean isListenwahlgebietSelected() {
    return isGebietSelected() && getSelectedGebiet().isListenwahlgebiet();
  }

  @Override
  public String getViewId() {
    return EinzelbewerberListenkandidaturCreateView.VIEW_ID;
  }

  @Override
  public String getParentViewId() {
    return EinzelbewerberListenkandidaturCreateView.PARENT_VIEW_ID;
  }

  @Override
  protected EinzelbewerberKandidaturViewFormBuilder getViewFormBuilder() {
    return einzelbewerberKandidaturViewFormBuilder;
  }

  public void init(Gebiet gebiet, Listenkandidatur einzelkandidatur) {
    Liste liste = createListe();

    kandidaturCreateViewHelper.initWahlvorschlag(gebiet, liste);
    liste.getGruppeImGebiet().setGruppe(createEinzelbewerberGruppe(gebiet.getWahl()));

    super.init(liste, 1L, einzelkandidatur);
  }

  @Override
  public String getEntityEinzahlMessage() {
    return getViewFormBuilder().getEntityEinzahlMessage(getSelectedGebiet());
  }

  private PolitischeGruppe createEinzelbewerberGruppe(Wahl wahl) {
    return einzelbewerberBoundaryCreate.createGruppe(wahl);
  }

  private Liste createListe() {
    return listeFactory.create();
  }
}
