
package de.ivu.elect.presentation.gruppeimgebiet.action;

import java.util.List;

import javax.annotation.Nonnull;
import javax.inject.Named;

import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.ReihenfolgeBestaetigenOption;
import de.ivu.elect.presentation.gruppeimgebiet.GruppeImGebietSearchView;

@Named(GruppeImGebietPositionNachUntenVerschiebenAction.COMPONENT_NAME)
public class GruppeImGebietPositionNachUntenVerschiebenAction extends AbstractGruppeImGebietPositionVerschiebenAction {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gruppeImGebietPositionNachUntenVerschiebenAction";

  public GruppeImGebietPositionNachUntenVerschiebenAction() {
    super();
  }

  @Override
  public boolean isDisabledInternal(@Nonnull GruppeImGebiet entity) {
    if (entity == null || entity.getGruppe() == null || entity.getGruppe().isSystemGruppe()) {
      return true;
    }

    return entity.getVorgegebenePosition() != null /*UNFUG || !existiertGruppeImGebietDanach(entity)*/;
  }

  private boolean existiertGruppeImGebietDanach(GruppeImGebiet entity) {
    List<GruppeImGebiet> gruppenImGebiet = gruppeImGebietExtendedDAO
        .findByGebietAndUngleichGruppeArtOrderByRelativePosition(entity.getGebiet(), GruppeArt.SYSTEM_GRUPPE);
    gruppeImGebietReihenfolgeVorsortierer.sortiere(entity.getWahl(), gruppenImGebiet, wahlvorschlagRequestCache.getAlleWahlvorschlaege(),
        stimmenPoolExtendedDAOFactory);

    for (int i = 0; i < gruppenImGebiet.size(); i++) {
      GruppeImGebiet gruppeImGebiet = gruppenImGebiet.get(i);

      if (gruppeImGebiet.equals(entity) && i < gruppenImGebiet.size() - 1) {
        return true;
      }
    }

    return false;
  }

  @Override
  protected String doIt(GruppeImGebiet entity) {
    if (entity != null) {
      gruppeImGebietReihenfolgeBestaetiger.bestaetigeVorsortierteReihenfolge(entity.getGebiet(), ReihenfolgeBestaetigenOption.NUR_RELATIVE_POSITIONEN_AUF_GEBIET);
      gruppeImGebietEdit.verschiebePositionNachUnten(entity);
    }

    return GruppeImGebietSearchView.VIEW_ID;
  }

  @Override
  public String getLabelKey() {
    return "gruppe.im.gebiet.search.action.position.nach.unten.verschieben";
  }

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