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

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.stimmeingabe.control.StimmeingabePlausiKonfigurationImportContext;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.exchange.XmlImportMapper;
import de.ivu.elect.interfaces.core.plausikonfiguration.StimmeingabePlausiKonfigurationen;
import de.ivu.elect.interfaces.gebietgeometrie.GebietGeometrie;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.jee.exchange.XmlMarshaller;
import de.ivu.elect.jee.exchange.XmlSchemaLoader;

import javax.inject.Inject;
import javax.xml.bind.JAXBException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class StimmeingabePlausiKonfigurationXMLImportMapper implements StimmeingabePlausiKonfigurationImportMapper, XmlImportMapper {

  private static final String SCHEMA_RESOURCE_NAME = "elect-interfaces-plausi-konfiguration.xsd";

  @Inject
  private transient XmlMarshaller<StimmeingabePlausiKonfigurationen> xmlMarshaller;

  @Inject
  private transient XmlSchemaLoader schemaLoader;

  @Inject
  private transient StimmeingabePlausiKonfigurationMapper stimmeingabePlausiKonfigurationMapper;

  @Override
  public List<StimmeingabePlausiKonfiguration> deserialize(InputStream is, StimmeingabePlausiKonfigurationImportContext context, FileKonfiguration fileKonfiguration) throws MappingException {
    try {
      return mappe(xmlMarshaller.deserialize(StimmeingabePlausiKonfigurationen.class, is), context);
    } catch (JAXBException e) {
      throw new MappingException(e.getMessage(), e);
    }
  }

  private List<StimmeingabePlausiKonfiguration> mappe(StimmeingabePlausiKonfigurationen stimmeingabePlausiKonfigurationenExtern, StimmeingabePlausiKonfigurationImportContext context) {
    return stimmeingabePlausiKonfigurationMapper.mappe(stimmeingabePlausiKonfigurationenExtern, context.getWahl());
  }

  @Override
  public Violations validateInputFormat(InputStream is, StimmeingabePlausiKonfigurationImportContext context, FileKonfiguration fileKonfiguration) {
    return validateXml(is, xmlMarshaller, schemaLoader, SCHEMA_RESOURCE_NAME, StimmeingabePlausiKonfigurationen.class);
  }

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

  @Override
  public boolean isAcceptContext(StimmeingabePlausiKonfigurationImportContext context) {
    return true;
  }
}
