
package de.ivu.elect.business.statistik.control;

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

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.statistik.boundary.StatistikLaufDAO;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichen;
import de.ivu.elect.business.statistik.entity.StatistikLauf;
import de.ivu.elect.business.statistik.entity.StatistikLaufStatus;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class StatistikLaufBerechnerFuerGebiet {

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Inject
  private transient StatistikLaufDAO statistikLaufDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient Instance<StatistikKennzeichenBerechner> statistikKennzeichenBerechners;

  public StatistikLaufBerechnerFuerGebiet() {
    super();
  }

  public List<StatistikKennzeichen> berechneStatistikKennzeichenFuerGebiet(StatistikLauf statistikLauf, Gebiet gebietNotAttached) {
    List<StatistikKennzeichen> result = new ArrayList<>();

    Wahltermin wahltermin = wahlterminDAO.attach(statistikLauf.getWahltermin());
    Wahl wahl = wahlDAO.attach(statistikLauf.getWahl());
    Gebiet gebiet = gebietDAO.attach(gebietNotAttached);

    StatistikBerechnerContext statistikBerechnerContext = new StatistikBerechnerContext();

    for (StatistikKennzeichenBerechner statistikKennzeichenBerechner : statistikKennzeichenBerechners) {
      result.addAll(statistikKennzeichenBerechner.berechneKennzeichen(wahltermin, wahl, gebiet, statistikBerechnerContext));
    }

    return result;
  }

  public void markiereFehlerhaft(StatistikLauf template, String fehlermeldung) {
    StatistikLauf statistikLauf = statistikLaufDAO.attach(template);
    statistikLauf.setStatus(StatistikLaufStatus.FEHLERHAFT);
    statistikLauf.setEndeDesLaufs(new Date());
    statistikLauf.setBeschreibung(fehlermeldung);
  }
}
