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

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.wahl.entity.ExternerLinkPermission;
import de.ivu.elect.business.wahl.entity.WahlParameterExtendedLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.presentation.menu.AbstractExternerLinkMenuItemEntry;

public abstract class AbstractWahlparameterExternerLinkMenuItemEntry extends AbstractExternerLinkMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlParameterExtendedLoader wahlParameterExtendedLoader;

  public AbstractWahlparameterExternerLinkMenuItemEntry() {
    super();
  }

  @Override
  protected boolean hasUseCasePermission() {
    String permissionAsString = wahlParameterExtendedLoader.resolveStringValue(wahlOderWahlterminSessionSelect.getEntity(), getPermissionParameter());

    if (StringUtils.isBlank(permissionAsString)) {
      return false;
    }

    return hasUseCasePermission(ExternerLinkPermission.valueOf(permissionAsString).getUseCasePermission());
  }

  @Override
  protected String getUrlForLink() {
    return wahlParameterExtendedLoader.resolveStringValue(wahlOderWahlterminSessionSelect.getEntity(), getUrlParameter());
  }

  @Override
  protected String getLabelForLink() {
    return wahlParameterExtendedLoader.resolveStringValue(wahlOderWahlterminSessionSelect.getEntity(), getLabelParameter());
  }

  protected abstract WahlParameterWerte getLabelParameter();

  protected abstract WahlParameterWerte getUrlParameter();

  protected abstract WahlParameterWerte getPermissionParameter();

  public static class ExternerLink1MenuItemEntry extends AbstractWahlparameterExternerLinkMenuItemEntry {

    private static final long serialVersionUID = 1L;

    @Override
    protected WahlParameterWerte getLabelParameter() {
      return WahlParameterWerte.EXTERNER_LINK_1_LABEL;
    }

    @Override
    protected WahlParameterWerte getUrlParameter() {
      return WahlParameterWerte.EXTERNER_LINK_1_URL;
    }

    @Override
    protected WahlParameterWerte getPermissionParameter() {
      return WahlParameterWerte.EXTERNER_LINK_1_PERMISSION;
    }
  }

  public static class ExternerLink2MenuItemEntry extends AbstractWahlparameterExternerLinkMenuItemEntry {

    private static final long serialVersionUID = 1L;

    @Override
    protected WahlParameterWerte getLabelParameter() {
      return WahlParameterWerte.EXTERNER_LINK_2_LABEL;
    }

    @Override
    protected WahlParameterWerte getUrlParameter() {
      return WahlParameterWerte.EXTERNER_LINK_2_URL;
    }

    @Override
    protected WahlParameterWerte getPermissionParameter() {
      return WahlParameterWerte.EXTERNER_LINK_2_PERMISSION;
    }
  }

  public static class ExternerLink3MenuItemEntry extends AbstractWahlparameterExternerLinkMenuItemEntry {

    private static final long serialVersionUID = 1L;

    @Override
    protected WahlParameterWerte getLabelParameter() {
      return WahlParameterWerte.EXTERNER_LINK_3_LABEL;
    }

    @Override
    protected WahlParameterWerte getUrlParameter() {
      return WahlParameterWerte.EXTERNER_LINK_3_URL;
    }

    @Override
    protected WahlParameterWerte getPermissionParameter() {
      return WahlParameterWerte.EXTERNER_LINK_3_PERMISSION;
    }
  }

  public static class ExternerLink4MenuItemEntry extends AbstractWahlparameterExternerLinkMenuItemEntry {

    private static final long serialVersionUID = 1L;

    @Override
    protected WahlParameterWerte getLabelParameter() {
      return WahlParameterWerte.EXTERNER_LINK_4_LABEL;
    }

    @Override
    protected WahlParameterWerte getUrlParameter() {
      return WahlParameterWerte.EXTERNER_LINK_4_URL;
    }

    @Override
    protected WahlParameterWerte getPermissionParameter() {
      return WahlParameterWerte.EXTERNER_LINK_4_PERMISSION;
    }
  }

  public static class ExternerLink5MenuItemEntry extends AbstractWahlparameterExternerLinkMenuItemEntry {

    private static final long serialVersionUID = 1L;

    @Override
    protected WahlParameterWerte getLabelParameter() {
      return WahlParameterWerte.EXTERNER_LINK_5_LABEL;
    }

    @Override
    protected WahlParameterWerte getUrlParameter() {
      return WahlParameterWerte.EXTERNER_LINK_5_URL;
    }

    @Override
    protected WahlParameterWerte getPermissionParameter() {
      return WahlParameterWerte.EXTERNER_LINK_5_PERMISSION;
    }
  }
}
