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

import java.util.function.Predicate;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.boundary.WahlvorschlagExporter;
import de.ivu.elect.business.kandidatur.control.WahlvorschlagExportContext;
import de.ivu.elect.business.kandidatur.entity.WahlvorschlagExportObject;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.exchange.AbstractExportSearchView;
import de.ivu.elect.presentation.exchange.ExportDescription;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId("444")
@Named(WahlvorschlagExportView.COMPONENT_NAME)
@View(viewId = WahlvorschlagExportView.VIEW_ID, useCase = UseCasePermission.WAHLVORSCHLAG_EXPORTIEREN)
public class WahlvorschlagExportView extends AbstractExportSearchView<WahlvorschlagExportObject, WahlvorschlagExportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlvorschlagExportView";

  public static final String VIEW_ID = "/wahlvorschlag/wahlvorschlag-export.xhtml";

  @Inject
  private transient WahlvorschlagExporter wahlvorschlagExporter;

  @Inject
  private transient WahlvorschlagExportDescription wahlvorschlagExportDescription;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  private WahlvorschlagExportContext wahlvorschlagExportContext;

  private FileFormat previousFileFormat;

  public WahlvorschlagExportView() {
    super();
  }

  @Override
  public AdvancedDynaFormModel getExportParameterModel() {
    if (previousFileFormat == null || !previousFileFormat.equals(getSelectedFileFormat())) {
      resetExportParameterModel();

      previousFileFormat = getSelectedFileFormat();
    }

    return super.getExportParameterModel();
  }

  @Override
  public ExportDescription getExportDescription() {
    return wahlvorschlagExportDescription;
  }

  @Override
  protected AbstractExporter<WahlvorschlagExportObject, WahlvorschlagExportContext> getExporter() {
    return wahlvorschlagExporter;
  }

  @Override
  protected WahlvorschlagExportContext getContext() {
    if (wahlvorschlagExportContext == null) {
      wahlvorschlagExportContext = createContext(getSelectedWahl());
      wahlvorschlagExportContext.setGebietFilter(getGebietFilter());
    }

    return wahlvorschlagExportContext;
  }

  protected Predicate<Gebiet> getGebietFilter() {
    return g -> true;
  }

  protected WahlvorschlagExportContext createContext(Wahl wahl) {
    return new WahlvorschlagExportContext(wahl);
  }

  @Override
  protected void reset() {
    super.reset();
  }
}
