
package de.ivu.elect.exchange.datei.mapper;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.inject.Inject;

import org.apache.commons.io.IOUtils;

import de.ivu.elect.business.datei.entity.BinaryUnit;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.exchange.control.ImportExportStreamCreator;
import de.ivu.elect.business.exchange.entity.DateiImportArt;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;

public class DateiMapper {

  private static final int BUFFER_SIZE_IN_BYTES = BinaryUnit.bytesOf(100, BinaryUnit.KILOBYTE);

  @Inject
  private transient ImportExportStreamCreator importExportStreamCreator;

  public DateiMapper() {
    super();
  }

  public DateiImport intern(de.ivu.elect.interfaces.core.Datei dateiExtern) {
    DateiImport dateiImportIntern = new DateiImport(EmptyCustomData.INSTANCE);

    Datei dateiIntern = new Datei();
    dateiImportIntern.setDatei(dateiIntern);
    dateiImportIntern.setDateiArt(DateiImportArt.valueOf(dateiExtern.getDateiImportArtAsString()));
    dateiIntern.setDateiname(dateiExtern.getDateiname());
    dateiIntern.setFileType(FileType.valueOf(dateiExtern.getFileTypeAsString()));
    dateiIntern.setFormat(dateiExtern.getFormat());
    dateiIntern.setMimeType(dateiExtern.getMimeType());
    dateiIntern.setOriginalDateiname(dateiExtern.getOriginalDateiname());
    dateiIntern.setNichtPersistenterInhalt(dateiExtern.getContent());

    return dateiImportIntern;
  }

  public de.ivu.elect.interfaces.core.Datei extern(DateiImport dateiImportIntern) throws IOException {
    Datei dateiIntern = dateiImportIntern.getDatei();

    de.ivu.elect.interfaces.core.Datei dateiExtern = new de.ivu.elect.interfaces.core.Datei();
    dateiExtern.setDateiImportArtAsString(dateiImportIntern.getDateiArt().name());
    dateiExtern.setDateiname(dateiIntern.getDateiname());
    dateiExtern.setFileTypeAsString(dateiIntern.getFileType().name());
    dateiExtern.setFormat(dateiIntern.getFormat());
    dateiExtern.setMimeType(dateiIntern.getMimeType());
    dateiExtern.setOriginalDateiname(dateiIntern.getOriginalDateiname());

    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(BUFFER_SIZE_IN_BYTES)) {
      try (InputStream is = dateiIntern.createInputStream(importExportStreamCreator)) {
        IOUtils.copy(is, bos);
      }

      bos.flush();

      dateiExtern.setContent(bos.toByteArray());
    }

    return dateiExtern;
  }
}
