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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.annotation.Nonnull;
import javax.inject.Inject;

import org.apache.commons.io.IOUtils;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.ergebnis.control.StimmeingabeErgebnisuebernahmeStimmenEntferntLogFile;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;

/**
 * ELECTMUC-1116
 */
public class StimmeingabeErgebnisuebernahmeStimmenEntferntLogFileExportMapper implements ErgebnisExportMapper {

  public static final String FORMAT_NAME = "file.format.muc.ergebnisdatei.wegfall.passives.wahlrecht";

  @Inject
  private transient StimmeingabeErgebnisuebernahmeStimmenEntferntLogFile stimmeingabeErgebnisuebernahmeStimmenEntferntLogFile;

  public StimmeingabeErgebnisuebernahmeStimmenEntferntLogFileExportMapper() {
    super();
  }

  @Override
  public boolean isAcceptContext(ErgebnisExportContext context) {
    return context.hasErgebnis() && isDateiVorhanden();
  }

  private boolean isDateiVorhanden() {
    File logFile = getLogFile();

    return logFile.exists() && logFile.isFile();
  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(FORMAT_NAME, FileType.CSV);
  }

  @Override
  public void serialize(ErgebnisExportObject exportObject, OutputStream os, ErgebnisExportContext context, FileKonfiguration fileKonfiguration) throws MappingException {
    try (InputStream is = new FileInputStream(getLogFile())) {
      IOUtils.copy(is, os);
    } catch (IOException e) {
      throw new MappingException(e.getMessage(), e);
    }
  }

  @Nonnull
  private File getLogFile() {
    return new File(stimmeingabeErgebnisuebernahmeStimmenEntferntLogFile.getFilePathName(false));
  }
}
