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

import static java.util.stream.Collectors.toList;

import java.util.List;
import java.util.Objects;

import javax.enterprise.inject.Specializes;
import javax.persistence.NoResultException;

import de.ivu.elect.business.gebietsbaum.entity.AbstractGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

@Specializes
public class NlWasGebietUniqueUKFacesValidator extends GebietUniqueUKFacesValidator {

  private static final long serialVersionUID = 1L;

  public NlWasGebietUniqueUKFacesValidator() {
    super();
  }

  @Override
  public boolean isValid(Gebiet gebiet) {
    if (!gebiet.isErfassungsgebiet()) {
      return super.isValid(gebiet);
    }

    try {
      List<Gebiet> gebieteInDb = gebietExtendedDAO.findByWahlAndNummer(gebiet.getWahl(), gebiet.getNummer()).stream().filter(AbstractGebiet::isErfassungsgebiet).collect(toList());

      if (gebieteInDb.isEmpty()) {
        return true;
      }

      if (gebieteInDb.size() == 1 && gebiet.isPersistent()) {
        return Objects.equals(gebieteInDb.get(0).getId(), gebiet.getId());
      }

      return false;
    } catch (NoResultException expected) {
    }

    return true;
  }
}
