
package de.ivu.elect.presentation.stimmeingabe;

import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.NlWasGebietCustomDataErgebniseingangProtokoll;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangSearchParameters;
import de.ivu.elect.business.stimmeingabe.control.ErgebniseingangByEingangssequenznummerComparator;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsfehlerstatus;

@Specializes
public class NlErgebniseingangSearchView extends ErgebniseingangSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  public NlErgebniseingangSearchView() {
    super();
  }

  @Override
  protected void initSearchParametersByDefaults() {
    super.initSearchParametersByDefaults();

    ErgebniseingangSearchParameters searchParameters = getSearchParameters();

    if (searchParameters != null) {
      searchParameters.setNurLetztenEingangProGebietAnzeigen(false); // ELECTVAPP-2126
    }
  }

  @Override
  protected List<Ergebniseingang> performSearch() {
    List<Ergebniseingang> result = new ArrayList<>(super.performSearch());

    if (!getSearchParameters().isNurLetztenEingangProGebietAnzeigen()) {
      Wahldurchfuehrungsgebiet auswertungsgebiet = wahldurchfuehrungsgebietExtendedDAO.attach(getSearchParameters().getWahldurchfuehrungsgebiet());

      if (auswertungsgebiet != null) {
        NlWasGebietCustomDataErgebniseingangProtokoll nlWasGebietCustomDataErgebniseingangProtokoll = new NlWasGebietCustomDataErgebniseingangProtokoll();

        Collection<Ergebniseingangsart> ergebniseingangsarten = getSearchParameters().getErgebniseingangsart() == null ? emptyList() : asList(getSearchParameters().getErgebniseingangsart());
        Collection<Ergebniseingabestufe> ergebniseingabestufen = getSearchParameters().getErgebniseingabestufen();
        Collection<Ergebniseingangsfehlerstatus> ergebniseingangsfehlerstatus = getSearchParameters().getErgebniseingangsfehlerstatus();

        for (Wahldurchfuehrungsgebiet erfassungsgebiete : auswertungsgebiet.getErfassungsgebieteUnterhalb(gebietExtendedDAO)) {
          result.addAll(nlWasGebietCustomDataErgebniseingangProtokoll.collectErgebniseingaengeProtokolliert(erfassungsgebiete).stream() //
              .filter(ergebniseingang -> ergebniseingang != null //
                  && (ergebniseingangsarten.isEmpty() || ergebniseingangsarten.contains(ergebniseingang.getErgebniseingangsart())) //
                  && (ergebniseingabestufen.isEmpty() || ergebniseingabestufen.contains(ergebniseingang.getErgebniseingabestufe())) //
                  && (ergebniseingangsfehlerstatus.isEmpty() || ergebniseingangsfehlerstatus.contains(ergebniseingang.getErgebniseingangsfehlerstatus())) //
              ).collect(toList()) //
          );
        }

        result.sort(ErgebniseingangByEingangssequenznummerComparator.DESCENDING);
      }
    }

    return result;
  }
}
