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

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiImport;
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.internet.boundary.InternetPraesentationErmittler;
import de.ivu.elect.business.internet.entity.InternetPraesentationTyp;
import de.ivu.elect.business.konfiguration.control.StreamCreator;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;

public class PraesentationVorlageFinder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  @Inject
  private transient InternetPraesentationErmittler internetPraesentationErmittler;

  public java.util.List<de.ivu.elect.business.dokumente.entity.DokumentVorlage> findeVorlagen(Wahl wahl) {
    List<DokumentVorlage> result = new ArrayList<>(
        dokumentVorlageDAO.findByWahlAndArtOrderByName(wahl, DokumentVorlageArt.INTERNET_PREASENTATION_VELOCITY_TEMPLATES));

    if (result.isEmpty()) {
      result.add(getVorlageInWar());
    }

    return result;
  }

  private DokumentVorlage getVorlageInWar() {

    InternetPraesentationTyp internetPraesentationTyp = internetPraesentationErmittler.getInternetPraesentationTyp();
    DokumentVorlage result = new DokumentVorlage();
    result.setName("<STANDARD>");

    result.setDateiImport(new DateiImport(EmptyCustomData.INSTANCE));
    result.getDateiImport().setDatei(new VorlageDatei(internetPraesentationTyp));

    return result;

  }

  private static class VorlageDatei extends Datei {
    private static final long serialVersionUID = 1L;

    private final InternetPraesentationTyp internetPraesentationTyp;

    public VorlageDatei(InternetPraesentationTyp internetPraesentationTyp) {
      this.internetPraesentationTyp = internetPraesentationTyp;
    }

    @Override
    public InputStream createInputStream(StreamCreator streamCreator) {
      try {
        if (StringUtils.isBlank(internetPraesentationTyp.getDokumentVorlageResourceName())) {
          return new ByteArrayInputStream("".getBytes());
        }
        return Thread.currentThread().getContextClassLoader().getResource(internetPraesentationTyp.getDokumentVorlageResourceName()).openStream();
      } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
      }
    }
  }
}
