
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(GruppeImGebietPositionNachObenVerschiebenAction.COMPONENT_NAME)
public class GruppeImGebietPositionNachObenVerschiebenAction extends AbstractGruppeImGebietPositionVerschiebenAction {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gruppeImGebietPositionNachObenVerschiebenAction";

  public GruppeImGebietPositionNachObenVerschiebenAction() {
    super();
  }

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

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

  private boolean existiertGruppeImGebietDavorUndHatNichtFixiertePosition(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 > 0 && gruppenImGebiet.get(i - 1).getVorgegebenePosition() == null) {
        return true;
      }
    }

    return false;
  }

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

    return GruppeImGebietSearchView.VIEW_ID;
  }

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

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