
package de.ivu.elect.exchange.dokumente.mapper;

import static java.util.Collections.emptyList;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageAnlageArt;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.exchange.datei.mapper.DateiMapper;
import de.ivu.elect.interfaces.core.Datei;

public class DokumentVorlageMapper {

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

  @Inject
  private transient DateiMapper dateiMapper;

  public DokumentVorlageMapper() {
    super();
  }

  public Collection<de.ivu.elect.interfaces.core.DokumentVorlage> extern(Collection<DokumentVorlage> sources) {
    if (sources == null || sources.isEmpty()) {
      return emptyList();
    }

    List<de.ivu.elect.interfaces.core.DokumentVorlage> targets = new ArrayList<>();

    for (DokumentVorlage source : sources) {
      de.ivu.elect.interfaces.core.DokumentVorlage target = new de.ivu.elect.interfaces.core.DokumentVorlage();

      target.setAnlageArt(extern(source.getAnlageArt()));
      target.setBeschreibung(source.getBeschreibung());
      target.setDokumentVorlageArtAsString(source.getDokumentVorlageArt().name());
      target.setName(source.getName());
      target.setVersionsnummer(source.getVersionsnummer());

      try {
        target.setDatei(extern(source));
        targets.add(target);
      } catch (Exception e) {
        LOG.warn("Fehler beim Exportieren einer Dokumentvorlage - wird ignoriert: " + source.getName(), e);
      }
    }

    return targets;
  }

  public Collection<DokumentVorlage> intern(Collection<de.ivu.elect.interfaces.core.DokumentVorlage> sources) {
    if (sources == null || sources.isEmpty()) {
      return emptyList();
    }

    List<DokumentVorlage> targets = new ArrayList<>();

    for (de.ivu.elect.interfaces.core.DokumentVorlage source : sources) {
      DokumentVorlage target = new DokumentVorlage();

      target.setAnlageArt(intern(source.getAnlageArt()));
      target.setBeschreibung(source.getBeschreibung());
      target.setDokumentVorlageArt(DokumentVorlageArt.valueOf(source.getDokumentVorlageArtAsString()));
      target.setName(source.getName());
      target.setVersionsnummer(source.getVersionsnummer());

      target.setDateiImport(intern(source));

      targets.add(target);
    }

    return targets;
  }

  private DateiImport intern(de.ivu.elect.interfaces.core.DokumentVorlage source) {
    return dateiMapper.intern(source.getDatei());
  }

  private Datei extern(DokumentVorlage source) throws IOException {
    return dateiMapper.extern(source.getDateiImport());
  }

  protected DokumentVorlageAnlageArt intern(de.ivu.elect.interfaces.core.DokumentVorlageAnlageArt source) {
    if (source == null) {
      return DokumentVorlageAnlageArt.EINZEL_DATEI;
    }

    return DokumentVorlageAnlageArt.valueOf(source.name());
  }

  protected de.ivu.elect.interfaces.core.DokumentVorlageAnlageArt extern(DokumentVorlageAnlageArt source) {
    return de.ivu.elect.interfaces.core.DokumentVorlageAnlageArt.valueOf(source.name());
  }
}
