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

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietConversationSelect;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.wahlvorschlag.boundary.ReferendumOptionExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagPK;
import de.ivu.elect.jee.faces.AbstractEntityFacesValidator;

public class ReferendumOptionUniquePositionFacesValidator extends AbstractEntityFacesValidator<WahlvorschlagPK> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected GruppeImGebietConversationSelect referendumVorlageImGebietSelect;

  @Inject
  protected ReferendumOptionExtendedDAO referendumOptionDao;

  @Override
  protected boolean isValid(WahlvorschlagPK pk, Object value) {
    if (isReferendumVorlageSelected() && value instanceof Long) {
      List<ReferendumOption> result = findByReferendumVorlageImGebietAndPosition(getReferendumVorlageImGebiet(),
          (Long) value);

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

    return false;
  }

  private List<ReferendumOption> findByReferendumVorlageImGebietAndPosition(GruppeImGebiet referendumVorlageImGebiet,
      Long position) {
    return referendumOptionDao.findByReferendumVorlageImGebietAndPosition(referendumVorlageImGebiet, position);
  }

  private boolean isReferendumVorlageSelected() {
    return referendumVorlageImGebietSelect.isSelected();
  }

  private GruppeImGebiet getReferendumVorlageImGebiet() {
    return referendumVorlageImGebietSelect.getEntity();
  }
}
