
package de.ivu.elect.presentation.ergebnis.exchange;

import javax.annotation.PostConstruct;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSelectChangeEvent;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.control.PruefkennzeichenAutomatischGenerierenEvent;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.dokumente.exchange.AbstractDokumentBulkExportSearchView;
import de.ivu.elect.presentation.ergebnis.ErgebnisStatusInfo;
import de.ivu.elect.presentation.ergebnis.ViewHavingErgebnisStatusInfo;
import de.ivu.elect.presentation.ergebnis.WasErgebnisStatusInfo;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@ViewAccessScoped
@Named(ErgebnisdokumentBulkExportSearchView.COMPONENT_NAME)
@View(viewId = ErgebnisdokumentBulkExportSearchView.VIEW_ID, useCase = UseCasePermission.DOKUMENT_ERZEUGEN_BULK_EXPORT_ERGEBNISDOKUMENTE)
@OnlineHilfeId("754")
public class ErgebnisdokumentBulkExportSearchView extends AbstractDokumentBulkExportSearchView<ErgebnisdokumentBulkExportSubViewFactory> implements ViewHavingErgebnisStatusInfo {

  private static final Logger LOG = LoggerFactory.getLogger(ErgebnisdokumentBulkExportSearchView.class);

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "ergebnisdokumentBulkExportSearchView";

  public static final String VIEW_ID = "/ergebnis/ergebnisdokument-bulk-export-search.xhtml";

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient ErgebnisdokumentBulkExportSubViewFactory ergebnisdokumentBulkExportSubViewFactory;

  @Inject
  private transient PruefkennzeichenAutomatischGenerierenEvent pruefkennzeichenAutomatischGenerierenEvent;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  public ErgebnisdokumentBulkExportSearchView() {
    super();
  }

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

    try {
      pruefkennzeichenAutomatischGenerierenEvent.sendEvent(getSelectedWahl());
    } catch (Exception e) {
      LOG.warn("Fehler beim Versanden des Events");
    }
  }

  @Override
  public void onSearchResultLoaded() {
    if (!isErgebnisSelected() || !getSelectedErgebnis().getErgebnisStatus().isBerechnet()) {
      addWarningMessage("ergebnisdokument.bulk.export.search.message.ergebnis.nicht.berechnet");
    }

    super.onSearchResultLoaded();
  }

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

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

  @Override
  protected ErgebnisdokumentBulkExportSubViewFactory getDokumentBulkExportSubViewFactory() {
    return ergebnisdokumentBulkExportSubViewFactory;
  }

  @Override
  public ErgebnisStatusInfo getErgebnisStatusInfo() {
    return new WasErgebnisStatusInfo(getMessages(), getSelectedWahl(), ergebniseingangKonfiguration, getSelectedErgebnis());
  }

  private boolean isErgebnisSelected() {
    return ergebnisSessionSelect.isSelected();
  }

  private Ergebnis getSelectedErgebnis() {
    return ergebnisSessionSelect.getEntity();
  }

  public void onErgebnisSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) ErgebnisSelectChangeEvent event) {
    reset();
  }
}
