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

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

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 = getAnzahlNennungenAufListeMaximal(liste);

    return anzahlNennungenProListeMaximal > 0L && getAnzahlNennungenAufListe(liste) > anzahlNennungenProListeMaximal;
  }

  /**
   * Die tatsächliche Bestimmung der zulässigen Anzahl Listenkandidaturen/Nennungen ist Wahlrecht-spezifisch und entspricht NICHT immer der Anzahl der zu vergebenen Sitze!!! In KOM-NI hängt die Anzahl
   * bspw. von der Anzahl der Wahlbereiche ab, in denen eine Gruppe antritt.
   */
  protected long getAnzahlNennungenAufListeMaximal(Liste liste) {
    return -1L; // ELECT-12382 fixNullToZero(liste.getGebiet().getAnzahlSitzeImWahlgebiet());
  }

  private long getAnzahlNennungenAufListe(Liste liste) {
    return liste.getAnzahlNennungenVonListenkandidaturenAufStimmzettel();
  }

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