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

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.wahlbeteiligung.control.WahlbeteiligungAuswertungCreate;
import de.ivu.elect.business.wahlbeteiligung.control.WahlbeteiligungAuswertungImportExchange;
import de.ivu.elect.business.wahlbeteiligung.entity.Wahlbeteiligung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungExchangeContext;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungMeta;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungTK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class WahlbeteiligungAuswertungImporter extends AbstractEntityImporter<WahlbeteiligungAuswertung, WahlbeteiligungAuswertungTK, WahlbeteiligungAuswertungExchangeContext, DateiImportBerichtCustomData> {

  @Inject
  private transient WahlbeteiligungAuswertungDAO wahlbeteiligungAuswertungDAO;

  @Inject
  private transient WahlbeteiligungAuswertungCreate wahlbeteiligungAuswertungCreate;

  @Inject
  private transient WahlbeteiligungAuswertungEdit wahlbeteiligungAuswertungEdit;

  @Inject
  private transient WahlbeteiligungAuswertungMeta meta;

  @Inject
  private transient WahlbeteiligungAuswertungImportExchange importExchange;

  @Override
  protected void validiere(Violations violations, List<WahlbeteiligungAuswertung> wahlbeteiligungAuswertungs, WahlbeteiligungAuswertungExchangeContext wahlbeteiligungVerlaufExchangeContext, ImportOptions importOptions) {
    for (WahlbeteiligungAuswertung wahlbeteiligungAuswertung : wahlbeteiligungAuswertungs) {
      validateEntity(violations, wahlbeteiligungAuswertung, wahlbeteiligungAuswertung);
      for (Wahlbeteiligung wahlbeteiligung : wahlbeteiligungAuswertung.getWahlbeteiligungsByWahlbeteiligungAuswertung()) {
        validateEntity(violations, wahlbeteiligung, wahlbeteiligung);
      }
    }
  }

  @Override
  protected void erstelleBericht(List<WahlbeteiligungAuswertung> wahlbeteiligungVerlaufs, WahlbeteiligungAuswertungExchangeContext 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<WahlbeteiligungAuswertung>, WahlbeteiligungAuswertungExchangeContext> getExchange() {
    return importExchange;
  }

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

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

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

  @Override
  protected List<WahlbeteiligungAuswertung> getAllEntitiesInDB(WahlbeteiligungAuswertungExchangeContext wahlbeteiligungVerlaufExchangeContext) {
    return wahlbeteiligungAuswertungDAO.findByWahl(wahlbeteiligungVerlaufExchangeContext.getWahl());
  }

  @Override
  protected Function<WahlbeteiligungAuswertung, WahlbeteiligungAuswertungTK> getEntityToEntityTKFunction() {
    return WahlbeteiligungAuswertung::getWahlbeteiligungAuswertungTK;
  }
}
