
package de.ivu.elect.business.wertelisten.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.wertelisten.control.WertelistenExchangeContext;
import de.ivu.elect.business.wertelisten.control.WertelistenImportExchange;
import de.ivu.elect.business.wertelisten.entity.QWertelisten;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;
import de.ivu.elect.business.wertelisten.entity.WertelistenMeta;
import de.ivu.elect.business.wertelisten.entity.WertelistenTK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class WertelistenImporter
    extends
      AbstractEntityImporter<Wertelisten, WertelistenTK, WertelistenExchangeContext, DateiImportBerichtCustomData> {

  @Inject
  private WertelistenImportExchange importExchange;

  @Inject
  private WertelistenMeta meta;

  @Inject
  private WertelistenDAO dao;

  @Inject
  private WahlDAO wahlDAO;

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

  @Override
  protected void validiere(Violations violations, List<Wertelisten> entities, WertelistenExchangeContext context, ImportOptions importOptions) {
    for (Wertelisten entity : entities) {
      validateEntity(violations, entity, entity.getWertelistenTK());
    }
  }

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

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

  @Override
  protected void persistiere(Collection<Wertelisten> entityNurInDateiNichtInDatenbank,
      WertelistenExchangeContext context, DateiImportBerichtCustomData dateiImportBerichtCustomData,
      StringBuilder bericht) {

    for (Wertelisten entity : entityNurInDateiNichtInDatenbank) {
      entity.setWahl(wahlDAO.attach(context.getWahl()));
      dao.persist(entity);
    }
  }

  @Override
  protected void aktualisiere(Wertelisten entityInDatei, Wertelisten entityInDB, WertelistenExchangeContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    aktualisiereEntity(entityInDatei, entityInDB);
  }

  private void aktualisiereEntity(Wertelisten entityInDatei, Wertelisten entityInDB) {
    throw new UnsupportedOperationException();
  }

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

  @Override
  protected void loescheAusDatenbank(Collection<Wertelisten> entitiesInDb, WertelistenExchangeContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (Wertelisten entity : entitiesInDb) {
      dao.remove(entity);
    }
  }

  @Override
  protected List<Wertelisten> getAllEntitiesInDB(WertelistenExchangeContext noContext) {
    return dao.getQueryDsl().from(QWertelisten.wertelisten).eq(QWertelisten.wertelisten.wahl, noContext.getWahl())
        .list(QWertelisten.wertelisten);
  }

  @Override
  protected Function<Wertelisten, WertelistenTK> getEntityToEntityTKFunction() {
    return WertelistenTK.getWertelistenToTKFunction();
  }

  @Override
  protected void erstelleBericht(List<Wertelisten> importObject, WertelistenExchangeContext context,
      ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    // nichts zu tun
  }
}
