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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.control.AbstractErgebnisImportContext;
import de.ivu.elect.business.ergebnis.control.StimmenImportContext;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.ergebnis.entity.StimmenTK;
import de.ivu.elect.business.exchange.entity.ImportUpdateReport;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.util.CollectionSeparator;

public class StimmenImportReport {

  @Inject
  private transient StimmenDAO stimmenDAO;

  @Inject
  private transient ErgebnisDAO ergebnisDAO;

  @Inject
  private transient ErgebnisImportSearch ergebnisSearch;

  public StimmenImportReport() {
    super();
  }

  public ImportUpdateReport createImportUpdateReport(List<Stimmen> importStimmen, Violations violations, StimmenImportContext context, ImportOptions importOptions, StringBuilder bericht) {
    CollectionSeparator<Stimmen, StimmenTK> cs = new CollectionSeparator<>(importStimmen, getInDbVorhandeneStimmen(context), StimmenTK.getStimmenToTKFunction());

    return new ImportUpdateReport(violations, cs.getInFirstNotInSecond().size(), cs.getInSecondNotInFirst().size(), cs.getInBoth().size(), importOptions, bericht);
  }

  List<Stimmen> getInDbVorhandeneStimmen(StimmenImportContext context) {
    return stimmenDAO.findByErgebnisNoCache(findeErgebnis(context));
  }

  Ergebnis findeErgebnis(AbstractErgebnisImportContext context) {
    return ergebnisDAO.attach(ergebnisSearch.loadUniqueErgebnis(context.getWahl(), context.getZiel()));
  }
}
