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

import static java.util.Collections.emptyList;

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.ImportExchange;
import de.ivu.elect.business.konfiguration.boundary.AbstractCustomParameterImporter;
import de.ivu.elect.business.wahl.control.WahlParameterExchangeContext;
import de.ivu.elect.business.wahl.control.WahlParameterImportExchange;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.WahlParameterMeta;
import de.ivu.elect.business.wahl.entity.WahlParameterTK;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class WahlParameterImporter extends AbstractCustomParameterImporter<WahlParameterWerte, WahlParameter, WahlParameterTK, WahlParameterExchangeContext> {

  @Inject
  private transient WahlParameterDAO wahlParameterDAO;

  @Inject
  private transient WahlParameterMeta wahlParameterMeta;

  @Inject
  private transient WahlParameterEdit wahlParameterEdit;

  @Inject
  private transient WahlParameterImportExchange importExchange;

  public WahlParameterImporter() {
    super();
  }

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

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

  // HINT: Überschreiben, um Sichtbarkeit zu ändern
  @Override
  public void importiereImportObject(List<WahlParameter> inDatei, WahlParameterExchangeContext wahlParameterExchangeContext, ImportOptions importOptions,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    super.importiereImportObject(inDatei, wahlParameterExchangeContext, importOptions, dateiImportBerichtCustomData, bericht);
  }

  @Override
  protected List<WahlParameter> getAllEntitiesInDB(WahlParameterExchangeContext context) {
    if (context.hasWahl()) {
      return wahlParameterDAO.findByWahl(context.getWahl());
    }

    if (context.hasWahltermin()) {
      return wahlParameterDAO.findByWahlterminNotWahl(context.getWahltermin());
    }

    return emptyList();
  }

  @Override
  protected Function<WahlParameter, WahlParameterTK> getEntityToEntityTKFunction() {
    return WahlParameterTK.getWahlParameterToTKFunction();
  }

  @Override
  protected void aktualisiere(WahlParameter wahlParameterInDatei, WahlParameter wahlParameterInDb, WahlParameterExchangeContext context, DateiImportBerichtCustomData dateiImportBerichtCustomData,
      StringBuilder bericht) {
    super.aktualisiere(wahlParameterInDatei, wahlParameterInDb, context, dateiImportBerichtCustomData, bericht);

    wahlParameterEdit.sendWahlParameterChangeEvent(wahlParameterInDb);
  }

  @Override
  protected void persistiere(Collection<WahlParameter> neueEntities, WahlParameterExchangeContext context, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException("Nur aktualisieren möglich");
  }

  @Override
  protected void loescheAusDatenbank(Collection<WahlParameter> entitiesInDb, WahlParameterExchangeContext context, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException("Nur aktualisieren möglich");
  }

  // HINT: Überschreiben, um Sichtbarkeit zu ändern
  @Override
  public void validiere(Violations violations, List<WahlParameter> parameters, WahlParameterExchangeContext context, ImportOptions importOptions) {
    super.validiere(violations, parameters, context, importOptions);
  }

  // HINT: Überschreiben, um Sichtbarkeit zu ändern
  @Override
  public void erstelleBericht(List<WahlParameter> parametersInDatei, WahlParameterExchangeContext context, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    super.erstelleBericht(parametersInDatei, context, importOptions, bericht, vorab);
  }
}
