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

import java.io.OutputStream;
import java.util.List;

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

import de.ivu.elect.business.datei.entity.FileType;
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.gebietsbaum.entity.GebietGeometrieExportContext;
import de.ivu.elect.business.gebietsbaum.entity.GebietPolygonPoint;
import de.ivu.elect.exchange.gebietsbaum.mapper.GebietPolygonMapperUtil;
import de.ivu.elect.jee.exchange.XmlMarshaller;
import de.ivu.elect.interfaces.gebietgeometrie.GebietGeometrie;

public class DefaultGebietGeometrieExportMapper implements GebietGeometrieExportMapper {

  public static final String GEBIET_GEOMETRIE_IMPORT_FILE_FORMAT = "gebiet.geometrie.import.file.format";

  @Inject
  protected XmlMarshaller<GebietGeometrie> xmlMarshaller;

  @Inject
  GebietPolygonMapperUtil gebietPolygonMapperUtil;

  @Override
  public void serialize(List<GebietPolygonPoint> gebietPolygonPoints, OutputStream os, GebietGeometrieExportContext gebietGeometrieExportContext, FileKonfiguration fileKonfiguration) throws MappingException {

    GebietGeometrie gebietGeometrie = new GebietGeometrie();

    for (GebietPolygonPoint gebietPolygonPoint : gebietPolygonPoints) {
      gebietGeometrie.getGebietPolygonPoints().add(gebietPolygonMapperUtil.mappe(gebietPolygonPoint));
    }
    try {
      xmlMarshaller.serialize(gebietGeometrie, os);
    } catch (JAXBException e) {
      throw new MappingException(e.getMessage(), e);
    }
  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(DefaultGebietGeometrieImportMapper.GEBIET_GEOMETRIE_IMPORT_FILE_FORMAT, FileType.XML);
  }

  @Override
  public boolean isAcceptContext(GebietGeometrieExportContext gebietGeometrieExportContext) {
    return gebietGeometrieExportContext.getWahl() != null || gebietGeometrieExportContext.getWahltermin() != null;
  }
}
