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

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

import java.util.Optional;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.NlKandidatur;
import de.ivu.elect.business.wahl.boundary.WahlZulassungspruefung;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.NlListe;
import de.ivu.elect.business.wahlvorschlag.entity.NlListeStatus;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

@Specializes
public class NlZulassungspruefungRegeln extends ZulassungspruefungRegeln {

  private static final long serialVersionUID = 1L;

  public NlZulassungspruefungRegeln() {
    super();
  }

  @Override
  public boolean isZulassungBestaetigenZulaessig(Kandidatur kandidatur, WahlZulassungspruefung wahlZulassungspruefung) {
    /*
     * ACHTUNG: Bei Änderungen auch NlWusListenkandidaturEdit.isZulassungBestaetigenZulaessig(Kandidatur kandidatur) berücksichtigen!
     */
    return super.isZulassungBestaetigenZulaessig(kandidatur, wahlZulassungspruefung)
        && (kandidatur.isZugelassen() || getNlListeStatus(kandidatur, wahlZulassungspruefung).map(NlListeStatus::isZulassungBestaetigenZulaessig).orElse(false)); // ELECT-13359
  }

  @Override
  public boolean isZulassungBestaetigenZulaessig(Wahlvorschlag wahlvorschlag, WahlZulassungspruefung wahlZulassungspruefung) {
    return super.isZulassungBestaetigenZulaessig(wahlvorschlag, wahlZulassungspruefung)
        && (wahlvorschlag.isZugelassen() || getNlListeStatus(wahlvorschlag, wahlZulassungspruefung).map(NlListeStatus::isZulassungBestaetigenZulaessig).orElse(false)); // ELECT-13359
  }

  @Override
  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(Wahlvorschlag wahlvorschlag, WahlZulassungspruefung wahlZulassungspruefung) {
    return isZulassungAufhebenKeineZulassungsfaehigkeitZulaessig(wahlvorschlag)
        && super.isZulassungAufhebenKeineZulassungsfaehigkeitBeimZulassungsausschussZulaessig(wahlvorschlag, wahlZulassungspruefung);
  }

  @Override
  public boolean isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(Wahlvorschlag wahlvorschlag, WahlZulassungspruefung wahlZulassungspruefung) {
    return isZulassungAufhebenKeineZulassungsfaehigkeitZulaessig(wahlvorschlag)
        && super.isZulassungAufhebenKeineZulassungsfaehigkeitNachZulassungsausschussZulaessig(wahlvorschlag, wahlZulassungspruefung);
  }

  private boolean isZulassungAufhebenKeineZulassungsfaehigkeitZulaessig(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag != null && !wahlvorschlag.isListe(); // ELECT-9769
  }

  private Optional<NlListeStatus> getNlListeStatus(Kandidatur kandidatur, WahlZulassungspruefung wahlZulassungspruefung) {
    return Optional.ofNullable(kandidatur) //
        .map(found -> NlKandidatur.getNlListeStatus(found, wahlZulassungspruefung.getZulassungPruefer()::collectWahlrechtspruefungen));
  }

  private Optional<NlListeStatus> getNlListeStatus(Wahlvorschlag wahlvorschlag, WahlZulassungspruefung wahlZulassungspruefung) {
    return Optional.ofNullable(wahlvorschlag) //
        .filter(Wahlvorschlag::isListe) //
        .map(found -> NlListe.getNlListeStatus(castTo(found, Liste.class), wahlZulassungspruefung.getZulassungPruefer()::collectWahlrechtspruefungen));
  }
}
