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

import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.Collection;
import java.util.List;

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

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.datei.boundary.DateiExportDAO;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.dokumente.boundary.DokumentVorlageDAO;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.person.boundary.PersonendatenDAO;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenDateiExport;
import de.ivu.elect.jee.security.AbstractPrincipal;

public class PersonendatenDateiExportCreate extends AbstractPersonendatenDateiExportCreate {

  @Inject
  private transient BenutzerDAO benutzerDAO;

  @Inject
  private transient PersonendatenDAO personendatenDAO;

  @Inject
  private transient DateiExportDAO dateiExportDAO;

  @Inject
  private transient DokumentVorlageDAO dokumentVorlageDAO;

  public PersonendatenDateiExportCreate() {
    super();
  }

  public void save(Collection< ? extends Personendaten> entities, DateiExport dateiExport, @Nullable Benutzer benutzer, List<String> bemerkungen) {
    for (Personendaten personendaten : entities) {
      save(personendaten, dateiExport, null, benutzer, bemerkungen);
    }
  }

  public void save(Collection< ? extends Personendaten> entities, DateiExport dateiExport, @Nullable DokumentVorlage dokumentVorlage, @Nullable Benutzer benutzer, List<String> bemerkungen) {
    for (Personendaten personendaten : entities) {
      save(personendaten, dateiExport, dokumentVorlage, benutzer, bemerkungen);
    }
  }

  // ELECTMUC-1742
  private void save(Personendaten personendatenDetached, DateiExport dateiExportDetached, @Nullable DokumentVorlage dokumentVorlageDetached, @Nullable Benutzer benutzerDetached,
      List<String> bemerkungen) {
    String benutzerkennung = AbstractPrincipal.SYSTEM_BENUTZERKENNUNG;

    Benutzer benutzer = benutzerDAO.attach(benutzerDetached);

    if (benutzer != null && isNotBlank(benutzer.getBenutzerkennung())) {
      benutzerkennung = benutzer.getBenutzerkennung();
    }

    Personendaten personendaten = personendatenDAO.attach(personendatenDetached);

    PersonendatenDateiExport personendatenDateiExport = new PersonendatenDateiExport();
    personendatenDateiExport.setBenutzerkennung(benutzerkennung);

    personendatenDateiExport.setPersonendaten(personendaten);

    DateiExport dateiExport = dateiExportDAO.attach(dateiExportDetached);
    Datei datei = dateiExport.getDatei();

    personendatenDateiExport.setDatei(datei);
    personendatenDateiExport.setDateiArt(dateiExport.getDateiArt());
    personendatenDateiExport.setDateiname(datei.getOriginalDateiname());
    personendatenDateiExport.setErstellungszeitpunkt(datei.getErstellungszeitpunkt());

    DokumentVorlage dokumentVorlage = dokumentVorlageDAO.attach(dokumentVorlageDetached);

    if (dokumentVorlage != null) {
      personendatenDateiExport.setDokumentVorlageName(dokumentVorlage.getName());
      personendatenDateiExport.setDokumentVorlageArt(dokumentVorlage.getDokumentVorlageArt());
      personendatenDateiExport.setDokumentVorlageDateiname(dokumentVorlage.getDateinameOriginal());
    }

    personendatenDateiExport.setBemerkung(bemerkungen.stream().filter(StringUtils::isNotBlank).collect(joining(", ")));

    save(personendatenDateiExport);
  }
}
