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

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

import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.AbstractWahlvorschlagsPersonDAO;

public class ListeListenkandidaturenAnzahlMaximalZulassungPruefSchritt extends AbstractZulassungPruefSchritt implements WahlvorschlagZulassungPruefSchritt {

  private static final long serialVersionUID = 1L;

  public ListeListenkandidaturenAnzahlMaximalZulassungPruefSchritt() {
    super();
  }

  protected boolean isZulassungPruefSchrittRelevant(Wahl wahl) {
    return !CommonWahlart.BUNDESTAGSWAHL.equalsWahlart(wahl) && !CommonWahlart.EUROPAWAHL.equalsWahlart(wahl); // ELECT-3939
  }

  @Override
  public boolean isZulassungErlaubt(Wahlvorschlag wahlvorschlag, AbstractWahlvorschlagsPersonDAO wahlvorschlagsPersonDAO, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    if (isZulassungPruefSchrittRelevant(wahlvorschlag.getWahl()) && wahlvorschlag.isInstanceOf(Liste.class)) {
      return !isAnzahlNennungenProListeUeberschritten(castTo(wahlvorschlag, Liste.class));
    }

    return true;
  }

  private boolean isAnzahlNennungenProListeUeberschritten(Liste liste) {
    long anzahlNennungenProListeMaximal = getAnzahlNennungenProListeMaximal(liste);

    return anzahlNennungenProListeMaximal > 0 && getAnzahlNennungenProListe(liste) > anzahlNennungenProListeMaximal;
  }

  protected long getAnzahlNennungenProListeMaximal(Liste liste) {
    return fixNullToZero(liste.getGebiet().getAnzahlSitzeImWahlgebiet());
  }

  protected long getAnzahlNennungenProListe(Liste liste) {
    long anzahlNennungen = 0L;

    for (Listenkandidatur listenkandidatur : liste.getListenkandidaturen()) {
      if (!listenkandidatur.isNichtZugelassenImSinneAbgelehnt() && listenkandidatur.getListenkandidaturArt().isListenkandidatur()) {
        anzahlNennungen += listenkandidatur.getAnzahlNennungen();
      }
    }

    return anzahlNennungen;
  }

  @Override
  public String getGrundFuerVerweigerungDerZulassung(Wahlvorschlag wahlvorschlag) {
    return getMessage("WahlvorschlagZulassungPruefer.max.anzahl.listenkandidaturen.ueberschritten");
  }
}
