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

import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietPK;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.jee.faces.FacesMessageUtil;

@Specializes
public class WasGebietsbaumTreeBuilderLazy extends CoreGebietsbaumTreeBuilderLazy {

  private static final long serialVersionUID = -1L;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Nullable
  @Override
  protected Wahldurchfuehrungsgebiet getWurzelgebiet() {
    try {
      return wahldurchfuehrungsgebietExtendedDAO.findByWahlWurzelgebiet(getWahlSelected());
    } catch (NoResultException nre) {
      return null;
    } catch (NonUniqueResultException e) {
      FacesMessageUtil.addErrorMessage("mehr.als.ein.wurzelgebiet.vorhanden");
      return null;
    }
  }

  @Override
  protected List<Wahldurchfuehrungsgebiet> loadUntergebiete(Gebiet gebiet) {
    return gebiet.castTo(Wahldurchfuehrungsgebiet.class).getEntity().getGebieteSortiertNachPosition(wahldurchfuehrungsgebietExtendedDAO);

  }

  @Override
  protected Wahldurchfuehrungsgebiet loadGebiet(GebietPK pk) {
    if (pk == null) {
      return null;
    }
    return wahldurchfuehrungsgebietExtendedDAO.findByPrimaryKey(pk);
  }
}
