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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietExtendedDAO;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietPK;
import de.ivu.elect.jee.faces.AbstractEntityFacesValidator;

public class GruppeImGebietUniquePositionFacesValidator extends AbstractEntityFacesValidator<GruppeImGebietPK> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected GebietSessionSelect gebietSelect;

  @Inject
  protected GruppeImGebietExtendedDAO gruppeImGebietDao;

  @Override
  protected boolean isValid(GruppeImGebietPK pk, Object value) {
    if (isGebietSelected() && value instanceof Long) {
      List<GruppeImGebiet> result = findByGebietAndPosition(getGebiet(), (Long) value);

      return result.isEmpty() || result.size() == 1 && result.get(0).getPk().equals(pk);
    }

    return false;
  }

  private List<GruppeImGebiet> findByGebietAndPosition(Gebiet gebiet, Long position) {
    return gruppeImGebietDao.findByGebietAndRelativePosition(gebiet, position);
  }

  private boolean isGebietSelected() {
    return gebietSelect.isSelected();
  }

  private Gebiet getGebiet() {
    return gebietSelect.getEntity();
  }
}
