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

import java.util.Collections;
import java.util.List;

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

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.presentation.wahl.action.WahlZurBearbeitungAuswaehlenAction;
import de.ivu.elect.presentation.wahl.menu.AbstractWahlMenuItemEntry;

/**
 * ELECT-3619 - Zukünftige nicht gesperrte Wahlen im Wahl-Menü zur Auswahl anbieten
 *
 * Dynamische Menüs nicht per Injection möglich, daher maximal zehn Wahlen
 */
public abstract class AbstractWahlSelectMenuItemEntry extends AbstractWahlMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlExtendedDAO wahlExtendedDAO;

  @Inject
  private transient WahlZurBearbeitungAuswaehlenAction wahlZurBearbeitungAuswaehlenAction;

  @Inject
  private transient UserLocale userLocale;

  private WahlPK wahlPK;

  @Override
  protected UseCasePermission getUseCasePermission() {
    return wahlZurBearbeitungAuswaehlenAction.getRequiredPermission();
  }

  @Override
  public boolean isRendered() {
    return super.isRendered() && wahlPK != null && wahlZurBearbeitungAuswaehlenAction.isActionPossible(getWahl());
  }

  protected Wahl getWahl() {
    return wahlExtendedDAO.findByPrimaryKey(wahlPK);
  }

  public void setWahl(Wahl wahl) {
    this.wahlPK = wahl.getPk();
  }

  @Override
  protected List<String> getAdditionalTopicViewIds() {
    return Collections.singletonList("");
  }

  @Override
  public String doAction() {

    // String startViewId = startViewResolver.getStartViewId();
    String currentViewId = FacesContextUtil.getCurrentViewId(); // ELECT-4761 aktuellen View merken

    /*
     * NOTE ELECT-3744, dass der HACK mit dem doppelten Redirect notwendig ist, da einige Views die aktuelle ViewId
     * testen und ggf. IMMER auf sich selbst umleiten. Siehe auch AbstractWahlterminSelectMenuItemEntry.doAction() und
     * bspw. AbstractKumulierteStimmenSearchView.onGebietSelectChangeEvent().
     */

    if (wahlZurBearbeitungAuswaehlenAction.isActionPossible(getWahl())) {
      addInfoMessage("wahl.edit.action.select.success.message", getWahl().getName());

      // FacesContextUtil.redirectToViewNoRedirectParameter(currentViewId);

      wahlZurBearbeitungAuswaehlenAction.setCurrentlySelectedWahl(getWahl());

      FacesContextUtil.redirectToViewNoRedirectParameter(currentViewId);
      return NO_ACTION_NO_REDIRECT;
    }

    return currentViewId;
  }

  @Nullable
  @Override
  public String getTargetViewId() {
    return null; // action ausführen
  }

  @Override
  protected String getLabel() {
    return getMessage(getLabelKey(), cutLabelLength(getWahl().getName()));
  }

  @Override
  public String getLabelKey() {
    return "wahl.edit.action.select.menu";

  }

  @Override
  public String getIcon() {
    return wahlZurBearbeitungAuswaehlenAction.getIcon();
  }

  @Override
  public String getTitle() {
    if (wahlPK == null) {
      return super.getTitle();
    }

    Wahl wahl = getWahl();

    String nummer = "";
    if (!"0".equals(wahl.getWahltermin().getNummer())) {
      nummer = " (" + wahl.getWahltermin().getNummer() + ")";
    }

    return wahl.getName() + nummer + " (" + userLocale.formatDate(wahl.getWahldatum()) + ", " + wahl.getWahlart().getName() + ")";
  }

  @Override
  protected void attachParameterMap(StringBuilder sb) {
    // explizit kein Super-Aufruf, da hier KEINE wahlid an die URL gehängt werden soll!
  }

  public static class WahlSelect1MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect2MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect3MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect4MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect5MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect6MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect7MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect8MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect9MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlSelect10MenuItemEntry extends AbstractWahlSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  @Override
  protected boolean isShowBlockUi() {
    return true; // ELECT-4135
  }
}
