
package de.ivu.elect.business.wahlrechtspruefung.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.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlrechtspruefung.control.PruefkriteriumCreate;
import de.ivu.elect.business.wahlrechtspruefung.control.PruefkriteriumImportExchange;
import de.ivu.elect.business.wahlrechtspruefung.entity.Pruefkriterium;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumImportContext;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumMeta;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumTK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class PruefkriteriumImporter extends AbstractEntityImporter<Pruefkriterium, PruefkriteriumTK, PruefkriteriumImportContext, DateiImportBerichtCustomData> {

  @Inject
  private transient PruefkriteriumImportExchange pruefkriteriumImportExchange;

  @Inject
  private transient PruefkriteriumDAO pruefkriteriumDAO;

  @Inject
  private transient PruefkriteriumCreate pruefkriteriumCreate;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient PruefkriteriumMeta pruefkriteriumMeta;

  public PruefkriteriumImporter() {
    super();
  }

  @Override
  protected void importiere(PruefkriteriumImportContext pruefkriteriumImportContext, ImportOptions importOptions, DateiImportBerichtCustomData customDateiImportBericht, List<Pruefkriterium> pruefkriteriums) {
    pruefkriteriumDAO.deleteDeleteByWahl(attachWahl(pruefkriteriumImportContext)); // ELECTMUC-3024
    super.importiere(pruefkriteriumImportContext, importOptions, customDateiImportBericht, pruefkriteriums);
  }

  @Override
  protected void persistiere(Collection<Pruefkriterium> neueEntities, PruefkriteriumImportContext pruefkriteriumImportContext, DateiImportBerichtCustomData dateiImportBerichtCustomData,
                             StringBuilder bericht) {
    Wahl wahl = attachWahl(pruefkriteriumImportContext);

    for (Pruefkriterium neueEntity : neueEntities) {
      neueEntity.setWahl(wahl);

      pruefkriteriumCreate.save(neueEntity);
    }
  }

  @Override
  protected void aktualisiere(Pruefkriterium entityInDatei, Pruefkriterium entityInDatenbank, PruefkriteriumImportContext pruefkriteriumImportContext,
                              DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException("Aktualisieren nicht unterstützt!");
  }

  @Override
  protected void loescheAusDatenbank(Collection<Pruefkriterium> entitiesInDb, PruefkriteriumImportContext pruefkriteriumImportContext, DateiImportBerichtCustomData dateiImportBerichtCustomData,
                                     StringBuilder bericht) {
    for (Pruefkriterium pruefkriterium : entitiesInDb) {
      pruefkriteriumDAO.remove(pruefkriterium);
    }
  }

  @Override
  protected List<Pruefkriterium> getAllEntitiesInDB(PruefkriteriumImportContext pruefkriteriumImportContext) {
    return pruefkriteriumDAO.findByWahlOrderByPosition(attachWahl(pruefkriteriumImportContext));
  }

  @Override
  protected Function<Pruefkriterium, PruefkriteriumTK> getEntityToEntityTKFunction() {
    return PruefkriteriumTK.getPruefkriteriumToTKFunction();
  }

  @Override
  protected void validiere(Violations violations, List<Pruefkriterium> pruefkriteriums, PruefkriteriumImportContext pruefkriteriumImportContext, ImportOptions importOptions) {
    for (Pruefkriterium pruefkriterium : pruefkriteriums) {
      validateEntity(violations, pruefkriterium, pruefkriterium.getTk());
    }
  }

  @Override
  protected void erstelleBericht(List<Pruefkriterium> pruefkriteriums, PruefkriteriumImportContext pruefkriteriumImportContext, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    // nichts zu tun
  }

  @Override
  protected ImportExchange<List<Pruefkriterium>, PruefkriteriumImportContext> getExchange() {
    return pruefkriteriumImportExchange;
  }

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

  private Wahl attachWahl(PruefkriteriumImportContext pruefkriteriumImportContext) {
    return wahlDAO.attach(pruefkriteriumImportContext.getWahl());
  }
}
