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

import static de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO.fromDao;
import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import java.util.Collection;

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

import de.ivu.elect.business.ergebnis.boundary.ErgebnisExporter;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.control.ErgebnisExchangeContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.View;
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.exchange.AbstractExportSearchView;
import de.ivu.elect.presentation.exchange.ExportDescription;

@Named(ErgebnisExportView.COMPONENT_NAME)
@View(viewId = ErgebnisExportView.VIEW_ID, useCase = UseCasePermission.ERGEBNIS_EXPORTIEREN)
public class ErgebnisExportView extends AbstractExportSearchView<ErgebnisExportObject, ErgebnisExportContext> implements ViewHavingErgebnisStatusInfo {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "ergebnisExportView";

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

  public static final String GEBIET_SELECTED_PARAMETER_NAME = "Wahldurchfuehrungsgebiet";

  @Inject
  private transient ErgebnisExporter exporter;

  @Inject
  private transient ErgebnisExportDescription exportDescription;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  private transient ErgebnisExportFormBuilder ergebnisExportFormBuilder;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  public ErgebnisExportView() {
    super();
  }

  public String checkWurzelgebietAbgeschlossen() {
    Gebiet wurzelgebiet = getSelectedWahl().getWurzelgebiet(fromDao(gebietExtendedDAO));
    Ergebnis ergebnis = getSelectedErgebnis();

    if (wurzelgebiet != null && ergebnis != null && !wahldurchfuehrungsgebietExtendedDAO.findByPrimaryKey(wurzelgebiet.getPk()).getErgebniseingabestatus(ergebnis).isExportVonDokumentenMoeglich()) {
      addWarningMessage("ergebnis.export.oberstes.nicht.abgeschlossen");
    }

    return null;
  }

  @Override
  protected AbstractExporter<ErgebnisExportObject, ErgebnisExportContext> getExporter() {
    return exporter;
  }

  private transient ErgebnisExportContext context;

  @Override
  protected ErgebnisExportContext getContext() {
    return createContext(new ErgebnisExchangeContext(getSelectedWahl(), getSelectedGebiet(), ErgebnisExchangeContext.KANDIDATUR_FORMAT_DARSTELLUNG_NOT_CONFIGURED), getSelectedErgebnis());
  }

  public ErgebnisExportContext createContext(ErgebnisExchangeContext ergebnisExchangeContext, Ergebnis ergebnis) {
    if (context == null) {
      context = new ErgebnisExportContext(ergebnis);
    }

    Collection<Gebiet> auswertungsgebiete = ergebnisExchangeContext.getAuswertungsgebiete(gebietExtendedDAO);

    if (auswertungsgebiete.size() == 1) {
      getCustomParameterMap().put(GEBIET_SELECTED_PARAMETER_NAME, castTo(auswertungsgebiete.iterator().next(), Wahldurchfuehrungsgebiet.class));
    }

    context.putAll(getCustomParameterMap());

    return context;
  }

  public void preRenderView() {
    // TODO Ggf. Hinweise, zum Status der Gebiete, etc. ...
  }

  @Override
  protected boolean isExportParameterModelDynamic() {
    return true;
  }

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

  @Override
  public boolean isExportParameterModelPresent() {
    return super.isExportParameterModelPresent() || ergebnisExportFormBuilder.isExportParameterModelPresent();
  }

  @Override
  protected void addProperties(FormBuilder formBuilder) {
    ergebnisExportFormBuilder.addProperties(formBuilder, getCustomParameterMap());
  }

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

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

  @Override
  protected void reset() { //ELECT-10592 Context zuruecksetzen, wenn die Wahl gewechselt wird
    super.reset();
    context = null;
  }
}
