package de.ivu.elect.business.gebietsbaum.boundary;

import java.util.List;

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.presentation.security.NlPrivatePublicKeyNeeded;

@Stateless
@Specializes
public class NlWasGebietSearch extends WasGebietSearch {

  @Inject
  private transient NlPrivatePublicKeyNeeded nlPrivatePublicKeyNeeded;

  @Inject
  private transient WahlExtendedDAO wahlExtendedDAO;

  @Override
  protected List<Gebiet> getSearchResultByWahl(Wahl wahl, GebietSearchParameters searchParameters) {
    if (isNurAusgewaehlteGebieteAnzeigen(searchParameters)) {
      return super.getSearchResultByWahl(wahl, searchParameters);
    }
    // ELECTVAPP-1784 auf dem obersten Gebiet alle Untergebiete anzeigen
    return dao.findByWahl(wahl);
  }

  @Override
  protected void addOberstesGebiet(GebietSearchParameters searchParameters, List<Gebiet> result) {
    // ELECTVAPP-1784 nur ausgewähltes Gebiet anzeigen, wenn nicht sowieso alle Gebiete angezeigt werden
    if (isNurAusgewaehlteGebieteAnzeigen(searchParameters)) {
      super.addOberstesGebiet(searchParameters, result);
    }
  }

  private boolean isNurAusgewaehlteGebieteAnzeigen(GebietSearchParameters searchParameters) {
    return !searchParameters.hasUebergeordnetesGebiet() || !nlPrivatePublicKeyNeeded.isPublicKeyNeeded(
        wahlExtendedDAO.attach(searchParameters.getWahl()).getMandant(), searchParameters.getWahl()) || dao.attach(searchParameters.getUebergeordnetesGebiet())
        .hasUebergeordnetesGebiet();
  }
}
