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.WahlterminExtendedDAO;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminPK;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.presentation.wahl.action.WahlterminZurBearbeitungAuswaehlenAction;
import de.ivu.elect.presentation.wahl.menu.AbstractWahlterminMenuItemEntry;


import static java.util.Objects.nonNull;

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

  private static final long serialVersionUID = 1L;

  @Inject
  private WahlterminExtendedDAO wahlterminExtendedDAO;

  @Inject
  private WahlterminZurBearbeitungAuswaehlenAction wahlterminZurBearbeitungAuswaehlenAction;

  @Inject
  private transient UserLocale userLocale;

  private WahlterminPK wahlterminPK;

  public AbstractWahlterminSelectMenuItemEntry() {
    super();
  }

  @Override
  public UseCasePermission getUseCasePermission() {
    return wahlterminZurBearbeitungAuswaehlenAction.getRequiredPermission();
  }

  @Override
  public boolean isRendered() {
    return super.isRendered() && nonNull(wahlterminPK) && wahlterminZurBearbeitungAuswaehlenAction.isActionPossible(getWahltermin());
  }

  protected Wahltermin getWahltermin() {
    return wahlterminExtendedDAO.findByPrimaryKey(wahlterminPK);
  }

  public void setWahltermin(Wahltermin wahltermin) {
    this.wahlterminPK = wahltermin.getPk();
  }

  @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 AbstractWahlSelectMenuItemEntry.doAction() und bspw.
     * AbstractKumulierteStimmenSearchView.onGebietSelectChangeEvent().
     */

    if (wahlterminZurBearbeitungAuswaehlenAction.isActionPossible(getWahltermin())) {
      addInfoMessage("wahltermin.edit.action.select.success.message", getWahltermin().getName());

      //FacesContextUtil.redirectToViewNoRedirectParameter(currentViewId);

      wahlterminZurBearbeitungAuswaehlenAction.setCurrentlySelectedWahltermin(getWahltermin());

      FacesContextUtil.redirectToViewNoRedirectParameter(currentViewId);
      return NO_ACTION_NO_REDIRECT;
    }
    return currentViewId;
  }

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

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

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

  @Override
  public String getTitle() {
    if (wahlterminPK == null) {
      return super.getTitle();
    }
    Wahltermin wahltermin = getWahltermin();
    String nummer = "";
    if (!"0".equals(wahltermin.getNummer())) {
      nummer = " (" + wahltermin.getNummer() + ")";
    }
    return wahltermin.getName() + nummer + " (" + userLocale.formatDate(wahltermin.getWahldatum()) + ")";
  }

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

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

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

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

  public static class WahlterminSelect1MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect2MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect3MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect4MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect5MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect6MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect7MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect8MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect9MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class WahlterminSelect10MenuItemEntry extends AbstractWahlterminSelectMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }
}
