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

import java.io.Serializable;
import java.util.Collection;
import java.util.EnumSet;

import de.ivu.elect.business.kandidatur.boundary.KandidaturConversationSelect;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahl.boundary.WahlartTemplate;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagConversationSelect;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;

import javax.inject.Inject;

public class WahlvorschlagsPersonPruefer implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  protected WahlvorschlagConversationSelect wahlvorschlagConversationSelect;

  @Inject
  protected KandidaturConversationSelect kandidaturConversationSelect;

  public WahlvorschlagsPersonPruefer() {
    super();
  }

  public boolean isIndividuelleWahlvorschlagsPersonHinzufuegenZulaessig(Kandidatur kandidatur) {
    return isWahlMitIndividuellenWahlvorschlagsPersonen(kandidatur.getWahl());
  }

  public boolean isWahlMitIndividuellenWahlvorschlagsPersonen(Wahl wahl) {
    return false;
  }

  public boolean isUnterstuetzerEingangssequenznummerErfasstAutomatisch(Wahl wahl) {
    return isUnterstuetzerEingangssequenznummerErforderlich(wahl) && isUnterstuetzerUnterschriftDokumentErforderlich(wahl); // ELECT-8965
  }

  public boolean isUnterstuetzerEingangssequenznummerErfasstManuell(Wahl wahl) {
    return isUnterstuetzerEingangssequenznummerErforderlich(wahl) && !isUnterstuetzerEingangssequenznummerErfasstAutomatisch(wahl);
  }

  protected boolean isUnterstuetzerEingangssequenznummerErforderlich(Wahl wahl) {
    return collectWahlartTemplatesUnterstuetzerEingangssequenznummerErforderlich().stream().anyMatch(wahlartTemplate -> wahlartTemplate.equalsWahlart(wahl));
  }

  // ELECTMUC-1233
  protected Collection< ? extends WahlartTemplate> collectWahlartTemplatesUnterstuetzerEingangssequenznummerErforderlich() {
    return EnumSet.complementOf(EnumSet.of(CommonWahlart.UNBEKANNT, CommonWahlart.BEGEHREN));
  }

  public boolean isUnterstuetzerUnterschriftDokumentErforderlich(Wahl wahl) {
    return collectWahlartTemplatesUnterstuetzerUnterschriftDokumentErforderlich().stream().anyMatch(wahlartTemplate -> wahlartTemplate.equalsWahlart(wahl));
  }

  protected Collection< ? extends WahlartTemplate> collectWahlartTemplatesUnterstuetzerUnterschriftDokumentErforderlich() {
    return EnumSet.of(CommonWahlart.KREISTAGSWAHL, CommonWahlart.GEMEINDERATSWAHL);
  }

  public boolean isWahlvorschlagsPersonVonAnderemWahlvorschlag(WahlvorschlagsPerson wahlvorschlagsPerson) {
    return wahlvorschlagConversationSelect.getEntity() != null
        && (!wahlvorschlagConversationSelect.getEntity().equals(wahlvorschlagsPerson.getWahlvorschlag())
        || kandidaturConversationSelect.getEntity() != null
        && !kandidaturConversationSelect.getEntity().equals(wahlvorschlagsPerson.getKandidatur()));
  }
}
