
package de.ivu.elect.presentation.wahlbeteiligung;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.charts.PieChartModelBuilder;
import de.ivu.elect.presentation.AbstractElectStatusuebersichtView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.gebietsbaum.tree.AbstractNoStoreGebietsbaumView;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.stimmeingabe.StimmeingabeErfassenViewResolver;
import de.ivu.elect.presentation.wahlbeteiligung.status.WahlbeteiligungStatusEntry;

@OnlineHilfeId("721")
@RequestScoped
@Named(WahlbeteiligungAuswertungStatusuebersichtView.COMPONENT_NAME)
@View(viewId = WahlbeteiligungAuswertungStatusuebersichtView.VIEW_ID, useCase = UseCasePermission.GEBIET_WAHLBETEILIGUNG_EDIT)
public class WahlbeteiligungAuswertungStatusuebersichtView
    extends
      AbstractElectStatusuebersichtView<WahlbeteiligungAuswertung> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlbeteiligungAuswertungStatusuebersichtView";

  public static final String VIEW_ID = "/wahlbeteiligung/wahlbeteiligung-auswertung-statusuebersicht.xhtml";

  public static final int ENTRIES_SCHRITTWEISE_LADEN_SCHRITTGROESSE = 200;

  @Inject
  private transient AbstractNoStoreGebietsbaumView gebietsbaumView;

  @Inject
  private transient StimmeingabeErfassenViewResolver stimmeingabeErfassenViewResolver;

  @Inject
  private GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect wahldurchfuehrungsgebietSelect;

  @Inject
  private transient WahlbeteiligungAuswertungStatusuebersichtViewHelper wahlbeteiligungAuswertungStatusuebersichtViewHelper;

  public WahlbeteiligungAuswertungStatusuebersichtView() {
    super();
  }

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!isWahlterminSelected() && !isWahlSelected()) {
      return getStartViewId();
    }

    if (stimmeingabeErfassenViewResolver.isErfassungsgebietSelected()) {
      return stimmeingabeErfassenViewResolver.getWahlbeteiligungErfassenViewId();
    }

    return null;
  }

  public String getPageHeader() {
    return getMessage("wahlbeteiligung.auswertung.statuseubersicht.page.header",
        gebietNummerFormatter.getNameMitNummer(getSelectedGebiet()));
  }

  @Override
  protected void fillStatusPieChartModel(PieChartModelBuilder modelBuilder) {
    // Nichts zu tun hier.
  }

  @Override
  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    reset();

    Gebiet neueEntity = event.getNeueEntity();

    if (neueEntity != null) { // ELECTDD-404 Abmeldung
      // Wenn Erfassungsgebiet => alles neu laden
      String targetViewId = stimmeingabeErfassenViewResolver.getWahlbeteiligungErfassenViewId();

      if (!VIEW_ID.equals(targetViewId)) {
        gebietsbaumView.reset();

        FacesContextUtil.redirectToView(targetViewId);
      }
    }
  }

  @Override
  protected void resetModel() {
    super.resetModel();

    wahlbeteiligungAuswertungStatusuebersichtViewHelper.resetCharts();
  }

  @UseCaseSecure(UseCasePermission.GEBIET_WAHLBETEILIGUNG_EDIT)
  public String redirectTo(WahlbeteiligungStatusEntry wahlbeteiligungStatusEntry) {
    Gebiet gebiet = wahlbeteiligungStatusEntry.getWahldurchfuehrungsgebiet();

    if (gebiet != null) {
      wahldurchfuehrungsgebietSelect.setEntity(gebiet);
    }

    return null;
  }
}
