
package de.ivu.elect.business.personenpruefung.control;

import static de.ivu.elect.jee.entity.EntityUtil.castTo;
import static java.util.stream.Collectors.groupingBy;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Predicate;

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

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.pruefung.boundary.ZulassungPrueferDAOFactory;
import de.ivu.elect.business.wahl.boundary.WahlZulassungspruefung;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;

@Specializes
public class CorePersonenPruefProzess extends PersonenPruefProzess {

  @Inject
  private transient ZulassungPrueferDAOFactory zulassungPrueferDAOFactory;

  public CorePersonenPruefProzess() {
    super();
  }

  @Override
  public Collection<Personendaten> getPersonendatenMitDeaktivierterPruefung(Collection<Personendaten> personendaten) {
    List<Personendaten> result = new ArrayList<>();

    Map<Wahl, List<Personendaten>> personendatenInZulassungspruefungPerWahl = personendaten.stream() //
        .filter(personendatenInZulassungspruefung()) //
        .collect(groupingBy(Personendaten::getWahl));

    for (Entry<Wahl, List<Personendaten>> entry : personendatenInZulassungspruefungPerWahl.entrySet()) {
      Wahl wahl = entry.getKey();

      if (isZulassungPrueferDeaktiviert(wahl)) {
        result.addAll(entry.getValue());
      }
    }

    return result;
  }

  // ELECT-15792, ELECTMUC-3115
  protected Predicate<Personendaten> personendatenInZulassungspruefung() {
    return personendaten -> personendaten != null && (personendaten.isInstanceOf(Kandidatur.class) || personendaten.isInstanceOf(Wahlausschussmitglied.class)
        || personendaten.isInstanceOf(WahlvorschlagsPerson.class) && !castTo(personendaten, WahlvorschlagsPerson.class).isUnterstuetzer());
  }

  protected boolean isZulassungPrueferDeaktiviert(Wahl wahl) {
    return !new WahlZulassungspruefung(wahl, zulassungPrueferDAOFactory.createZulassungPruefer()).isZulassungPrueferAktiviert();
  }
}
