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

import java.util.ArrayList;
import java.util.List;

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

import org.apache.deltaspike.core.api.scope.ConversationGroup;

import de.ivu.elect.business.dokumente.boundary.DokumentBulkExportSearchParameters;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.search.control.AbstractElectSearchParameters;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahl.boundary.WahlterminSelectChangeEvent;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
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.AbstractElectSearchView;
import de.ivu.elect.presentation.dokumente.table.DokumentBulkExportSearchEntryColumnBuilder;
import de.ivu.elect.presentation.exchange.ExportViewConfirmDialog;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

public abstract class AbstractDokumentBulkExportSearchView<T extends AbstractDokumentBulkExportSubViewFactory> extends AbstractElectSearchView<DokumentBulkExportSearchEntry> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient DokumentBulkExport dokumentBulkExport;

  @Inject
  @ConversationGroup(DokumentBulkExportSearchParameters.class)
  private transient DokumentBulkExportSearchParameters dokumentBulkExportSearchParameters;

  @Inject
  private transient DokumentBulkExportSearchEntryColumnBuilder dokumentBulkExportSearchEntryColumnBuilder;

  public AbstractDokumentBulkExportSearchView() {
    super();
  }

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

    dokumentBulkExport.reset();
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {
    // Dokument werden immer für eine Wahl oder einen Wahltermin erzeugt...
    if (isWahlSelected() || isWahlterminSelected()) {
      return null;
    }

    return getStartViewId();
  }

  @Override
  protected AbstractGebietSecurityFilter<DokumentBulkExportSearchEntry> getGebietSecurityFilter() {
    return KEIN_GEBIET_SECURITY_FILTER;
  }

  @Override
  public void presetSearchParameters() {
    // Do nothing...
  }

  @Override
  public AbstractElectSearchParameters getSearchParameters() {
    return dokumentBulkExportSearchParameters;
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    // Do nothing...
  }

  @Override
  protected List<DokumentBulkExportSearchEntry> performSearch() {
    List<DokumentBulkExportSearchEntry> result = new ArrayList<>();

    for (AbstractDokumentBulkExportSubView< ? , ? , ? > dokumentBulkExportSubView : getDokumentBulkExportSubViewFactory().collectDokumentBulkExportSubViews(getPrincipal())) {
      result.addAll(dokumentBulkExportSubView.collectDokumentBulkExportSearchEntries());
    }

    // result.sort(new DokumentBulkExportSearchEntryComparator()); // Vorgegebene Reihenfolge beibehalten...

    EagerLoadingCollector<DokumentBulkExportSearchEntry> eagerLoadingCollector = EagerLoadingCollector.create();
    dokumentBulkExportSearchEntryColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector.eagerLoad(result);
  }

  protected abstract T getDokumentBulkExportSubViewFactory();

  public ExportViewConfirmDialog getExportDokumentDialog() {
    DokumentBulkExportSearchEntry dokumentBulkExportSearchEntry = dokumentBulkExport.getSelectedDokument();

    if (dokumentBulkExportSearchEntry != null && dokumentBulkExportSearchEntry.isExportConfirmed()) {
      return new ExportViewConfirmDialog(getMessage("entity.document.export.page.header", dokumentBulkExportSearchEntry.getDokumentBezeichnung()),
          dokumentBulkExportSearchEntry.getDokumentBulkExportBeschreibung(), dokumentBulkExportSearchEntry.getDokumentBulkExportModel());
    }

    return ExportViewConfirmDialog.UNSUPPORTED;
  }

  @Redirect
  public String exportDokumentConfirmed() {
    dokumentBulkExport.exportDokument();

    return null;
  }

  @Redirect
  public String exportDokumentCanceled() {
    dokumentBulkExport.reset();

    return null;
  }

  public boolean isDokumentDownloadable() {
    return dokumentBulkExport.isDokumentDownloadable();
  }

  @Redirect
  public String downloadDokument() {
    dokumentBulkExport.downloadDokument();

    return null;
  }

  @Override
  @Redirect
  public String reset() {
    dokumentBulkExport.reset();

    return super.reset();
  }

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

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

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