
package de.ivu.elect.presentation.wahlvorschlag;

import java.util.Collection;
import java.util.Date;

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

import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahlvorschlag.boundary.CoreListeBoundaryCreate;
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.wahl.CurrentWahlZulassungspruefungExtended;
import de.ivu.elect.presentation.wahlvorschlag.form.ListeViewFormBuilder;
import de.ivu.elect.presentation.wahlvorschlag.form.WahlvorschlagsdokumenteViewFormBuilder;

@OnlineHilfeId("258")
@Named(AbstractListeCreateNoScopeView.COMPONENT_NAME)
public class ListeCreateView extends AbstractListeCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient CoreListeBoundaryCreate coreListeBoundaryCreate;

  @Inject
  protected GruppeImGebietFactory gruppeImGebietFactory;

  @Inject
  protected transient ListeViewFormBuilder listeViewFormBuilder;

  @Inject
  protected transient WahlvorschlagsdokumentFactory wahlvorschlagsdokumentFactory;

  @Inject
  protected transient WahlvorschlagsdokumenteViewFormBuilder wahlvorschlagsdokumenteViewFormBuilder;

  @Inject
  protected transient CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  @Inject
  @View
  protected transient WahlvorschlagEmpfangsquittungDokumentErzeugenView wahlvorschlagEmpfangsquittungDokumentErzeugenView;

  @Inject
  private transient WahlvorschlagReihenfolgeBestaetigenEvent wahlvorschlagReihenfolgeBestaetigenEvent;

  private Collection<Wahlvorschlagsdokument> wahlvorschlagsdokumente;

  public ListeCreateView() {
    super();
  }

  @PreConditionCheck
  public String checkPreCondition() {
    if (isListengebietSelected()) {
      if (!listeViewFormBuilder.hasSupportedPolitischeGruppen(getEntity(), getSelectedGebiet())) {
        addWarningMessage("liste.create.keine.gruppe.message", getGebietName());
      }

      return null;
    }

    return cancel();
  }

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

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

  private void initWahlvorschlagsdokumente() {
    this.wahlvorschlagsdokumente = wahlvorschlagsdokumentFactory.createAllWahlvorschlagsdokumenteForEntity(getEntity());
  }

  private Collection<Wahlvorschlagsdokument> getWahlvorschlagsdokumente() {
    return wahlvorschlagsdokumente;
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();

    initListe();
    initWahlvorschlagsdokumente();
  }

  private void initListe() {
    Liste liste = getEntity();

    liste.setGruppeImGebiet(createGruppeImGebiet());
    liste.setZeitpunktDerEinreichung(new Date());
    liste.setWahlvorschlagStatus(currentWahlZulassungspruefung.getZulassungWahlvorschlagStatusInitial());
  }

  private GruppeImGebiet createGruppeImGebiet() {
    GruppeImGebiet gruppeImGebiet = gruppeImGebietFactory.create();
    gruppeImGebiet.setGebiet(getSelectedGebiet());

    return gruppeImGebiet;
  }

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

    listeViewFormBuilder.addProperties(formBuilder, liste, readonly);

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

  @Override
  protected void callSave(Liste liste) {
    coreListeBoundaryCreate.saveAndCreateWahlvorschlagsdokument(liste, getWahlvorschlagsdokumente());
    wahlvorschlagReihenfolgeBestaetigenEvent.sendWahlvorschlagReihenfolgeBestaetigenEvent(liste.getPk());
  }

  @Redirect
  @UseCaseSecure(UseCasePermission.LISTE_CREATE)
  public String saveAndEmpfangsquittungDokumentErzeugen() {
    save();

    return wahlvorschlagEmpfangsquittungDokumentErzeugenView.init(getEntity());
  }

  public boolean isSaveAndEmpfangsquittungDokumentErzeugenRendered() {
    return hasPermission(UseCasePermission.DOKUMENT_ERZEUGEN_WAHLVORSCHLAG_EMPFANGSQUITTUNG) && wahlvorschlagEmpfangsquittungDokumentErzeugenView.isDokumentErzeugungMoeglich();
  }
}
