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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.wahlrechtspruefung.entity.NlWahlrechtspruefung;
import de.ivu.elect.business.wahlrechtspruefung.entity.Wahlrechtspruefung;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.NlListe;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.EagerLoadingCollector;

@Specializes
public class NlWahlrechtspruefungSearch extends WahlrechtspruefungSearch {

  @Inject
  private transient WahlvorschlagExtendedDAO wahlvorschlagExtendedDAO;

  @Override
  public List<Wahlrechtspruefung> getSearchResult(WahlrechtspruefungSearchParameters searchParameters, EagerLoadingCollector<Wahlrechtspruefung> eagerLoadingCollector) {
    List<Wahlrechtspruefung> searchResult = super.getSearchResult(searchParameters, eagerLoadingCollector);

    // ELECT-10581
    Wahlvorschlag wahlvorschlagNotAttached = searchParameters.getWahlvorschlag();
    if (wahlvorschlagNotAttached != null) {
      Wahlvorschlag wahlvorschlag = wahlvorschlagExtendedDAO.attach(wahlvorschlagNotAttached);
      if (wahlvorschlag.isListe()) {
        if (NlListe.isBlancoListe(wahlvorschlag.castTo(Liste.class).getEntity())) {
          return searchResult.stream().filter(wahlrechtspruefung -> NlWahlrechtspruefung.from(wahlrechtspruefung).isAnzuzeigen() || isTrotzdemInBlancolisteAnzeigenObwohlKannIrrelevantSein(wahlrechtspruefung))
              .collect(Collectors.toCollection(() -> new ArrayList<>(searchResult.size())));
        }
      }
    }
    return searchResult;
  }

  private boolean isTrotzdemInBlancolisteAnzeigenObwohlKannIrrelevantSein(Wahlrechtspruefung wahlrechtspruefung) {
    // Auf Zuruf von 
    return !NlWahlrechtspruefung.from(wahlrechtspruefung).isInitialErfuellt();
  }
}
