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

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

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonTyp;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.presentation.personenregister.form.AbstractPersonenregisterPropertiesViewFormBuilder;

public abstract class AbstractWahlvorschlagsPersonViewFormBuilder extends AbstractPersonenregisterPropertiesViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlvorschlagsPersonViewFormBuilder wahlvorschlagsPersonViewFormBuilder;

  protected AbstractWahlvorschlagsPersonViewFormBuilder() {
    super();
  }

  public boolean isApplicable(WahlvorschlagsPerson wahlvorschlagsPerson) {
    return wahlvorschlagsPerson != null && getRelevantWahlvorschlagsPersonTypen(wahlvorschlagsPerson.isIndividuelleWahlvorschlagsPerson()).contains(wahlvorschlagsPerson.getWahlvorschlagsPersonTyp());
  }

  protected abstract List<WahlvorschlagsPersonTyp> getRelevantWahlvorschlagsPersonTypen(boolean individuelleWahlvorschlagsPerson);

  public void addProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson) {
    addProperties(formBuilder, wahlvorschlagsPerson, false);
  }

  public abstract void addProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, boolean propertiesReadonly);

  protected void addWahlvorschlagsPersonProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, boolean propertiesReadonly) {
    getWahlvorschlagsPersonViewFormBuilder().addWahlvorschlagsPersonProperties(formBuilder, wahlvorschlagsPerson, getRelevantWahlvorschlagsPersonTypen(wahlvorschlagsPerson.isIndividuelleWahlvorschlagsPerson()), propertiesReadonly);
  }

  protected void addWahlvorschlagsPersonPersonendatenProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, boolean propertiesReadonly) {
    getWahlvorschlagsPersonViewFormBuilder().addWahlvorschlagsPersonPersonendatenProperties(formBuilder, wahlvorschlagsPerson, propertiesReadonly);

    setWahlvorschlagsPersonPersonendatenPropertiesRequired(formBuilder, wahlvorschlagsPerson);
  }

  public FormBuilder setWahlvorschlagsPersonPersonendatenPropertiesRequired(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson) {
    return setPropertiesRequired(formBuilder, getWahlvorschlagsPersonPersonendatenPropertiesRequired(wahlvorschlagsPerson));
  }

  public Set<Class< ? extends Property>> getWahlvorschlagsPersonPersonendatenPropertiesRequired(WahlvorschlagsPerson wahlvorschlagsPerson) {
    return getWahlvorschlagsPersonViewFormBuilder().getWahlvorschlagsPersonPersonendatenPropertiesRequired(wahlvorschlagsPerson);
  }

  protected void addWahlvorschlagsPersonAnschriftProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, Anschrift anschrift, boolean propertiesReadonly) {
    getWahlvorschlagsPersonViewFormBuilder().addWahlvorschlagsPersonAnschriftProperties(formBuilder, wahlvorschlagsPerson, anschrift, propertiesReadonly);

    setWahlvorschlagsPersonAnschriftPropertiesRequired(formBuilder, wahlvorschlagsPerson, anschrift);
  }

  public FormBuilder setWahlvorschlagsPersonAnschriftPropertiesRequired(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, Anschrift anschrift) {
    return setPropertiesRequired(formBuilder, getWahlvorschlagsPersonAnschriftPropertiesRequired(wahlvorschlagsPerson, anschrift));
  }

  public Set<Class< ? extends Property>> getWahlvorschlagsPersonAnschriftPropertiesRequired(WahlvorschlagsPerson wahlvorschlagsPerson, Anschrift anschrift) {
    return getWahlvorschlagsPersonViewFormBuilder().getWahlvorschlagsPersonAnschriftPropertiesRequired(wahlvorschlagsPerson, anschrift);
  }

  public void addWahlvorschlagsPersonErreichbarkeitsdatenProperties(FormBuilder formBuilder, WahlvorschlagsPerson wahlvorschlagsPerson, boolean propertiesReadonly) {
    getWahlvorschlagsPersonViewFormBuilder().addWahlvorschlagsPersonErreichbarkeitsdatenProperties(formBuilder, wahlvorschlagsPerson, propertiesReadonly);
  }

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

  protected WahlvorschlagsPersonViewFormBuilder getWahlvorschlagsPersonViewFormBuilder() {
    return wahlvorschlagsPersonViewFormBuilder;
  }
}
