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

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.inject.Inject;
import javax.xml.bind.JAXBException;

import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.konfiguration.entity.KonfigurationLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangExporter;
import de.ivu.elect.business.stimmeingabe.control.ErgebniseingangExportContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.interfaces.was.stimmeingabe.ErfassteStimmen;
import de.ivu.elect.interfaces.was.stimmeingabe.GeloeschterErgebniseingang;
import de.ivu.elect.jee.exchange.XmlMarshaller;

public class WasErgebniseingangXMLZIPExportMapper extends AbstractWasEingabeXMLExportMapper implements ErgebniseingangExportMapper {

  @Inject
  private transient XmlMarshaller<ErfassteStimmen> xmlMarshaller;

  @Inject
  private transient KonfigurationLoader konfigurationLoader;

  public WasErgebniseingangXMLZIPExportMapper() {
    super();
  }

  @Override
  public void serialize(Ergebniseingang ergebniseingang, OutputStream os, ErgebniseingangExportContext ergebniseingangExportContext, FileKonfiguration fileKonfiguration) throws MappingException {
    ErfassteStimmen erfassteStimmen = mappe(ergebniseingang);

    try {
      ZipOutputStream zos = new ZipOutputStream(os);
      ZipEntry zipEntry = new ZipEntry(ergebniseingang.getEingangssequenznummer() + ".xml");
      zos.putNextEntry(zipEntry);
      xmlMarshaller.serialize(erfassteStimmen, zos);
      zos.closeEntry();
      zos.finish();
    } catch (JAXBException e) {
      throw new MappingException(e.getMessage(), e);
    } catch (IOException e) {
      throw new RuntimeException(e.getMessage(), e);
    }
  }

  public ErfassteStimmen mappe(Ergebniseingang ergebniseingang) {
    ErfassteStimmen erfassteStimmen = new ErfassteStimmen();

    mappeWahl(erfassteStimmen, ergebniseingang);

    /**
     * Gelöschter Ergebniseingang, vergleiche
     *
     * @see de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeErfassungLoeschen
     */
    if (AbstractWasStimmeingabeXMLExportMapper.isGeloeschterEingang(ergebniseingang)) {
      erfassteStimmen.getGeloeschterErgebniseingaenge().add(mappeGeloescht(ergebniseingang, new WasStimmeingabeXMLExportMapperMaps(wahlInternExternMapperUtil)));
    } else {
      erfassteStimmen.getErgebniseingaenge().add(mappe(ergebniseingang, new WasStimmeingabeXMLExportMapperMaps(wahlInternExternMapperUtil)));
    }

    return erfassteStimmen;
  }

  @Override
  public FileFormat getFileFormat() {
    return ErgebniseingangExporter.FILE_FORMAT;
  }

  @Override
  public boolean isAcceptContext(ErgebniseingangExportContext ergebniseingangExportContext) {
    return ergebniseingangExportContext.getErgebniseingang() != null;
  }

  @Override
  public String getDateiname(Ergebniseingang ergebniseingang) {
    return ergebniseingang.getDateinameFuerSicherung();
  }

  @Override
  public String getExportDirectory(Ergebniseingang ergebniseingang) {
    String ablageverzeichnisKonfiguriert = konfigurationLoader.resolveRequiredStringValue(ergebniseingang.getMandant(), MandantKonfigurationWerte.STIMMEINGABE_ABLAGEVERZEICHNIS);
    String dir = ablageverzeichnisKonfiguriert + File.separator + ergebniseingang.getErgebniseingangsartPathMitWahlnameFilesystemKompatibel();

    new File(dir).mkdirs();
    return dir;
  }
}
