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

import java.util.ArrayList;
import java.util.List;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeKopfzahl;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeKopfzahlErfassenModel;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;

public abstract class AbstractStimmeingabeErfassenModelBuilder implements StimmeingabeKopfzahlErfassenModelBuilder {

  private static final long serialVersionUID = 1L;

  public AbstractStimmeingabeErfassenModelBuilder() {
    super();
  }

  protected abstract AbstractStimmeingabeKopfzahlModelBuilder getStimmeingabeKopfzahlModelBuilder();

  private boolean hasStimmeingabeKopfzahlModelBuilder() {
    return getStimmeingabeKopfzahlModelBuilder() != null;
  }

  @Override
  public boolean isPruefkennzeichenWahlberechtigteCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isPruefkennzeichenWahlberechtigteCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWahlberechtigteStimmenartCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWahlberechtigteStimmenartCreated(wahldurchfuehrungsgebiet, ergebnisart, stimmenart);
  }

  @Override
  public boolean isWahlberechtigteOhneWahlscheinCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWahlberechtigteOhneWahlscheinCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWahlberechtigteMitWahlscheinCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWahlberechtigteMitWahlscheinCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWahlberechtigteNichtImWaehlerverzeichnisCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWahlberechtigteNichtImWaehlerverzeichnisCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWahlberechtigteGesamtCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWahlberechtigteGesamtCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerStimmenartCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart, Stimmenart stimmenart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerStimmenartCreated(wahldurchfuehrungsgebiet, ergebnisart, stimmenart);
  }

  @Override
  public boolean isWaehlerOhneWahlscheinCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerOhneWahlscheinCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerMitWahlscheinCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerMitWahlscheinCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerMitWahlscheinInUrnenwahlAnteilAusUrnenwahlCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerMitWahlscheinInUrnenwahlAnteilAusUrnenwahlCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerMitWahlscheinInUrnenwahlAnteilAusBriefwahlCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerMitWahlscheinInUrnenwahlAnteilAusBriefwahlCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerMitVollmachtCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerMitVollmachtCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public boolean isWaehlerGesamtCreated(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, WahlartErgebnisart ergebnisart) {
    return hasStimmeingabeKopfzahlModelBuilder() && getStimmeingabeKopfzahlModelBuilder().isWaehlerGesamtCreated(wahldurchfuehrungsgebiet, ergebnisart);
  }

  @Override
  public StimmeingabeKopfzahlErfassenModel createKopfzahlErfassenModel(StimmeingabeErfassenContext context) {
    if (hasStimmeingabeKopfzahlModelBuilder()) {
      return getStimmeingabeKopfzahlModelBuilder().createModelStimmeingabeKopfzahl(context);
    }

    return null;
  }

  @Override
  public List<StimmeingabeKopfzahl> layoutStimmeingabenKopfzahl(StimmeingabeKopfzahlErfassenModel model) {
    if (hasStimmeingabeKopfzahlModelBuilder()) {
      return getStimmeingabeKopfzahlModelBuilder().layoutModelStimmeingabeKopfzahl(model);
    }

    return new ArrayList<>();
  }
}
