package de.ivu.elect.wes.exchange.stimmzettel;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import javax.inject.Inject;

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.stimmzettel.control.WesStimmzettelImportExchange;
import de.ivu.elect.business.stimmzettel.entity.WesStimmzettelDaten;
import de.ivu.elect.business.stimmzettel.entity.WesStimmzettelImportContext;
import de.ivu.elect.core.exchange.mapper.StimmzettelMapper;
import de.ivu.elect.interfaces.wes.Stimmzettelerfassung;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.jee.exchange.XmlMarshaller;

public class WesStimmzettelXmlImportMapper implements WesStimmzettelImportMapper {

  @Inject
  private transient XmlMarshaller<Stimmzettelerfassung> xmlMarshaller;

  @Inject
  private transient StimmzettelMapper stimmzettelMapper;

  @Override
  public WesStimmzettelDaten deserialize(InputStream is, WesStimmzettelImportContext context, FileKonfiguration fileKonfiguration) throws MappingException {

    try (ZipInputStream zis = new ZipInputStream(is)) {
      zis.getNextEntry(); // nur ein Entry
      Stimmzettelerfassung stimmzettelerfassung = xmlMarshaller.deserialize(Stimmzettelerfassung.class, zis);
      List<WesStimmzettelDaten> mapped = stimmzettelMapper.mappe(stimmzettelerfassung, context.getSignieraturFct());
      return mapped.get(0); // TODO geht bis jetzt vom good-case aus
    } catch (Exception e) {
      throw new MappingException(e.getMessage(), e);
    }

  }

  @Override
  public Violations validateInputFormat(InputStream is, WesStimmzettelImportContext context, FileKonfiguration fileKonfiguration) {
    Violations violations = new Violations();
    try {
      WesStimmzettelDaten wesStimmzettelDaten = deserialize(is, context, fileKonfiguration);
      if (!Boolean.TRUE.equals(wesStimmzettelDaten.getSignaturGueltig())) {
        violations.addWarning("wes.stimmzettel.daten.signatur.ungueltig");
      }
    } catch (Exception e) {
      violations.addError("WesStimmzettelXmlImportMapper.fehler.beim.deserialisieren", e.getMessage());
    }
    return violations;

  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(WesStimmzettelImportExchange.DEFAULT_FORMAT_NAME, FileType.ZIP);
  }

  @Override
  public boolean isAcceptContext(WesStimmzettelImportContext context) {
    return context.getSignieraturFct() != null;
  }
}
