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

import java.util.Collection;

import de.ivu.elect.business.ergebnis.control.StimmenPoolFactory;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietReihenfolgeVorsortierer;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.pruefung.boundary.ZulassungPruefer;
import de.ivu.elect.business.pruefung.boundary.ZulassungPrueferFactory;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDatenFactory;
import de.ivu.elect.business.wahl.entity.AbstractWahlParameterLoader;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class EntityAufStimmzettelDatenVorgeladenFactory implements EntityAufStimmzettelDatenFactory {

  private static final long serialVersionUID = 1L;

  private final AbstractWahlParameterLoader wahlParameterLoader;

  private final ZulassungPrueferFactory zulassungPrueferFactory;

  private final StimmzettelFormatter stimmzettelFormatter;

  private final EntityAufStimmzettelDatenStimmzettelPositionBerechnung entityAufStimmzettelDatenStimmzettelPositionBerechnung;

  private final StimmenPoolFactory stimmenPoolFactory;

  private final GruppeImGebietReihenfolgeVorsortierer gruppeImGebietReihenfolgeVorsortierer;

  private final Collection<Wahlvorschlag> wahlvorschlaegeInWahl;

  public EntityAufStimmzettelDatenVorgeladenFactory(AbstractWahlParameterLoader wahlParameterLoader, ZulassungPruefer zulassungPruefer, StimmzettelFormatter stimmzettelFormatter,
      EntityAufStimmzettelDatenStimmzettelPositionBerechnung entityAufStimmzettelDatenStimmzettelPositionBerechnung, StimmenPoolFactory stimmenPoolFactory,
      GruppeImGebietReihenfolgeVorsortierer gruppeImGebietReihenfolgeVorsortierer, Collection<Wahlvorschlag> wahlvorschlaegeInWahl) {
    this(wahlParameterLoader, new ZulassungPrueferFactory() {

      private static final long serialVersionUID = 1L;

      @Override
      public ZulassungPruefer createZulassungPruefer() {
        return zulassungPruefer;
      }
    }, stimmzettelFormatter, entityAufStimmzettelDatenStimmzettelPositionBerechnung, stimmenPoolFactory, gruppeImGebietReihenfolgeVorsortierer, wahlvorschlaegeInWahl);
  }

  public EntityAufStimmzettelDatenVorgeladenFactory(AbstractWahlParameterLoader wahlParameterLoader, ZulassungPrueferFactory zulassungPrueferFactory, StimmzettelFormatter stimmzettelFormatter,
      EntityAufStimmzettelDatenStimmzettelPositionBerechnung entityAufStimmzettelDatenStimmzettelPositionBerechnung, StimmenPoolFactory stimmenPoolFactory,
      GruppeImGebietReihenfolgeVorsortierer gruppeImGebietReihenfolgeVorsortierer, Collection<Wahlvorschlag> wahlvorschlaegeInWahl) {
    super();

    this.wahlParameterLoader = wahlParameterLoader;

    this.zulassungPrueferFactory = zulassungPrueferFactory;

    this.stimmzettelFormatter = stimmzettelFormatter;

    this.entityAufStimmzettelDatenStimmzettelPositionBerechnung = entityAufStimmzettelDatenStimmzettelPositionBerechnung;

    this.stimmenPoolFactory = stimmenPoolFactory;
    this.gruppeImGebietReihenfolgeVorsortierer = gruppeImGebietReihenfolgeVorsortierer;
    this.wahlvorschlaegeInWahl = wahlvorschlaegeInWahl;
  }

  @Override
  public EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    return new EntityAufStimmzettelDaten(wahlParameterLoader, getZulassungPruefer(), stimmzettelFormatter, entityAufStimmzettelDatenStimmzettelPositionBerechnung, stimmenPoolFactory,
        gruppeImGebietReihenfolgeVorsortierer, wahlvorschlaegeInWahl);
  }

  private ZulassungPruefer getZulassungPruefer() {
    return zulassungPrueferFactory.createZulassungPruefer();
  }
}
