package de.ivu.elect.presentation.exchange;

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

import de.ivu.elect.business.datei.boundary.CsvDateiConversationSelect;
import de.ivu.elect.business.datei.boundary.DateiConversationSelect;
import de.ivu.elect.business.datei.boundary.DateiExportConversationSelect;
import de.ivu.elect.business.datei.boundary.DateiImportConversationSelect;
import de.ivu.elect.business.datei.entity.CsvDatei;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.jee.entity.Meta;

// NOTE ELECT-2793 und ELECT-2476, dass in den Ex/Import-Views, über die iteriert wird, um die Dateiformate zu
// bestimmen, deren @PostConstruct-Methoden aufgrufen werden. In diesen Methoden wird aber bspw. ExportDescriptionSelect
// initialisiert, also überschrieben, so dass vor Beginn der Iteration der ursprüngliche Wert gesichert werden muss,
// um ihn anschließend wieder herzustellen.
@RequestScoped
public class ImportExportSelectState implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient DateiConversationSelect dateiConversationSelect;

  @Inject
  private transient CsvDateiConversationSelect csvDateiConversationSelect;

  @Inject
  private transient DateiVorschauContextSelect dateiVorschauContextSelect;

  @Inject
  private transient ExportDescriptionSelect exportDescriptionSelect;

  @Inject
  private transient ImportDescriptionSelect importDescriptionSelect;

  @Inject
  private transient DateiExportConversationSelect dateiExportConversationSelect;

  @Inject
  private transient DateiImportConversationSelect dateiImportConversationSelect;

  @Inject
  private transient DateiImportBerichtLastViewConversationSelect dateiImportBerichtLastViewConversationSelect;

  @Inject
  private transient DateiImportMetaForEntityConversationSelect dateiImportMetaForEntityConversationSelect;

  private Datei datei;

  private CsvDatei csvDatei;

  private String dateiVorschauLastViewId;

  private String dateiVorschauPageMenuComponentName;

  private ExportDescription exportDescription;

  private ImportDescription importDescription;

  private DateiExport dateiExport;

  private DateiImport dateiImport;

  private String dateiImportLastViewId;

  private Meta dateiImportMetaForEntity;

  public void save() {
    datei = dateiConversationSelect.getEntity();

    csvDatei = csvDateiConversationSelect.getEntity();

    dateiVorschauLastViewId = dateiVorschauContextSelect.getLastViewId();
    dateiVorschauPageMenuComponentName = dateiVorschauContextSelect.getPageMenuComponentName();

    exportDescription = exportDescriptionSelect.getExportDescription();
    importDescription = importDescriptionSelect.getImportDescription();

    dateiExport = dateiExportConversationSelect.getEntity();

    dateiImport = dateiImportConversationSelect.getEntity();
    dateiImportLastViewId = dateiImportBerichtLastViewConversationSelect.getLastViewId();
    dateiImportMetaForEntity = dateiImportMetaForEntityConversationSelect.getMetaForEntity();
  }

  public void restore() {
    if (datei != null) {
      dateiConversationSelect.setEntity(datei);
    }

    if (csvDatei != null) {
      csvDateiConversationSelect.setEntity(csvDatei);
    }

    dateiVorschauContextSelect.setLastViewId(dateiVorschauLastViewId);
    dateiVorschauContextSelect.setPageMenuComponentName(dateiVorschauPageMenuComponentName);

    exportDescriptionSelect.setExportDescription(exportDescription);
    importDescriptionSelect.setImportDescription(importDescription);

    if (dateiExport != null) {
      dateiExportConversationSelect.setEntity(dateiExport);
    }

    if (dateiImport != null) {
      dateiImportConversationSelect.setEntity(dateiImport);
    }

    dateiImportBerichtLastViewConversationSelect.setLastViewId(dateiImportLastViewId);
    dateiImportMetaForEntityConversationSelect.setMetaForEntity(dateiImportMetaForEntity);
  }
}