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

import javax.inject.Inject;

import de.ivu.elect.business.WusFeaturesAktiviert;
import de.ivu.elect.business.ergebnis.control.StimmenPoolFactory;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietReihenfolgeVorsortierer;
import de.ivu.elect.business.kandidatur.boundary.AbstractListenkandidaturDAO;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.pruefung.control.WusZulassungPruefProzess;
import de.ivu.elect.business.stimmzettel.boundary.EntityAufStimmzettelDatenStimmzettelPositionBerechnung;
import de.ivu.elect.business.wahl.entity.AbstractWahlParameterLoader;
import de.ivu.elect.business.wahlrechtspruefung.boundary.AbstractWahlrechtspruefungDAO;
import de.ivu.elect.business.wahlvorschlag.boundary.AbstractWahlvorschlagDAO;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.AbstractWahlvorschlagsPersonDAO;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractZulassungPrueferDAOFactory implements ZulassungPrueferFactory {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  @Inject
  private transient StimmzettelFormatter stimmzettelFormatter;

  @Inject
  private transient EntityAufStimmzettelDatenStimmzettelPositionBerechnung entityAufStimmzettelDatenStimmzettelPositionBerechnung;

  @Inject
  private transient GruppeImGebietReihenfolgeVorsortierer gruppeImGebietReihenfolgeVorsortierer;

  @Inject
  private transient WusFeaturesAktiviert wusFeaturesAktiviert;

  @Inject
  private transient WusZulassungPruefProzess zulassungPruefProzess;

  public AbstractZulassungPrueferDAOFactory() {
    super();
  }

  @Override
  public ZulassungPruefer createZulassungPruefer() {
    if (isWusZulassungPrueferEnabled()) {
      return createWusZulassungPruefer();
    }

    return createCoreZulassungPruefer();
  }

  private boolean isWusZulassungPrueferEnabled() {
    return wusFeaturesAktiviert.isWusOderWusWasZusammen();
  }

  protected WusZulassungPruefer createWusZulassungPruefer() {
    return new WusZulassungPruefer(zulassungPruefProzess, getWahlParameterLoader(), stimmzettelFormatter, entityAufStimmzettelDatenStimmzettelPositionBerechnung, getWahlrechtspruefungDAO(),
        getWahlvorschlagDAO(), getListenkandidaturDAO(), getWahlvorschlagsPersonDAO(), getStimmenPoolFactory(), gruppeImGebietReihenfolgeVorsortierer,
        messages);
  }

  protected CoreZulassungPruefer createCoreZulassungPruefer() {
    return new CoreZulassungPruefer();
  }

  protected abstract AbstractWahlrechtspruefungDAO getWahlrechtspruefungDAO();

  protected abstract AbstractWahlvorschlagDAO getWahlvorschlagDAO();

  protected abstract AbstractListenkandidaturDAO getListenkandidaturDAO();

  protected abstract AbstractWahlvorschlagsPersonDAO getWahlvorschlagsPersonDAO();

  protected abstract StimmenPoolFactory getStimmenPoolFactory();

  protected abstract AbstractWahlParameterLoader getWahlParameterLoader();
}
