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

import java.util.stream.Stream;

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

import de.ivu.elect.business.ergebnis.boundary.NlErgebniseingabestatuswechelPruefer;
import de.ivu.elect.jee.presentation.menu.MenuEntry;
import de.ivu.elect.presentation.gruppe.menu.GruppeKumulierteStimmenAnzeigenMenuItemEntry;
import de.ivu.elect.presentation.gruppe.menu.GruppeNachErfassungsgebietStimmenAnzeigenGrafischMenuItemEntry;
import de.ivu.elect.presentation.gruppe.menu.GruppeNachErfassungsgebietStimmenAnzeigenTabellarischMenuItemEntry;

@Specializes
public class NlErgebnisMenuDisabled extends ErgebnisMenuDisabled {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlErgebniseingabestatuswechelPruefer nlErgebniseingabestatuswechelPruefer;

  public NlErgebnisMenuDisabled() {
    super();
  }

  @Override
  public boolean isDisabled(MenuEntry menuEntry) {
    return super.isDisabled(menuEntry) || isErgebnisAuswertungMenuEntry(menuEntry) && !getErgebniseingabestatuswechelPruefer().isErgebnisAuswertungMoeglich(getSelectedErgebnis());
  }

  // ELECT-9981
  private boolean isErgebnisAuswertungMenuEntry(MenuEntry menuEntry) {
    return Stream.of( //
        DirektkandidaturKumulierteStimmenAnzeigenMenuItemEntry.class, //

        ListenkandidaturKumulierteStimmenAnzeigenMenuItemEntry.class, //
        ListenkandidaturNachErfassungsgebietStimmenAnzeigenMenuItemEntry.class, //

        GruppeKumulierteStimmenAnzeigenMenuItemEntry.class, //
        GruppeNachErfassungsgebietStimmenAnzeigenGrafischMenuItemEntry.class, //
        GruppeNachErfassungsgebietStimmenAnzeigenTabellarischMenuItemEntry.class, //

        ReferendumOptionKumulierteStimmenAnzeigenMenuItemEntry.class, //

        StimmenImportMenuItemEntry.class //
    ).noneMatch(menuEntryClassEnabledByDefault -> menuEntryClassEnabledByDefault.isAssignableFrom(menuEntry.getClass()));
  }

  protected NlErgebniseingabestatuswechelPruefer getErgebniseingabestatuswechelPruefer() {
    return nlErgebniseingabestatuswechelPruefer;
  }
}
