
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.SitzeExportContext;
import de.ivu.elect.business.ergebnis.control.SitzeExportExchange;
import de.ivu.elect.business.ergebnis.control.SitzeExportObject;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Sitze;
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 SitzeExporter extends AbstractExporter<SitzeExportObject, SitzeExportContext> {

  @Inject
  private SitzeDAO sitzeDAO;

  @Inject
  private ErgebnisDAO ergebnisDAO;

  @Inject
  private SitzeExportExchange sitzeExportExchange;

  @Override
  public ExportExchange<SitzeExportObject, SitzeExportContext> getExchange() {
    return sitzeExportExchange;
  }

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

  @Override
  public SitzeExportObject getExportObject(SitzeExportContext context) {
    List<Sitze> stimmenEndgueltig = getStimmenByErgebnisVerwendung(context.getErgebnisVerwendungEndgueltig(), context);
    List<Sitze> stimmenVergleichswerte = getStimmenByErgebnisVerwendung(context.getErgebnisVerwendungVergleichswerte(),
        context);

    return new SitzeExportObject(stimmenEndgueltig, stimmenVergleichswerte);
  }

  protected List<Sitze> getStimmenByErgebnisVerwendung(ErgebnisVerwendung ergebnisVerwendung, SitzeExportContext 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 sitzeDAO.findByErgebnis(ergebnis.get(0));
  }

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

}
