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

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.NoResultException;

import de.ivu.elect.business.gruppe.boundary.GruppeExtendedDAO;
import de.ivu.elect.business.gruppe.control.PolitischeGruppeSchluesselNormalisierer;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppePK;
import de.ivu.elect.business.gruppe.entity.GruppeUK;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.mandant.boundary.MandantExtendedDAO;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlUK;
import de.ivu.elect.jee.entity.DAO;
import de.ivu.elect.jee.faces.AbstractEntityUniqueUKFacesValidator;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;

@RequestScoped
public class UniqueGruppeSchluesselFacesValidator extends AbstractEntityUniqueUKFacesValidator<Gruppe, GruppePK, GruppeUK> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelect wahlSelect;

  @Inject
  private transient GruppeExtendedDAO extendedDAO;

  @Inject
  private transient KonfigurationExtendedLoader konfigurationExtendedLoader;

  @Inject
  private transient MandantExtendedDAO mandantExtendedDAO;

  @Inject
  private transient PolitischeGruppeSchluesselNormalisierer politischeGruppeSchluesselNormalisierer;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  public UniqueGruppeSchluesselFacesValidator() {
    super();
  }

  @Override
  protected GruppeUK createUK(Object schluessel) {
    return new GruppeUK(normalize(schluessel), getWahlUK());
  }

  @Nullable
  private WahlUK getWahlUK() {
    Wahl wahl = wahlSelect.getEntity();
    if (wahl==null){
      return null;
    }
    return wahl.getWahlUK();
  }

  @Override
  public boolean isValid(GruppePK pk, GruppeUK uk) {
    if (uk.getWahlUK()==null) {
      try {
        Gruppe gruppeInDb = extendedDAO.findByOhneWahlAndSchluessel(uk.getSchluessel());
        return gruppeInDb.getPk().equals(pk);
      } catch (NoResultException noResultException) {
        return true;
      }
    }
    return super.isValid(pk, uk);
  }

  private String normalize(Object schluessel) {
    return politischeGruppeSchluesselNormalisierer.normalisiere((String) schluessel, mandantSessionSelect.getMandant(), konfigurationExtendedLoader, mandantExtendedDAO);
  }

  @Override
  protected DAO<Gruppe, GruppePK, GruppeUK> getDao() {
    return extendedDAO;
  }
}
