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

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.wahlbeteiligung.control.WahlbeteiligungVerlaufCreate;
import de.ivu.elect.business.wahlbeteiligung.control.WahlbeteiligungVerlaufImportExchange;
import de.ivu.elect.business.wahlbeteiligung.entity.*;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

@Stateless
public class WahlbeteiligungVerlaufImporter extends AbstractEntityImporter<WahlbeteiligungVerlauf, WahlbeteiligungVerlaufTK, WahlbeteiligungVerlaufExchangeContext, DateiImportBerichtCustomData> {

  @Inject
  private transient WahlbeteiligungVerlaufDAO wahlbeteiligungVerlaufDAO;

  @Inject
  private transient WahlbeteiligungVerlaufCreate wahlbeteiligungVerlaufCreate;

  @Inject
  private transient WahlbeteiligungVerlaufEdit wahlbeteiligungVerlaufEdit;


  @Inject
  private transient WahlbeteiligungVerlaufMeta meta;

  @Inject
  private transient WahlbeteiligungVerlaufImportExchange importExchange;

  @Override
  protected void validiere(Violations violations, List<WahlbeteiligungVerlauf> wahlbeteiligungVerlaeufe, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, ImportOptions importOptions) {
    for (WahlbeteiligungVerlauf wahlbeteiligungVerlauf : wahlbeteiligungVerlaeufe) {
      validateEntity(violations, wahlbeteiligungVerlauf, wahlbeteiligungVerlauf);
      for (WahlbeteiligungVerlaufGebiet wahlbeteiligungVerlaufGebiet : wahlbeteiligungVerlauf.getWahlbeteiligungVerlaufGebietsByWahlbeteiligungVerlauf()) {
        validateEntity(violations, wahlbeteiligungVerlaufGebiet, wahlbeteiligungVerlaufGebiet);
      }
    }
  }

  @Override
  protected void erstelleBericht(List<WahlbeteiligungVerlauf> wahlbeteiligungVerlaufs, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {

  }

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

  @Override
  protected boolean isUnterstuetztAnlegenWennNichtVorhanden() {
    return true;
  }

  @Override
  protected boolean isUnterstuetztAktualisiereBestehendenDaten() {
    return false;
  }

  @Override
  protected boolean isUnterstuetztLoescheBestehendenDatenWennNichtInImportDatenVorhanden() {
    return true;
  }

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

  @Override
  protected void persistiere(Collection<WahlbeteiligungVerlauf> neueEntities, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (WahlbeteiligungVerlauf neueEntity : neueEntities) {
      neueEntity.setWahl(wahlbeteiligungVerlaufExchangeContext.getWahl());
      wahlbeteiligungVerlaufCreate.save(neueEntity);
    }
  }

  @Override
  protected void aktualisiere(WahlbeteiligungVerlauf entityInDatei, WahlbeteiligungVerlauf entityInDatenbank, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException();
  }

  @Override
  protected void loescheAusDatenbank(Collection<WahlbeteiligungVerlauf> entitiesInDb, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (WahlbeteiligungVerlauf wahlbeteiligungVerlauf : entitiesInDb) {
      wahlbeteiligungVerlaufEdit.delete(wahlbeteiligungVerlauf);
    }
  }

  @Override
  protected List<WahlbeteiligungVerlauf> getAllEntitiesInDB(WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext) {
    return wahlbeteiligungVerlaufDAO.findByWahl(wahlbeteiligungVerlaufExchangeContext.getWahl());
  }

  @Override
  protected Function<WahlbeteiligungVerlauf, WahlbeteiligungVerlaufTK> getEntityToEntityTKFunction() {
    return WahlbeteiligungVerlauf::getWahlbeteiligungVerlaufTK;
  }
}
