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

import java.util.Collection;

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

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingabestatuswechelPruefer;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingabestatuswechelPruefergebnis;

@Specializes
public class NlErgebniseingabestatuswechelPruefer extends ErgebniseingabestatuswechelPruefer {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlErgebniseingangStatus nlErgebniseingangStatus;

  public NlErgebniseingabestatuswechelPruefer() {
    super();
  }

  @Override
  public ErgebniseingabestatuswechelPruefergebnis isStatusuebergangMoeglich(Ergebnis ergebnis, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, Ergebniseingabestatus ergebniseingabestatusZuSetzen,
      boolean freigabeZuruecknehmenRechtVorhanden) {
    if (wahldurchfuehrungsgebiet == null || wahldurchfuehrungsgebiet.hasUebergeordnetesGebiet()) {
      return ErgebniseingabestatuswechelPruefergebnis.NICHT_MOEGLICH; // Ergebniseingabestatus nur auf dem Wurzelgebiet setzen...
    }

    ErgebniseingabestatuswechelPruefergebnis result = super.isStatusuebergangMoeglich(ergebnis, wahldurchfuehrungsgebiet, ergebniseingabestatusZuSetzen, freigabeZuruecknehmenRechtVorhanden);

    if (result.isUebergangMoeglich() && Ergebniseingabestatus.ABGESCHLOSSEN.equals(ergebniseingabestatusZuSetzen)) {
      return getErgebniseingangStatus().isErgebniseingabestatusAbgeschlossenMoeglich(ergebnis, wahldurchfuehrungsgebiet);
    }

    return result;
  }

  public boolean isErgebnisAuswertungMoeglich(Ergebnis ergebnis) {
    return getErgebniseingangStatus().isErgebniseingabestatusAuswertungMoeglich(ergebnis);
  }

  public boolean isErgebnisExportMoeglich(Ergebnis ergebnis, Collection<Ergebniseingabestatus> ergebniseingabestatusZuExportieren) {
    return getErgebniseingangStatus().isErgebniseingabestatusExportMoeglich(ergebnis, ergebniseingabestatusZuExportieren);
  }

  protected NlErgebniseingangStatus getErgebniseingangStatus() {
    return nlErgebniseingangStatus;
  }
}
