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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import javax.inject.Inject;

import de.ivu.elect.business.WusFeaturesAktiviert;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.presentation.menu.AbstractSubMenuEntry;
import de.ivu.elect.jee.presentation.menu.MenuEntry;
import de.ivu.elect.presentation.gruppeimgebiet.menu.GruppeImGebietMainMenuEntry;
import de.ivu.elect.presentation.kandidatur.menu.KandidaturExportMenuItemEntry;
import de.ivu.elect.presentation.kandidatur.menu.KandidaturSearchMenuItemEntry;
import de.ivu.elect.presentation.personenpruefung.menu.PersonenpruefungMainMenu;
import de.ivu.elect.presentation.wahlvorschlagsperson.menu.WahlvorschlagsPersonExportMenuItemEntry;
import de.ivu.elect.presentation.wahlvorschlagsperson.menu.WahlvorschlagsPersonImportMenuItemEntry;
import de.ivu.elect.presentation.wahlvorschlagsperson.menu.WahlvorschlagsPersonSearchMenuItemEntry;

public class WahlvorschlagMainMenuEntry extends AbstractSubMenuEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient WusFeaturesAktiviert wusFeaturesAktiviert;

  @Inject
  protected transient WahlvorschlagSearchMenuItemEntry wahlvorschlagSearchMenuItemEntry;

  @Inject
  protected transient KandidaturSearchMenuItemEntry kandidaturSearchMenuItemEntry;

  @Inject
  protected transient WahlvorschlagStatusuebersichtMenuItemEntry wahlvorschlagStatusuebersichtMenuItemEntry;

  @Inject
  protected transient WahlvorschlagImportMenuItemEntry wahlvorschlagImportMenuItemEntry;

  @Inject
  protected transient WahlvorschlagExportMenuItemEntry wahlvorschlagExportMenuItemEntry;

  @Inject
  protected transient KandidaturExportMenuItemEntry kandidaturExportMenuItemEntry;

  @Inject
  protected transient WahlvorschlagsPersonSearchMenuItemEntry wahlvorschlagsPersonSearchMenuItemEntry;

  @Inject
  protected transient GruppeImGebietMainMenuEntry gruppeImGebietMainMenuEntry;

  @Inject
  protected transient SperrlisteExportMenuItemEntry sperrlisteExportMenuItemEntry;

  @Inject
  protected transient WahlvorschlagsPersonExportMenuItemEntry wahlvorschlagsPersonExportMenuItemEntry;

  @Inject
  protected transient WahlvorschlagsPersonImportMenuItemEntry wahlvorschlagsPersonImportMenuItemEntry;

  @Inject
  protected transient WahlSessionSelect wahlSessionSelect;

  @Inject
  protected transient WvpWahlvorschlagMainMenuEntry wvpWahlvorschlagMainMenuEntry;

  @Inject
  private transient PersonenpruefungWahlvorschlagMainMenuEntries personenpruefungWahlvorschlagMainMenuEntries;

  @Inject
  private transient PersonenpruefungMainMenu personenpruefungMainMenu;

  public WahlvorschlagMainMenuEntry() {
    super();
  }

  @Override
  public List<MenuEntry> getSubMenuEntriesSorted() {
    List<MenuEntry> result = new ArrayList<>();

    result.add(wahlvorschlagStatusuebersichtMenuItemEntry);
    result.add(wahlvorschlagSearchMenuItemEntry);
    result.add(wahlvorschlagImportMenuItemEntry);
    result.addAll(wvpWahlvorschlagMainMenuEntry.getImportMenuEntriesSorted());
    result.add(wahlvorschlagExportMenuItemEntry);
    result.addAll(wvpWahlvorschlagMainMenuEntry.getExportMenuEntriesSorted());

    result.add(separator);
    result.add(kandidaturSearchMenuItemEntry);
    result.addAll(personenpruefungWahlvorschlagMainMenuEntries.getKandidaturMenuItemEntries());
    result.add(kandidaturExportMenuItemEntry);

    if (wusFeaturesAktiviert.isWusWasZusammen()) {
      result.add(separator);
      result.addAll(gruppeImGebietMainMenuEntry.getSubMenuEntriesSorted());
    }

    addWahlvorschlagsPersonMenuItemEntries(result);

    result.addAll(personenpruefungWahlvorschlagMainMenuEntries.getExternerAbgleichMenuItemEntries());

    addWahlvorschlagPruefungMenuItemEntries(result);

    return result;
  }

  private void addWahlvorschlagsPersonMenuItemEntries(List<MenuEntry> result) {
    result.add(separator);
    result.add(wahlvorschlagsPersonSearchMenuItemEntry);
    result.addAll(personenpruefungWahlvorschlagMainMenuEntries.getWahlvorschlagsPersonMenuItemEntries());
    if (isAddWahlvorschlagsPersonExportImportEntries()) {
      result.add(wahlvorschlagsPersonExportMenuItemEntry);
      result.add(wahlvorschlagsPersonImportMenuItemEntry);
    }
  }

  protected boolean isAddWahlvorschlagsPersonExportImportEntries() {
    return Stream.of(CommonWahlart.BUNDESTAGSWAHL, CommonWahlart.EUROPAWAHL).anyMatch(w -> w.equalsWahlart(wahlSessionSelect.getEntity()));
  }

  protected void addWahlvorschlagPruefungMenuItemEntries(List<MenuEntry> result) {
    if (wusFeaturesAktiviert.isWusOderWusWasZusammen()) {
      result.add(separator);
      result.add(sperrlisteExportMenuItemEntry);
    }
    if (wusFeaturesAktiviert.isWusWasZusammen()) {
      result.add(separator);
      result.addAll(personenpruefungMainMenu.getSubMenuEntriesSorted());
    }
  }

  @Override
  public String getLabelKey() {
    return getMeta().getMehrzahlMessageKey();
  }

  private Meta getMeta() {
    return wahlvorschlagSearchMenuItemEntry.getMeta();
  }

  @Override
  public String getIcon() {
    if (personenpruefungWahlvorschlagMainMenuEntries.isIconAlert()) {
      return appIcons.getIconAlert();
    }
    return super.getIcon();
  }
}
