
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.KreditinstitutImportExchange;
import de.ivu.elect.business.person.entity.Kreditinstitut;
import de.ivu.elect.business.person.entity.KreditinstitutMeta;
import de.ivu.elect.business.person.entity.KreditinstitutUK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class KreditinstitutImporter
    extends
      AbstractEntityImporter<Kreditinstitut, KreditinstitutUK, NoContext, DateiImportBerichtCustomData> {

  @Inject
  private transient KreditinstitutDAO kreditinstitutDAO;

  @Inject
  private transient KreditinstitutImportExchange kreditinstitutImportExchange;

  @Inject
  private transient KreditinstitutMeta kreditinstitutMeta;

  @Override
  public Collection<ImportOptions> getSupportedImportOptions(NoContext noContext) {
    return asList(ImportOptions.IMPORT_VOLLSTAENDIG_UEBERNEHMEN,
        ImportOptions.NEUE_DATEN_ANLEGEN_BESTEHENDE_DATEN_UNVERAENDERT_LASSEN);
  }

  @Override
  protected void persistiere(Collection<Kreditinstitut> kreditinstituteNurInDateiNichtInDb, NoContext noContext,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    kreditinstituteNurInDateiNichtInDb.forEach(kreditinstitut -> kreditinstitutDAO.persist(kreditinstitut));
  }

  @Override
  protected void aktualisiere(Kreditinstitut kreditinstitutInDatei, Kreditinstitut kreditinstitutInDatenbank,
      NoContext noContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    kreditinstitutInDatenbank.setBankleitzahl(kreditinstitutInDatei.getBankleitzahl());
    kreditinstitutInDatenbank.setBic(kreditinstitutInDatei.getBic());
    kreditinstitutInDatenbank.setBezeichnung(kreditinstitutInDatei.getBezeichnung());
  }

  @Override
  protected void loescheAusDatenbank(Collection<Kreditinstitut> kreditinstituteInDb, NoContext noContext,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    kreditinstituteInDb.forEach(kreditinstitut -> kreditinstitutDAO.remove(kreditinstitut));
  }

  @Override
  protected List<Kreditinstitut> getAllEntitiesInDB(NoContext noContext) {
    return kreditinstitutDAO.findByAll();
  }

  @Override
  protected Function<Kreditinstitut, KreditinstitutUK> getEntityToEntityTKFunction() {
    return KreditinstitutUK.getKreditinstitutToUKFunction();
  }

  @Override
  protected void validiere(Violations violations, List<Kreditinstitut> kreditinstitute, NoContext noContext,
      ImportOptions importOptions) {
    kreditinstitute
        .forEach(kreditinstitut -> validateEntity(violations, kreditinstitut, kreditinstitut.getKreditinstitutTK()));
  }

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

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

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