
package de.ivu.elect.business.staat.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.staat.control.StaatImportExchange;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.staat.entity.StaatMeta;
import de.ivu.elect.business.staat.entity.StaatUK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class StaatImporter extends AbstractEntityImporter<Staat, StaatUK, NoContext, DateiImportBerichtCustomData> {

  @Inject
  private transient StaatDAO staatDAO;

  @Inject
  private transient StaatMeta staatMeta;

  @Inject
  private transient StaatImportExchange staatImportExchange;

  public StaatImporter() {
    super();
  }

  @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<Staat>, NoContext> getExchange() {
    return staatImportExchange;
  }

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

  @Override
  protected void validiere(Violations violations, List<Staat> staaten, NoContext context, ImportOptions importOptions) {
    staaten.forEach(staat -> validateEntity(violations, staat, staat.getStaatTK()));
  }

  @Override
  protected void persistiere(Collection<Staat> staatenNurInDateiNichtInDb, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    staatenNurInDateiNichtInDb.forEach(staat -> staatDAO.persist(staat));
  }

  @Override
  protected void aktualisiere(Staat staatInDatei, Staat staatInDb, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    staatInDb.setCustomCodeStaat(staatInDatei.getCustomCodeStaat());
    staatInDb.setCustomCodeStaatsangehoerigkeit(staatInDatei.getCustomCodeStaatsangehoerigkeit());
    staatInDb.setNameStaat(staatInDatei.getNameStaat());
    staatInDb.setNameStaatsangehoerigkeit(staatInDatei.getNameStaatsangehoerigkeit());
    staatInDb.setEuStaat(staatInDatei.getEuStaat());
    staatInDb.setIso3166Alpha2(staatInDatei.getIso3166Alpha2());
    staatInDb.setIso3166Numerisch(staatInDatei.getIso3166Numerisch());
  }

  @Override
  protected void loescheAusDatenbank(Collection<Staat> staatenInDb, NoContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    staatenInDb.forEach(staat -> staatDAO.remove(staat));
  }

  @Override
  protected List<Staat> getAllEntitiesInDB(NoContext noContext) {
    return staatDAO.findByAllOrderedByNameStaat();
  }

  @Override
  protected Function<Staat, StaatUK> getEntityToEntityTKFunction() {
    return StaatUK.getStaatToUKFunction();
  }

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