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

import static java.util.Collections.emptyList;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.dokumente.control.DokumentVorlageCreate;
import de.ivu.elect.business.dokumente.control.DokumentVorlageExchangeContext;
import de.ivu.elect.business.dokumente.control.DokumentVorlageImportExchange;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageMeta;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageTK;
import de.ivu.elect.business.exchange.control.AbstractEntityImporter;
import de.ivu.elect.business.exchange.control.ImportExchange;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class DokumentVorlageImporter extends AbstractEntityImporter<DokumentVorlage, DokumentVorlageTK, DokumentVorlageExchangeContext, DateiImportBerichtCustomData> {

  public static final ImportOptions DEFAULT_OPTIONS = ImportOptions.NEUE_DATEN_ANLEGEN_BESTEHENDE_DATEN_UNVERAENDERT_LASSEN;

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  @Inject
  private transient DokumentVorlageMeta dokumentVorlageMeta;

  @Inject
  private transient DokumentVorlageCreate dokumentVorlageCreate;

  @Inject
  private transient DokumentVorlageImportExchange dokumentVorlageImportExchange;

  public DokumentVorlageImporter() {
    super();
  }

  @Override
  protected ImportExchange<List<DokumentVorlage>, DokumentVorlageExchangeContext> getExchange() {
    return dokumentVorlageImportExchange;
  }

  @Override
  public void validiere(Violations violations, List<DokumentVorlage> importObject, DokumentVorlageExchangeContext context, ImportOptions importOptions) {
    // Do nothing...
  }

  @Override
  public void erstelleBericht(List<DokumentVorlage> importObject, DokumentVorlageExchangeContext context, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    // Do nothing...
  }

  @Override
  public void importiereImportObject(List<DokumentVorlage> importObject, DokumentVorlageExchangeContext context, ImportOptions importOptions,
      DateiImportBerichtCustomData customDateiImportBerichtCustomData, StringBuilder bericht) {
    super.importiereImportObject(importObject, context, importOptions, customDateiImportBerichtCustomData, bericht);
  }

  @Override
  protected void persistiere(Collection<DokumentVorlage> neueEntities, DokumentVorlageExchangeContext context, DateiImportBerichtCustomData customDateiImportBerichtCustomData, StringBuilder bericht) {
    for (DokumentVorlage dokumentVorlage : neueEntities) {
      Datei datei = dokumentVorlage.getDateiImport().getDatei();

      byte[] content = datei.getNichtPersistenterInhalt();

      try (ByteArrayInputStream bis = new ByteArrayInputStream(content)) {
        dokumentVorlageCreate.save(dokumentVorlage, bis, datei.getOriginalDateiname(), context.getWahl(), context.getWahltermin());
      } catch (IOException ex) {
        throw new RuntimeException(ex.getMessage(), ex);
      }
    }
  }

  @Override
  protected void aktualisiere(DokumentVorlage entityInDatei, DokumentVorlage entityInDatenbank, DokumentVorlageExchangeContext context, DateiImportBerichtCustomData customDateiImportBerichtCustomData,
      StringBuilder bericht) {
    throw new UnsupportedOperationException("Nur anlegen möglich");
  }

  @Override
  protected void loescheAusDatenbank(Collection<DokumentVorlage> entitiesInDb, DokumentVorlageExchangeContext context, DateiImportBerichtCustomData customDateiImportBerichtCustomData,
      StringBuilder bericht) {
    throw new UnsupportedOperationException("Nur anlegen möglich");
  }

  @Override
  protected List<DokumentVorlage> getAllEntitiesInDB(DokumentVorlageExchangeContext context) {
    if (context.hasWahl()) {
      return dokumentVorlageDAO.findByWahlOrderByArtAndName(context.getWahl());
    }

    if (context.hasWahltermin()) {
      return dokumentVorlageDAO.findByWahlterminOrderByArtAndName(context.getWahltermin());
    }

    return emptyList();
  }

  @Override
  protected Function<DokumentVorlage, DokumentVorlageTK> getEntityToEntityTKFunction() {
    return DokumentVorlageTK.getDokumentVorlageToTKFunction();
  }

  @Override
  protected Meta getMetaForEntityInternal() {
    return dokumentVorlageMeta;
  }
}
