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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

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

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;

@Specializes
public class NlKandidaturSearch extends KandidaturSearch {

  public NlKandidaturSearch() {
    super();
  }

  @Override
  protected List<Kandidatur> querySearchResult(KandidaturSearchParameters searchParameters) {
    return filterByKandidaturenIdentischExcluded(super.querySearchResult(searchParameters));
  }

  protected List<Kandidatur> filterByKandidaturenIdentischExcluded(List<Kandidatur> kandidaturen) {
    List<Kandidatur> result = new ArrayList<>();

    Set<Kandidatur> gesehene = new HashSet<>();

    for (Kandidatur kandidatur : kandidaturen) {
      if (kandidatur.isListenkandidatur() && !gesehene.contains(kandidatur)) {
        Listenkandidatur listenkandidatur = castTo(kandidatur, Listenkandidatur.class);
        Listenkandidatur listenkandidaturRepraesentativ = listenkandidatur;

        Collection<Listenkandidatur> listenkandidaturenVerknuepft = new HashSet<>(listenkandidatur.getIdentischVerknuepfteListenkandidaturen());
        listenkandidaturenVerknuepft.add(listenkandidatur);

        Collection<Listenkandidatur> listenkandidaturenVerknuepftZugelassen = new HashSet<>();
        Collection<Listenkandidatur> listenkandidaturenVerknuepftNichtZugelassen = new HashSet<>();

        for (Listenkandidatur listenkandidaturVerknuepft : listenkandidaturenVerknuepft) {
          gesehene.add(listenkandidaturVerknuepft);

          if (listenkandidaturVerknuepft.isZugelassen()) {
            listenkandidaturenVerknuepftZugelassen.add(listenkandidaturVerknuepft);
          } else if (listenkandidaturVerknuepft.isNichtZugelassenImSinneAbgelehnt()) {
            listenkandidaturenVerknuepftNichtZugelassen.add(listenkandidaturVerknuepft);
          }
        }

        // ELECT-11299
        // "Zugelassen" -> EINE ist zugelassen
        // "Nicht zugelassen" -> ALLE sind abgelehnt
        // "???" -> ansonsten (bspw. "Offen")
        if (!listenkandidaturenVerknuepftZugelassen.isEmpty()) {
          listenkandidaturRepraesentativ = listenkandidaturenVerknuepftZugelassen.iterator().next();
        } else if (listenkandidaturenVerknuepftNichtZugelassen.size() != listenkandidaturenVerknuepft.size()) {
          Collection<Listenkandidatur> listenkandidaturenVerknuepftSonstige = new HashSet<>(listenkandidaturenVerknuepft);
          listenkandidaturenVerknuepftSonstige.removeAll(listenkandidaturenVerknuepftNichtZugelassen);

          if (!listenkandidaturenVerknuepftSonstige.isEmpty()) {
            listenkandidaturRepraesentativ = listenkandidaturenVerknuepftSonstige.iterator().next();
          }
        }

        result.add(listenkandidaturRepraesentativ);
      }
    }

    return result;
  }

  @Override
  protected List<Kandidatur> filtereGebiete(List<Kandidatur> list, Gebiet gebiet) {
    return list; // Immer alle anzeigen...
  }
}
