
package de.ivu.elect.dokumente.wahlvorschlag;

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

import java.util.Collection;

import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagStatus;

public class CoreWahlvorschlagsdatenAggregator {

  private long anzahlWahlvorschlaege;

  private long anzahlWahlvorschlaegeZulassenErlaubt;

  private long anzahlWahlvorschlaegeZugelassen;

  private long anzahlWahlvorschlaegeNichtZugelassen;

  private long anzahlDirektkandidaten;

  private long anzahlDirektkandidatenZulassenErlaubt;

  private long anzahlDirektkandidatenZugelassen;

  private long anzahlDirektkandidatenNichtZugelassen;

  private long anzahlListen;

  private long anzahlListenZulassenErlaubt;

  private long anzahlListenZugelassen;

  private long anzahlListenNichtZugelassen;

  private long anzahlListenkandidaturen;

  private final long anzahlListenkandidaturenAufListenZulassenErlaubt;

  private final long anzahlListenkandidaturenAufListenZugelassen;

  private final long anzahlListenkandidaturenAufListenNichtZugelassen;

  private long anzahlListenkandidaturenZulassenErlaubt;

  private long anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt;

  private long anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen;

  private long anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen;

  private long anzahlListenkandidaturenZugelassen;

  private long anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt;

  private long anzahlListenkandidaturenZugelassenAufListenZugelassen;

  private long anzahlListenkandidaturenZugelassenAufListenNichtZugelassen;

  private long anzahlListenkandidaturenNichtZugelassen;

  private long anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt;

  private long anzahlListenkandidaturenNichtZugelassenAufListenZugelassen;

  private long anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen;

  private long anzahlReferendumOptionen;

  private long anzahlReferendumOptionenZulassenErlaubt;

  private long anzahlReferendumOptionenZugelassen;

  private long anzahlReferendumOptionenNichtZugelassen;

  public CoreWahlvorschlagsdatenAggregator(ZulassungPruefer zulassungPruefer, Collection<Wahlvorschlag> wahlvorschlaege) {
    super();

    this.anzahlWahlvorschlaege = 0L;
    this.anzahlWahlvorschlaegeZulassenErlaubt = 0L;
    this.anzahlWahlvorschlaegeZugelassen = 0L;
    this.anzahlWahlvorschlaegeNichtZugelassen = 0L;

    this.anzahlDirektkandidaten = 0L;
    this.anzahlDirektkandidatenZulassenErlaubt = 0L;
    this.anzahlDirektkandidatenZugelassen = 0L;
    this.anzahlDirektkandidatenNichtZugelassen = 0L;

    this.anzahlListen = 0L;
    this.anzahlListenZulassenErlaubt = 0L;
    this.anzahlListenZugelassen = 0L;
    this.anzahlListenNichtZugelassen = 0L;

    this.anzahlListenkandidaturen = 0L;
    this.anzahlListenkandidaturenAufListenZulassenErlaubt = 0L;
    this.anzahlListenkandidaturenAufListenZugelassen = 0L;
    this.anzahlListenkandidaturenAufListenNichtZugelassen = 0L;

    this.anzahlListenkandidaturenZulassenErlaubt = 0L;
    this.anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt = 0L;
    this.anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen = 0L;
    this.anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen = 0L;

    this.anzahlListenkandidaturenZugelassen = 0L;
    this.anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt = 0L;
    this.anzahlListenkandidaturenZugelassenAufListenZugelassen = 0L;
    this.anzahlListenkandidaturenZugelassenAufListenNichtZugelassen = 0L;

    this.anzahlListenkandidaturenNichtZugelassen = 0L;
    this.anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt = 0L;
    this.anzahlListenkandidaturenNichtZugelassenAufListenZugelassen = 0L;
    this.anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen = 0L;

    this.anzahlReferendumOptionen = 0L;
    this.anzahlReferendumOptionenZulassenErlaubt = 0L;
    this.anzahlReferendumOptionenZugelassen = 0L;
    this.anzahlReferendumOptionenNichtZugelassen = 0L;

    for (Wahlvorschlag wahlvorschlag : wahlvorschlaege) {
      WahlvorschlagStatus wahlvorschlagStatus = wahlvorschlag.getWahlvorschlagStatus();

      boolean zulassungZulassenErlaubt = zulassungPruefer.isZulassenErlaubt(wahlvorschlag);
      boolean zulassungZugelassen = WahlvorschlagStatus.ZUGELASSEN.equals(wahlvorschlagStatus);
      boolean zulassungNichtZugelassen = WahlvorschlagStatus.NICHT_ZUGELASSEN.equals(wahlvorschlagStatus);

      this.anzahlWahlvorschlaege++;

      if (zulassungZulassenErlaubt) {
        this.anzahlWahlvorschlaegeZulassenErlaubt++;
      }

      if (zulassungZugelassen) {
        this.anzahlWahlvorschlaegeZugelassen++;
      } else if (zulassungNichtZugelassen) {
        this.anzahlWahlvorschlaegeNichtZugelassen++;
      }

      if (wahlvorschlag.isDirektkandidat()) {
        this.anzahlDirektkandidaten++;

        if (zulassungZulassenErlaubt) {
          this.anzahlDirektkandidatenZulassenErlaubt++;
        }

        if (zulassungZugelassen) {
          this.anzahlDirektkandidatenZugelassen++;
        } else if (zulassungNichtZugelassen) {
          this.anzahlDirektkandidatenNichtZugelassen++;
        }
      } else if (wahlvorschlag.isListe()) {
        Liste liste = castTo(wahlvorschlag, Liste.class);

        this.anzahlListen++;

        if (zulassungZulassenErlaubt) {
          this.anzahlListenZulassenErlaubt++;
        }

        if (zulassungZugelassen) {
          this.anzahlListenZugelassen++;
        } else if (zulassungNichtZugelassen) {
          this.anzahlListenNichtZugelassen++;
        }

        for (Listenkandidatur listenkandidatur : liste.getListenkandidaturen()) {
          KandidaturStatus kandidaturStatus = listenkandidatur.getKandidaturStatus();

          this.anzahlListenkandidaturen++;

          if (zulassungPruefer.isZulassenErlaubt(listenkandidatur)) {
            this.anzahlListenkandidaturenZulassenErlaubt++;

            if (zulassungZulassenErlaubt) {
              this.anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt++;
            }

            if (zulassungZugelassen) {
              this.anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen++;
            }

            if (zulassungNichtZugelassen) {
              this.anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen++;
            }
          }

          if (KandidaturStatus.ZUGELASSEN.equals(kandidaturStatus)) {
            this.anzahlListenkandidaturenZugelassen++;

            if (zulassungZulassenErlaubt) {
              this.anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt++;
            }

            if (zulassungZugelassen) {
              this.anzahlListenkandidaturenZugelassenAufListenZugelassen++;
            }

            if (zulassungNichtZugelassen) {
              this.anzahlListenkandidaturenZugelassenAufListenNichtZugelassen++;
            }
          } else if (KandidaturStatus.NICHT_ZUGELASSEN.equals(kandidaturStatus)) {
            this.anzahlListenkandidaturenNichtZugelassen++;

            if (zulassungZulassenErlaubt) {
              this.anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt++;
            }

            if (zulassungZugelassen) {
              this.anzahlListenkandidaturenNichtZugelassenAufListenZugelassen++;
            }

            if (zulassungNichtZugelassen) {
              this.anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen++;
            }
          }
        }
      } else if (wahlvorschlag.isReferendumOption()) {
        this.anzahlReferendumOptionen++;

        if (zulassungZulassenErlaubt) {
          this.anzahlReferendumOptionenZulassenErlaubt++;
        }

        if (zulassungZugelassen) {
          this.anzahlReferendumOptionenZugelassen++;
        } else if (zulassungNichtZugelassen) {
          this.anzahlReferendumOptionenNichtZugelassen++;
        }
      }
    }
  }

  public long countWahlvorschlaege() {
    return anzahlWahlvorschlaege;
  }

  public long countWahlvorschlaegeZulassenErlaubt() {
    return anzahlWahlvorschlaegeZulassenErlaubt;
  }

  public long countWahlvorschlaegeZugelassen() {
    return anzahlWahlvorschlaegeZugelassen;
  }

  public long countWahlvorschlaegeNichtZugelassen() {
    return anzahlWahlvorschlaegeNichtZugelassen;
  }

  public long countDirektkandidaten() {
    return anzahlDirektkandidaten;
  }

  public long countDirektkandidatenZulassenErlaubt() {
    return anzahlDirektkandidatenZulassenErlaubt;
  }

  public long countDirektkandidatenZugelassen() {
    return anzahlDirektkandidatenZugelassen;
  }

  public long countDirektkandidatenNichtZugelassen() {
    return anzahlDirektkandidatenNichtZugelassen;
  }

  public long countListen() {
    return anzahlListen;
  }

  public long countListenZulassenErlaubt() {
    return anzahlListenZulassenErlaubt;
  }

  public long countListenZugelassen() {
    return anzahlListenZugelassen;
  }

  public long countListenNichtZugelassen() {
    return anzahlListenNichtZugelassen;
  }

  public long countListenkandidaturen() {
    return anzahlListenkandidaturen;
  }

  public long countListenkandidaturenAufListenZulassenErlaubt() {
    return anzahlListenkandidaturenAufListenZulassenErlaubt;
  }

  public long countListenkandidaturenAufListenZugelassen() {
    return anzahlListenkandidaturenAufListenZugelassen;
  }

  public long countListenkandidaturenAufListenNichtZugelassen() {
    return anzahlListenkandidaturenAufListenNichtZugelassen;
  }

  public long countListenkandidaturenZulassenErlaubt() {
    return anzahlListenkandidaturenZulassenErlaubt;
  }

  public long countListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt() {
    return anzahlListenkandidaturenZulassenErlaubtAufListenZulassenErlaubt;
  }

  public long countListenkandidaturenZulassenErlaubtAufListenZugelassen() {
    return anzahlListenkandidaturenZulassenErlaubtAufListenZugelassen;
  }

  public long countListenkandidaturenZulassenErlaubtAufListenNichtZugelassen() {
    return anzahlListenkandidaturenZulassenErlaubtAufListenNichtZugelassen;
  }

  public long countListenkandidaturenZugelassen() {
    return anzahlListenkandidaturenZugelassen;
  }

  public long countListenkandidaturenZugelassenAufListenZulassenErlaubt() {
    return anzahlListenkandidaturenZugelassenAufListenZulassenErlaubt;
  }

  public long countListenkandidaturenZugelassenAufListenZugelassen() {
    return anzahlListenkandidaturenZugelassenAufListenZugelassen;
  }

  public long countListenkandidaturenZugelassenAufListenNichtZugelassen() {
    return anzahlListenkandidaturenZugelassenAufListenNichtZugelassen;
  }

  public long countListenkandidaturenNichtZugelassen() {
    return anzahlListenkandidaturenNichtZugelassen;
  }

  public long countListenkandidaturenNichtZugelassenAufListenZulassenErlaubt() {
    return anzahlListenkandidaturenNichtZugelassenAufListenZulassenErlaubt;
  }

  public long countListenkandidaturenNichtZugelassenAufListenZugelassen() {
    return anzahlListenkandidaturenNichtZugelassenAufListenZugelassen;
  }

  public long countListenkandidaturenNichtZugelassenAufListenNichtZugelassen() {
    return anzahlListenkandidaturenNichtZugelassenAufListenNichtZugelassen;
  }

  public long countReferendumOptionen() {
    return anzahlReferendumOptionen;
  }

  public long countReferendumOptionenZulassenErlaubt() {
    return anzahlReferendumOptionenZulassenErlaubt;
  }

  public long countReferendumOptionenZugelassen() {
    return anzahlReferendumOptionenZugelassen;
  }

  public long countReferendumOptionenNichtZugelassen() {
    return anzahlReferendumOptionenNichtZugelassen;
  }
}
