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

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.ergebnis.control.ErgebnisVerwendung;
import de.ivu.elect.business.ergebnis.control.StimmenExportContext;
import de.ivu.elect.business.ergebnis.control.StimmenExportExchange;
import de.ivu.elect.business.ergebnis.control.StimmenExportObject;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.ExportExchange;
import de.ivu.elect.business.exchange.entity.DateiExportArt;

@Stateless
public class StimmenExporter extends AbstractExporter<StimmenExportObject, StimmenExportContext> {

  @Inject
  private StimmenDAO stimmenDAO;

  @Inject
  private ErgebnisDAO ergebnisDAO;

  @Inject
  private StimmenExportExchange stimmenExportExchange;

  @Override
  public ExportExchange<StimmenExportObject, StimmenExportContext> getExchange() {
    return stimmenExportExchange;
  }

  @Override
  protected void processContextAndDateiExportIfNecessary(StimmenExportContext context, DateiExport dateiExport) {
    super.processContextAndDateiExportIfNecessary(context, dateiExport);
    context.setUrsprungsname(dateiExport.getDatei().getDateiname());
  }

  @Override
  public StimmenExportObject getExportObject(StimmenExportContext context) {
    List<Stimmen> stimmenEndgueltig = getStimmenByErgebnisVerwendung(context.getErgebnisVerwendungEndgueltig(), context);

    List<Stimmen> stimmenVergleichswerte = getStimmenByErgebnisVerwendung(
        context.getErgebnisVerwendungVergleichswerte(), context);

    return new StimmenExportObject(stimmenEndgueltig, stimmenVergleichswerte);
  }

  protected List<Stimmen> getStimmenByErgebnisVerwendung(ErgebnisVerwendung ergebnisVerwendung,
      StimmenExportContext context) {
    Ergebnisart gesuchteErgebnisArt = ergebnisVerwendung.getErgebnisart();
    if (gesuchteErgebnisArt == null) {
      return new ArrayList<>();
    }

    List<Ergebnis> ergebnis = ergebnisDAO.findByWahlAndErgebnisart(context.getWahl(), gesuchteErgebnisArt);
    if (ergebnis.size() > 1) {
      throw new IllegalStateException("Es darf nur ein Ergebnis mit der Ergebnisart='" + gesuchteErgebnisArt.name()
          + "' für die Wahl='" + context.getWahl().getName() + "' geben!");
    }
    if (ergebnis.isEmpty()) {
      throw new IllegalStateException("Es wurde kein Ergebnis mit der Ergebnisart='" + gesuchteErgebnisArt
          + "' für die Wahl='" + context.getWahl().getName() + "' gefunden!");
    }
    return stimmenDAO.findByErgebnisNoCache(ergebnis.get(0));
  }

  @Override
  protected DateiExportArt getDateiExportArt() {
    return DateiExportArt.STIMMEN_EXPORT;
  }

}
