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

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Date;

import javax.ejb.Stateless;
import javax.inject.Inject;

import org.apache.commons.io.IOUtils;
import org.primefaces.model.UploadedFile;

import de.ivu.elect.business.datei.boundary.DateiImportEdit;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageAnlageArt;
import de.ivu.elect.business.exchange.control.ImportExportStreamCreator;

@Stateless
public class DokumentVorlageEdit extends AbstractDokumentVorlageEdit {

  @Inject
  private transient ImportExportStreamCreator importExportStreamCreator;

  @Inject
  private transient DateiImportEdit dateiImportEdit;

  public DokumentVorlageEdit() {
    super();
  }

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

  public void save(DokumentVorlage dokumentVorlage, UploadedFile uploadedFile) {
    if (uploadedFile != null) {
      Date now = new Date();

      DateiImport dateiImport = dokumentVorlage.getDateiImport();
      dateiImport.setImportiertAm(now);

      Datei datei = dateiImport.getDatei();
      datei.setOriginalDateiname(uploadedFile.getFileName());
      datei.setErstellungszeitpunkt(now);

      //   Ich mache es mir einfach und ersetze die vorhandene Datei auf dem Server... nicht ganz sauber, für den Fall,
      // dass was schief geht, aber was soll schon schiefgehen ;)
      File file = datei.createFile(importExportStreamCreator);

      try (InputStream is = uploadedFile.getInputstream(); FileOutputStream os = new FileOutputStream(file, false)) {
        IOUtils.copy(is, os);
      } catch (IOException ex) {
        throw new RuntimeException("Fehler beim Ersetzen der Datei: " + ex.getMessage(), ex);
      }

      dokumentVorlage.setAnlageArt(DokumentVorlageAnlageArt.EINZEL_DATEI);
    }

    if (dokumentVorlage.hasChangedDokumentVorlageArt() || dokumentVorlage.hasChangedName() || dokumentVorlage.hasChangedVersionsnummer()) {
      dokumentVorlage.setAnlageArt(DokumentVorlageAnlageArt.EINZEL_DATEI);
    }

    super.save(dokumentVorlage);
  }

  public void deleteAll(Collection<DokumentVorlage> dokumentVorlagen) {
    for (DokumentVorlage dokumentVorlage : dokumentVorlagen) {
      if (dokumentVorlage.isPersistent()) {
        delete(dokumentVorlage);
      }
    }
  }

  @Override
  public void delete(DokumentVorlage entity) {
    DokumentVorlage attachedEntity = getAttachedEntity(entity);
    DateiImport dateiImport = attachedEntity.getDateiImport();
    super.delete(entity);
    dateiImportEdit.delete(dateiImport);
  }
}
