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

import java.util.Set;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.gebietsbaum.control.PruefkennzeichenGenerieren;
import de.ivu.elect.business.gebietsbaum.entity.AbstractGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietPruefkennzeichenGenerierenArt;
import de.ivu.elect.business.gebietsbaum.entity.GebietPruefkennzeichenGenerierenEindeutigkeit;
import de.ivu.elect.business.gebietsbaum.entity.GebietPruefkennzeichenGenerierenOptions;
import de.ivu.elect.business.wahl.boundary.WahlDAO;

@Stateless
@Specializes
public class CoreGebietPruefkennzeichenGenerieren extends PruefkennzeichenGenerieren {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  public Long generierePruefkennzeichenFuerErfassungsgebiete(GebietPruefkennzeichenGenerierenOptions gebietPruefkennzeichenGenerierenOptions) {

    Set<Gebiet> gebiete = gebietPruefkennzeichenGenerierenOptions.getWahlen().stream()
        .flatMap(wahlPK -> gebietDAO.findByWahl(wahlDAO.findByPrimaryKey(wahlPK)).stream())
        .filter(gebiet -> gebietPruefkennzeichenGenerierenOptions.getGebieteMitSchreibrechten().contains(gebiet.getPk()))
        .filter(AbstractGebiet::isErfassungsgebiet)
        .collect(Collectors.toSet());
    GebietPruefkennzeichenGenerierenArt gebietPruefkennzeichenGenerierenArt = gebietPruefkennzeichenGenerierenOptions
        .getGebietPruefkennzeichenGenerierenArt();
    GebietPruefkennzeichenGenerierenEindeutigkeit gebietPruefkennzeichenGenerierenEindeutigkeit = gebietPruefkennzeichenGenerierenOptions
        .getGebietPruefkennzeichenGenerierenEindeutigkeit();

    return generierePruefkennzeichen(gebiete, gebietPruefkennzeichenGenerierenArt, gebietPruefkennzeichenGenerierenEindeutigkeit,
        gebietPruefkennzeichenGenerierenOptions.isBestehendeKennzeichenUeberschreiben());
  }

}
