package de.ivu.elect.presentation.wahl.menu;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.control.ZwischenergebnisberechnungBackgroundService;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebniskonflikt.boundary.ErgebnisKonfliktExtendedDAO;
import de.ivu.elect.business.stimmeingabe.control.sequenznummer.ErgebnissequenznummerSetzenBackgroundService;

import javax.inject.Inject;

public abstract class AbstractNlWasWahlphaseSchrittMenuItem extends AbstractNlWahlphaseSchrittMenuItem {
  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebnisKonfliktExtendedDAO ergebnisKonfliktExtendedDAO;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  protected boolean isOffeneLoseVorhanden() {
    Ergebnis ergebnis = ergebnisSessionSelect.getEntity();
    if (ergebnis == null) {
      return false;
    }

    return ergebnisKonfliktExtendedDAO.findByErgebnisOrderById(ergebnis).stream()
        .anyMatch(ergebnisKonflikt -> !ergebnisKonflikt.isGeloest());
  }

  @Override
  protected boolean isActionPossible() {
    return super.isActionPossible() && !isErgebnisWirdGeradeBerechnet(); // ELECT-11919 Übergänge verhindern, wenn gerade die Ergebnisberechnung läuft
  }

  protected boolean isErgebnisWirdGeradeBerechnet() {
    return ZwischenergebnisberechnungBackgroundService.isServiceRunning() || ErgebnissequenznummerSetzenBackgroundService.isServiceRunning();
  }


}
