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

import de.ivu.elect.business.exchange.control.AbstractEntityImporter;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagDAO;
import de.ivu.elect.business.wahlvorschlagsperson.control.WahlvorschlagsPersonCreate;
import de.ivu.elect.business.wahlvorschlagsperson.control.WahlvorschlagsPersonImportExchange;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonMeta;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonTK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.presentation.wahlvorschlagsperson.exchange.WahlvorschlagsPersonImportContext;

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

@Stateless
public class WahlvorschlagsPersonImporter extends AbstractEntityImporter<WahlvorschlagsPerson, WahlvorschlagsPersonTK, WahlvorschlagsPersonImportContext, WahlvorschlagsPersonDateiImportBericht> {

  @Inject
  private transient WahlvorschlagsPersonImportExchange wahlvorschlagsPersonImportExchange;

  @Inject
  protected transient WahlvorschlagsPersonMeta wahlvorschlagsPersonMeta;

  @Inject
  protected transient WahlvorschlagsPersonDAO wahlvorschlagsPersonDAO;

  @Inject
  protected transient WahlvorschlagsPersonCreate wahlvorschlagsPersonCreate;

  @Inject
  protected transient WahlvorschlagDAO wahlvorschlagDAO;

  @Inject
  protected transient WahlDAO wahlDao;

  @Override
  protected void persistiere(Collection<WahlvorschlagsPerson> neueEntities, WahlvorschlagsPersonImportContext context, WahlvorschlagsPersonDateiImportBericht wahlvorschlagsPersonDateiImportBericht, StringBuilder bericht) {
    neueEntities.forEach(wahlvorschlagsPersonCreate::save);
  }

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

  @Override
  protected boolean isUnterstuetztAktualisiereBestehendenDaten() {
    return false; //personendaten können nicht erkannt werden
  }

  @Override
  protected boolean isUnterstuetztLoescheBestehendenDatenWennNichtInImportDatenVorhanden() {
    return false; //personendaten können nicht erkannt werden
  }

  @Override
  protected void aktualisiere(WahlvorschlagsPerson entityInDatei, WahlvorschlagsPerson entityInDatenbank, WahlvorschlagsPersonImportContext wahlvorschlagsPersonImportContext, WahlvorschlagsPersonDateiImportBericht wahlvorschlagsPersonDateiImportBericht, StringBuilder bericht) {

  }

  @Override
  protected void loescheAusDatenbank(Collection<WahlvorschlagsPerson> entitiesInDb, WahlvorschlagsPersonImportContext wahlvorschlagsPersonImportContext, WahlvorschlagsPersonDateiImportBericht wahlvorschlagsPersonDateiImportBericht, StringBuilder bericht) {

  }

  @Override
  protected List<WahlvorschlagsPerson> getAllEntitiesInDB(WahlvorschlagsPersonImportContext wahlvorschlagsPersonImportContext) {
    return wahlvorschlagsPersonDAO.findByWahlOhneUnterstuetzer(wahlvorschlagsPersonImportContext.getWahl()).stream()
            .filter(wvp -> wvp.getWahlvorschlagsPersonTyp().isBeauftragter() || wvp.getWahlvorschlagsPersonTyp().isStellvertretenderBeauftragter())
            .collect(Collectors.toList());
  }

  @Override
  protected Function<WahlvorschlagsPerson, WahlvorschlagsPersonTK> getEntityToEntityTKFunction() {
    return WahlvorschlagsPerson::getWahlvorschlagsPersonTK;
  }

  @Override
  protected void validiere(Violations violations, List<WahlvorschlagsPerson> wahlvorschlagsPersonen, WahlvorschlagsPersonImportContext wahlvorschlagsPersonImportContext, ImportOptions importOptions) {

  }

  @Override
  protected void erstelleBericht(List<WahlvorschlagsPerson> wahlvorschlagsPeople, WahlvorschlagsPersonImportContext wahlvorschlagsPersonImportContext, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {

  }

  @Override
  protected WahlvorschlagsPersonImportExchange getExchange() {
    return wahlvorschlagsPersonImportExchange;
  }

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

  protected Wahl attach(Wahl wahl) {
    return wahlDao.attach(wahl);
  }
}
