
package de.ivu.elect.business.dokumente.control;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Comparator;
import java.util.List;

import javax.annotation.Nullable;
import javax.inject.Inject;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.dokumente.boundary.DokumentVorlageDAO;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.exchange.control.ImportExportStreamCreator;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;

public class LayoutVorlageFinder implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(LayoutVorlageFinder.class);

  private static final int BUFFER_SIZE = 10 * 1014;

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  @Inject
  private transient ImportExportStreamCreator streamCreator;

  @Nullable
  public byte[] getVorlageContent(WahlOderWahltermin wahlOderWahltermin) {
    if (wahlOderWahltermin == null) {
      return null;
    }
    List<DokumentVorlage> layoutVorlagen;
    if (wahlOderWahltermin.isInstanceOfWahl()) {
      layoutVorlagen = dokumentVorlageDAO.findByWahlAndArtOrderByName(wahlOderWahltermin.getWahlIfWahl(), DokumentVorlageArt.LAYOUT);
    } else {
      layoutVorlagen = dokumentVorlageDAO.findByWahlterminAndArtOrderByName(wahlOderWahltermin.getWahlterminIfWahltermin(), DokumentVorlageArt.LAYOUT);
    }

    if (layoutVorlagen.isEmpty()) {
      return null;
    }

    if (layoutVorlagen.size() > 1) {
      LOG.warn("Mehr als eine Layoutvorlage hinterlegt: " + wahlOderWahltermin);
    }

    layoutVorlagen.sort(Comparator.comparing(DokumentVorlage::getId).reversed()); // jüngste Vorlage zuerst

    DokumentVorlage dokumentVorlage = layoutVorlagen.iterator().next();
    try (InputStream is = dokumentVorlage.getDatei().createInputStream(streamCreator)) {
      try (ByteArrayOutputStream bos = new ByteArrayOutputStream(BUFFER_SIZE)) {
        IOUtils.copy(is, bos);
        return bos.toByteArray();
      }
    } catch (IOException e) {
      throw new RuntimeException(e.getMessage(), e);
    }

  }

}
