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

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;

import de.ivu.elect.business.stimmeingabe.control.DefaultStimmeingabeErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeGruppeStimmenErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeListenkandidaturStimmenErfassenLabelGenerator;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeReferendumOptionStimmenErfassenLabelGenerator;
import de.ivu.elect.business.wahl.entity.Wahl;

/**
 * Default-Implementation der StimmeingabeErfassenDescription
 * <p/>
 * Für die Stimmeingabe*ErfassenLabelGenerator werden Default-Implementierungen gegeben. Die Stimmeingabe*ErfassenModelBuilder müssen überschrieben werden, wenn sie gebraucht werden.
 */
@RequestScoped // ELECTBB-19 - Instanzen bleiben sonst beim automatischen Stimmenimport im Speicher...
public abstract class AbstractStimmeingabeErfassenDescription implements StimmeingabeErfassenDescription, Serializable {

  private static final long serialVersionUID = 1L;

  public AbstractStimmeingabeErfassenDescription() {
    super();
  }

  @Override
  public boolean isApplicable(Wahl wahl) {
    // HINT: Die ModelBuilder wissen schon, ob sie applicable sind -- evtl. später in die StimmeingabeErfassenDescription verschieben
    return getStimmeingabePlausiBuilder().isApplicable(wahl);
  }

  @Override
  public StimmeingabeGruppeStimmenErfassenModelBuilder getStimmeingabeGruppeStimmenErfassenModelBuilder() {
    // Default-Implementierung; bei Bedarf überschreiben
    throw new UnsupportedOperationException();
  }

  @Override
  public StimmeingabeListenkandidaturStimmenErfassenModelBuilder getStimmeingabeListenkandidaturStimmenErfassenModelBuilder() {
    // Default-Implementierung; bei Bedarf überschreiben
    throw new UnsupportedOperationException();
  }

  @Override
  public StimmeingabeReferendumOptionStimmenErfassenModelBuilder getStimmeingabeReferendumOptionStimmenErfassenModelBuilder() {
    // Default-Implementierung; bei Bedarf überschreiben
    throw new UnsupportedOperationException();
  }

  @Override
  public StimmeingabeGruppeStimmenErfassenLabelGenerator getStimmeingabeGruppeStimmenErfassenLabelGenerator() {
    // Default-Implementierung; bei Bedarf überschreiben
    return DefaultStimmeingabeErfassenLabelGenerator.INSTANCE;
  }

  @Override
  public StimmeingabeListenkandidaturStimmenErfassenLabelGenerator getStimmeingabeListenkandidaturStimmenErfassenLabelGenerator() {
    // Default-Implementierung; bei Bedarf überschreiben
    return DefaultStimmeingabeErfassenLabelGenerator.INSTANCE;
  }

  @Override
  public StimmeingabeReferendumOptionStimmenErfassenLabelGenerator getStimmeingabeReferendumOptionStimmenErfassenLabelGenerator() {
    // Default-Implementierung; bei Bedarf überschreiben
    return DefaultStimmeingabeErfassenLabelGenerator.INSTANCE;
  }

  @Override
  public void buildStimmeingabeErfassenModels(StimmeingabeErfassenContext context) {
    if (isKopfzahlenErfassen()) {
      buildKopfzahlErfassenModel(context);
    }

    if (isGruppeStimmenErfassen()) {
      buildGruppeStimmenErfassenModel(context);
    }

    if (isReferendumOptionStimmenErfassen()) {
      buildReferendumVorlageStimmenErfassenModel(context);
    }

    if (isListenkandidaturStimmenErfassen()) {
      buildListenkandidaturStimmenErfassenModels(context);
    }
  }

  public boolean isKopfzahlenErfassen() {
    // Default-Implementierung; bei Bedarf überschreiben
    return true;
  }

  public boolean isGruppeStimmenErfassen() {
    // Default-Implementierung; bei Bedarf überschreiben
    return true;
  }

  public boolean isReferendumOptionStimmenErfassen() {
    // Default-Implementierung; bei Bedarf überschreiben
    return false;
  }

  public boolean isListenkandidaturStimmenErfassen() {
    // Default-Implementierung; bei Bedarf überschreiben
    return false;
  }

  protected void buildKopfzahlErfassenModel(StimmeingabeErfassenContext context) {
    getStimmeingabeKopfzahlErfassenModelBuilder().createKopfzahlErfassenModel(context);
  }

  protected void buildGruppeStimmenErfassenModel(StimmeingabeErfassenContext context) {
    getStimmeingabeGruppeStimmenErfassenModelBuilder().createGruppeStimmenErfassenModel(context);
  }

  protected void buildReferendumVorlageStimmenErfassenModel(StimmeingabeErfassenContext context) {
    getStimmeingabeReferendumOptionStimmenErfassenModelBuilder().createReferendumVorlageStimmenErfassenModel(context);
  }

  protected void buildListenkandidaturStimmenErfassenModels(StimmeingabeErfassenContext context) {
    getStimmeingabeListenkandidaturStimmenErfassenModelBuilder().createListenkandidaturStimmenErfassenModelForAllApplicableGruppeImGebiet(context);
  }
}
