
package de.ivu.elect.dokumente.wahlvorschlag;

import java.util.Collection;

import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.dokumente.CoreElectContext;

public class CoreGruppeMitAllenWahlvorschlaegenDokument extends AbstractGruppeDokument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("AnzahlWahlvorschlaegeInsgesamt")
  public final Long anzahlWahlvorschlaegeInsgesamt;

  @DocumentSimpleField("AnzahlWahlvorschlaegeZulassenErlaubt")
  public final Long anzahlWahlvorschlaegeZulassenErlaubt;

  @DocumentSimpleField("AnzahlWahlvorschlaegeZugelassen")
  public final Long anzahlWahlvorschlaegeZugelassen;

  @DocumentSimpleField("AnzahlWahlvorschlaegeNichtZugelassen")
  public final Long anzahlWahlvorschlaegeNichtZugelassen;

  @DocumentSimpleField("AnzahlDirektkandidatenInsgesamt")
  public final Long anzahlDirektkandidatenInsgesamt;

  @DocumentSimpleField("AnzahlDirektkandidatenZulassenErlaubt")
  public final Long anzahlDirektkandidatenZulassenErlaubt;

  @DocumentSimpleField("AnzahlDirektkandidatenZugelassen")
  public final Long anzahlDirektkandidatenZugelassen;

  @DocumentSimpleField("AnzahlDirektkandidatenNichtZugelassen")
  public final Long anzahlDirektkandidatenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenInsgesamt")
  public final Long anzahlListenInsgesamt;

  @DocumentSimpleField("AnzahlListenZulassenErlaubt")
  public final Long anzahlListenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenZugelassen")
  public final Long anzahlListenZugelassen;

  @DocumentSimpleField("AnzahlListenNichtZugelassen")
  public final Long anzahlListenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenInsgesamt")
  public final Long anzahlListenkandidaturenInsgesamt;

  @DocumentSimpleField("AnzahlListenkandidaturenInsgesamtAufListenZulassenErlaubt")
  public final Long anzahlListenkandidaturenInsgesamtAufListenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenkandidaturenInsgesamtAufListenZugelassen")
  public final Long anzahlListenkandidaturenInsgesamtAufListenZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenInsgesamtAufListenNichtZugelassen")
  public final Long anzahlListenkandidaturenInsgesamtAufListenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenZulassenErlaubt")
  public final Long anzahlListenkandidaturenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt")
  public final Long anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenkandidaturenZulassenErlaubtAufListenZugelassen")
  public final Long anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen")
  public final Long anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenZugelassen")
  public final Long anzahlListenkandidaturenZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenZugelassenAufListenZulassenErlaubt")
  public final Long anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenkandidaturenZugelassenAufListenZugelassen")
  public final Long anzahlListenkandidaturenZugelassenAufListenZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenZugelassenAufListenNichtZugelassen")
  public final Long anzahlListenkandidaturenZugelassenAufListenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenNichtZugelassen")
  public final Long anzahlListenkandidaturenNichtZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt")
  public final Long anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt;

  @DocumentSimpleField("AnzahlListenkandidaturenNichtZugelassenAufListenZugelassen")
  public final Long anzahlListenkandidaturenNichtZugelassenAufListenZugelassen;

  @DocumentSimpleField("AnzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen")
  public final Long anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen;

  @DocumentSimpleField("AnzahlReferendumOptionenInsgesamt")
  public final Long anzahlReferendumOptionenInsgesamt;

  @DocumentSimpleField("AnzahlReferendumOptionenZulassenErlaubt")
  public final Long anzahlReferendumOptionenZulassenErlaubt;

  @DocumentSimpleField("AnzahlReferendumOptionenZugelassen")
  public final Long anzahlReferendumOptionenZugelassen;

  @DocumentSimpleField("AnzahlReferendumOptionenNichtZugelassen")
  public final Long anzahlReferendumOptionenNichtZugelassen;

  public CoreGruppeMitAllenWahlvorschlaegenDokument(CoreElectContext coreElectContext, ZulassungPruefer zulassungPruefer, Gruppe gruppe, Collection<Wahlvorschlag> wahlvorschlaege) {
    super(gruppe);

    CoreWahlvorschlagsdatenAggregator coreWahlvorschlagsdatenAggregator = new CoreWahlvorschlagsdatenAggregator(zulassungPruefer, wahlvorschlaege);

    this.anzahlWahlvorschlaegeInsgesamt = coreWahlvorschlagsdatenAggregator.countWahlvorschlaege();
    this.anzahlWahlvorschlaegeZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countWahlvorschlaegeZulassenErlaubt();
    this.anzahlWahlvorschlaegeZugelassen = coreWahlvorschlagsdatenAggregator.countWahlvorschlaegeZugelassen();
    this.anzahlWahlvorschlaegeNichtZugelassen = coreWahlvorschlagsdatenAggregator.countWahlvorschlaegeNichtZugelassen();

    this.anzahlListenInsgesamt = coreWahlvorschlagsdatenAggregator.countListen();
    this.anzahlListenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenZulassenErlaubt();
    this.anzahlListenZugelassen = coreWahlvorschlagsdatenAggregator.countListenZugelassen();
    this.anzahlListenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenNichtZugelassen();

    this.anzahlListenkandidaturenInsgesamt = coreWahlvorschlagsdatenAggregator.countListenkandidaturen();
    this.anzahlListenkandidaturenInsgesamtAufListenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenkandidaturenAufListenZulassenErlaubt();
    this.anzahlListenkandidaturenInsgesamtAufListenZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenAufListenZugelassen();
    this.anzahlListenkandidaturenInsgesamtAufListenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenAufListenNichtZugelassen();

    this.anzahlListenkandidaturenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZulassenErlaubt();
    this.anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt();
    this.anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZulassenErlaubtAufListenZugelassen();
    this.anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZulassenErlaubtAufListenNichtZugelassen();

    this.anzahlListenkandidaturenZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZugelassen();
    this.anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZugelassenAufListenZulassenErlaubt();
    this.anzahlListenkandidaturenZugelassenAufListenZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZugelassenAufListenZugelassen();
    this.anzahlListenkandidaturenZugelassenAufListenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenZugelassenAufListenNichtZugelassen();

    this.anzahlListenkandidaturenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenNichtZugelassen();
    this.anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countListenkandidaturenNichtZugelassenAufListenZulassenErlaubt();
    this.anzahlListenkandidaturenNichtZugelassenAufListenZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenNichtZugelassenAufListenZugelassen();
    this.anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countListenkandidaturenNichtZugelassenAufListenNichtZugelassen();

    this.anzahlDirektkandidatenInsgesamt = coreWahlvorschlagsdatenAggregator.countDirektkandidaten();
    this.anzahlDirektkandidatenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countDirektkandidatenZulassenErlaubt();
    this.anzahlDirektkandidatenZugelassen = coreWahlvorschlagsdatenAggregator.countDirektkandidatenZugelassen();
    this.anzahlDirektkandidatenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countDirektkandidatenNichtZugelassen();

    this.anzahlReferendumOptionenInsgesamt = coreWahlvorschlagsdatenAggregator.countReferendumOptionen();
    this.anzahlReferendumOptionenZulassenErlaubt = coreWahlvorschlagsdatenAggregator.countReferendumOptionenZulassenErlaubt();
    this.anzahlReferendumOptionenZugelassen = coreWahlvorschlagsdatenAggregator.countReferendumOptionenZugelassen();
    this.anzahlReferendumOptionenNichtZugelassen = coreWahlvorschlagsdatenAggregator.countReferendumOptionenNichtZugelassen();
  }

  public static CoreGruppeMitAllenWahlvorschlaegenDokument lookupOrCreate(CoreElectContext coreElectContext, ZulassungPruefer zulassungPruefer, Gruppe gruppe,
      Collection<Wahlvorschlag> wahlvorschlaege) {
    return coreElectContext.computeIfAbsent("CoreGruppeMitAllenWahlvorschlaegenDokument_" + gruppe.getId(), CoreGruppeMitAllenWahlvorschlaegenDokument.class,
        x -> new CoreGruppeMitAllenWahlvorschlaegenDokument(coreElectContext, zulassungPruefer, gruppe, wahlvorschlaege));
  }
}
