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

import static java.util.Arrays.asList;

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.DateiImportBerichtCustomData;
import de.ivu.elect.business.exchange.control.AbstractEntityImporter;
import de.ivu.elect.business.exchange.control.ImportExchange;
import de.ivu.elect.business.exchange.control.NoContext;
import de.ivu.elect.business.person.control.BerufImportExchange;
import de.ivu.elect.business.person.entity.Beruf;
import de.ivu.elect.business.person.entity.BerufMeta;
import de.ivu.elect.business.person.entity.BerufUK;
import de.ivu.elect.business.person.entity.QBeruf;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class BerufImporter extends AbstractEntityImporter<Beruf, BerufUK, NoContext, DateiImportBerichtCustomData> {

  @Inject
  private transient BerufDAO dao;

  @Inject
  private transient BerufMeta meta;

  @Inject
  private transient BerufImportExchange importExchange;

  public BerufImporter() {
    super();
  }

  /**
   * Man könnte alle ImportOptions unterstützen, ist aber fachlich eher verwirrend. Deshalb die Einschränkung.
   */
  @Override
  public Collection<ImportOptions> getSupportedImportOptions(NoContext context) {
    return asList(ImportOptions.IMPORT_VOLLSTAENDIG_UEBERNEHMEN, ImportOptions.NEUE_DATEN_ANLEGEN_BESTEHENDE_DATEN_UNVERAENDERT_LASSEN);
  }

  @Override
  protected ImportExchange<List<Beruf>, NoContext> getExchange() {
    return importExchange;
  }

  @Override
  protected void validiere(Violations violations, List<Beruf> entities, NoContext context, ImportOptions importOptions) {
    for (Beruf entity : entities) {
      validateEntity(violations, entity, entity.getBerufTK());
    }
  }

  @Override
  public Meta getMetaForEntityInternal() {
    return meta;
  }

  @Override
  protected void persistiere(Collection<Beruf> entityNurInDateiNichtInDatenbank, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (Beruf staat : entityNurInDateiNichtInDatenbank) {
      dao.persist(staat);
    }
  }

  @Override
  protected void aktualisiere(Beruf entityInDatei, Beruf entityInDB, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    aktualisiereEntity(entityInDatei, entityInDB);
  }

  private void aktualisiereEntity(Beruf entityInDatei, Beruf entityInDB) {
    entityInDB.setHerkunft(entityInDatei.getHerkunft());
    entityInDB.setCode(entityInDatei.getCode());
    entityInDB.setName(entityInDatei.getName());
  }

  @Override
  protected void loescheAusDatenbank(Collection<Beruf> entitiesInDb, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (Beruf entity : entitiesInDb) {
      dao.remove(entity);
    }
  }

  @Override
  protected List<Beruf> getAllEntitiesInDB(NoContext noContext) {
    return dao.getQueryDsl().from(QBeruf.beruf).list(QBeruf.beruf);
  }

  @Override
  protected Function<Beruf, BerufUK> getEntityToEntityTKFunction() {
    return BerufUK.getBerufToUKFunction();
  }

  @Override
  protected void erstelleBericht(List<Beruf> importObject, NoContext context, ImportOptions importOptions, StringBuilder bericht,
      boolean vorab) {
    // nichts zu tun
  }
}
