
package de.ivu.elect.business.dokumente.control;

import java.io.OutputStream;

import javax.inject.Inject;

import de.ivu.elect.business.datei.control.FileExchange;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.datei.entity.DateiFileNames;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.datei.entity.ServerFileType;
import de.ivu.elect.business.dokumente.entity.DokumentFileNames;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.ImportExportStreamCreator;
import de.ivu.elect.business.exchange.entity.DateiExportArt;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.exception.ElectCommonException;

public abstract class AbstractDokumentMerger implements DokumentMerger {

  public static final DateiExportArt DATEI_EXPORT_ART = DokumentFileNames.DATEI_EXPORT_ART;

  public static final String FILE_FORMAT_NAME = "dokument.generator.file.format";

  @Inject
  private transient FileExchange fileExchange;

  @Inject
  private transient ImportExportStreamCreator importExportStreamCreator;

  protected AbstractDokumentMerger() {
    super();
  }

  protected FileFormat createFileFormat(FileType zieldateiTyp) {
    return new FileFormat(FILE_FORMAT_NAME, zieldateiTyp);
  }

  protected DateiExport createDateiExport(Wahl wahl, Wahltermin wahltermin, FileType zieldateiTyp, DateiFileNames dateiFileNames) {
    return fileExchange.createAndPersistDateiExport(DATEI_EXPORT_ART, createFileFormat(zieldateiTyp), dateiFileNames, bestimmeMandant(wahl, wahltermin), wahl, wahltermin,
        ServerFileType.GENERIERTES_DOKUMENT);
  }

  private Mandant bestimmeMandant(Wahl wahl, Wahltermin wahltermin) {
    // Wahl oder Wahltermin muss bei Dokumenten gesetzt sein...
    if (wahl != null) {
      return wahl.getMandant();
    }

    return wahltermin.getMandant();
  }

  protected OutputStream createOutputStreamAndDateiExport(DateiExport dateiExport) {
    return dateiExport.getDatei().createOutputStream(importExportStreamCreator);
  }

  protected void checkCanceled(ProgressMonitor monitor) {
    if (monitor.isCanceled()) {
      throw new ElectCommonException("dokument.generator.canceled");
    }
  }
}
