package de.ivu.elect.business.entschaedigung.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.entschaedigung.control.AuszahlungCreate;
import de.ivu.elect.business.entschaedigung.control.AuszahlungImportContext;
import de.ivu.elect.business.entschaedigung.control.AuszahlungImportExchange;
import de.ivu.elect.business.entschaedigung.control.EntschaedigungImportAttacher;
import de.ivu.elect.business.entschaedigung.entity.Auszahlung;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungMeta;
import de.ivu.elect.business.entschaedigung.entity.AuszahlungTK;
import de.ivu.elect.business.exchange.control.AbstractEntityImporter;
import de.ivu.elect.business.exchange.control.ImportExchange;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class AuszahlungImporter
    extends AbstractEntityImporter<Auszahlung, AuszahlungTK, AuszahlungImportContext, DateiImportBerichtCustomData>
{

  @Inject
  private AuszahlungDAO auszahlungDAO;

  @Inject
  private AuszahlungMeta auszahlungMeta;

  @Inject
  private AuszahlungCreate auszahlungCreate;

  @Inject
  private AuszahlungImportExchange auszahlungImportExchange;

  @Inject
  private EntschaedigungImportAttacher entschaedigungImportAttacher;

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

  @Override
  protected void persistiere(Collection<Auszahlung> neueEntities, AuszahlungImportContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {

    for (Auszahlung auszahlung : neueEntities) {
      auszahlung.setWahltermin(context.getWahltermin());
      auszahlungCreate.save(auszahlung);
      entschaedigungImportAttacher.onAuszahlungPersistiert(auszahlung, context);
    }

  }

  @Override
  protected void aktualisiere(Auszahlung entityInDatei, Auszahlung entityInDatenbank, AuszahlungImportContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException("Nicht unterstützt");
  }

  @Override
  protected void loescheAusDatenbank(Collection<Auszahlung> entitiesInDb, AuszahlungImportContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException("Nicht unterstützt");
  }

  @Override
  public void erstelleBericht(List<Auszahlung> auszahlungs, AuszahlungImportContext context,
      ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    // nichts zu tun
  }

  @Override
  public void validiere(Violations violations, List<Auszahlung> auszahlungs, AuszahlungImportContext context,
      ImportOptions importOptions) {

    for (Auszahlung auszahlung : auszahlungs) {
      validateEntity(violations, auszahlung, getMetaForEntity());
    }

  }

  @Override
  protected ImportExchange<List<Auszahlung>, AuszahlungImportContext> getExchange() {
    return auszahlungImportExchange;
  }

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

  @Override
  protected List<Auszahlung> getAllEntitiesInDB(AuszahlungImportContext context) {
    return auszahlungDAO.findByWahltermin(context.getWahltermin());
  }

  @Override
  protected Function<Auszahlung, AuszahlungTK> getEntityToEntityTKFunction() {
    return Auszahlung::getAuszahlungTK;
  }
}
