
package de.ivu.elect.presentation.kandidatur.form;

import java.util.Collection;
import java.util.Set;

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturConstants;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.presentation.personenregister.form.AbstractPersonenregisterPropertiesViewFormBuilder;
import de.ivu.elect.presentation.wahlvorschlag.form.EinzelbewerberViewFormBuilder;

public class EinzelbewerberKandidaturViewFormBuilder extends AbstractPersonenregisterPropertiesViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient EinzelbewerberViewFormBuilder einzelbewerberViewFormBuilder;

  @Inject
  private transient KandidaturViewFormBuilder kandidaturViewFormBuilder;

  public EinzelbewerberKandidaturViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Kandidatur einzelkandidatur, boolean readonly) {
    addEinzelbewerberProperties(formBuilder, einzelkandidatur.getWahlvorschlag(), readonly);

    addEinzelkandidaturProperties(formBuilder, einzelkandidatur, readonly);

    addEinzelkandidaturGewaehltVorperiodeProperties(formBuilder, einzelkandidatur, einzelkandidatur.getGewaehltVorperiode(), readonly);
  }

  protected void addEinzelbewerberProperties(FormBuilder formBuilder, Wahlvorschlag einzelbewerber, boolean readonly) {
    einzelbewerberViewFormBuilder.addProperties(formBuilder, einzelbewerber);
  }

  protected void addEinzelkandidaturProperties(FormBuilder formBuilder, Kandidatur einzelkandidatur, boolean readonly) {
    einzelbewerberViewFormBuilder.addSeparator(formBuilder, KandidaturConstants.MESSAGE_KEY_ENTITY_EINZAHL);

    kandidaturViewFormBuilder.addKandidaturProperties(formBuilder, einzelkandidatur, readonly, isPraesentationPropertiesReadonly(), readonly);

    setEinzelkandidaturKandidaturPropertiesRequired(formBuilder, einzelkandidatur);
  }

  protected void addEinzelkandidaturGewaehltVorperiodeProperties(FormBuilder formBuilder, Kandidatur kandidatur, Gewaehlt gewaehlt, boolean readonly) {
    kandidaturViewFormBuilder.addGewaehltVorperiodeProperties(formBuilder, kandidatur, gewaehlt, readonly);
  }

  protected boolean isPraesentationPropertiesReadonly() {
    return false;
  }

  private FormBuilder setEinzelkandidaturKandidaturPropertiesRequired(FormBuilder formBuilder, Kandidatur einzelkandidatur) {
    setEinzelkandidaturPersonendatenPropertiesRequired(formBuilder, einzelkandidatur);

    setEinzelkandidaturAnschriftPropertiesRequired(formBuilder, einzelkandidatur, einzelkandidatur.getAnschrift());

    return formBuilder;
  }

  public FormBuilder setEinzelkandidaturPersonendatenPropertiesRequired(FormBuilder formBuilder, Kandidatur einzelkandidatur) {
    return setPropertiesRequired(formBuilder, getEinzelkandidaturPersonendatenPropertiesRequired(einzelkandidatur));
  }

  public Set<Class< ? extends Property>> getEinzelkandidaturPersonendatenPropertiesRequired(Kandidatur einzelkandidatur) {
    return kandidaturViewFormBuilder.getKandidaturPersonendatenPropertiesRequired(einzelkandidatur);
  }

  public FormBuilder setEinzelkandidaturAnschriftPropertiesRequired(FormBuilder formBuilder, Kandidatur einzelkandidatur, Anschrift anschrift) {
    return setPropertiesRequired(formBuilder, getEinzelkandidaturAnschriftPropertiesRequired(einzelkandidatur, anschrift));
  }

  public Set<Class< ? extends Property>> getEinzelkandidaturAnschriftPropertiesRequired(Kandidatur einzelkandidatur, Anschrift anschrift) {
    return kandidaturViewFormBuilder.getKandidaturAnschriftPropertiesRequired(einzelkandidatur, anschrift);
  }

  public Gewaehlt createGewaehltVorperiode(Wahl wahl) {
    return kandidaturViewFormBuilder.createGewaehltVorperiode(wahl);
  }

  @Override
  public Collection<Class< ? extends Property>> getPersonenregisterPropertiesUebernommen(Personendaten personendaten) {
    return kandidaturViewFormBuilder.getPersonenregisterPropertiesUebernommen(personendaten);
  }

  public void preSaveEntity(Kandidatur einzelkandidatur) {
    kandidaturViewFormBuilder.preSaveEntity(einzelkandidatur);
  }
}
