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

import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;

@Specializes
/**
 * Es wird immer das zur aktuell ausgewählten Wahl passende Ergebnis ausgewählt, abhängigig von der ausgewählten Ergebniseingangsart
 */
public class AutomatischAuswaehlenErgebnisSessionSelect extends ErgebnisSessionSelect {

  private static final long serialVersionUID = 1L;

  @Inject
  transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  transient AutomatischAuswaehlenErgebnisSessionSelectCache auswaehlenErgebnisSessionSelectCache;

  @Inject
  transient SystemLogWriter systemLogWriter;

  @Override
  @Nullable
  public Ergebnis getEntity() {
    if (!isSelected()) {
      if (getEntityPK() != null) {
        super.setEntity((Ergebnis) null);  // Damit Change Event gefeuert wird
      }
      return null;
    }

    Ergebnis result = auswaehlenErgebnisSessionSelectCache.getErgebnis();
    if (result == null) {

      Wahldurchfuehrung wahldurchfuehrung = wahldurchfuehrungSessionSelect.getEntity();
      Ergebnisart anzuzeigendeErgebnisart = wahldurchfuehrung.getErgebniseingangsart().korrespondierendeErgebnisart();

      List<Ergebnis> daoResult = entityDAO.findByWahlAndErgebnisart(wahldurchfuehrung, anzuzeigendeErgebnisart);

      if (daoResult.isEmpty()) {
        return null;
      }

      if (daoResult.size() > 1) {

        // ELECT-14986
        systemLogWriter.writeErrorLogMessageFuerMandant(wahldurchfuehrung, "Mehrere Ergebnisse gefunden: Wahl:" + wahldurchfuehrung.getPk() + ", Art: "
            + anzuzeigendeErgebnisart, SystemLogQuelle.SYSTEM);

        //        throw new IllegalStateException("Mehrere Ergebnissee gefunden: Wahl:" + wahldurchfuehrung.getPk() + ", Art: "
        //            + anzuzeigendeErgebnisart);
      }

      result = daoResult.get(0);
      auswaehlenErgebnisSessionSelectCache.setErgebnis(result);
      super.setEntity(result); // Damit Change Event gefeuert wird
    }
    return result;
  }

  @Override
  public boolean isSelected() {
    return wahldurchfuehrungSessionSelect.isSelected();
  }
}
