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

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

import javax.annotation.Nullable;
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.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur;
import de.ivu.elect.business.kandidatur.entity.ErsatzkandidaturMeta;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahl.entity.Wahl;
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 class ErsatzkandidaturViewFormBuilder extends AbstractPersonenregisterPropertiesViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErsatzkandidaturMeta ersatzkandidaturMeta;

  @Inject
  private transient KandidaturViewFormBuilder kandidaturViewFormBuilder;

  public ErsatzkandidaturViewFormBuilder() {
    super();
  }

  public String getEntityEinzahlMessage(@Nullable Gebiet gebiet) {
    return ersatzkandidaturMeta.getEinzahlMessage();
  }

  public void addListenkandidaturProperties(FormBuilder formBuilder, Listenkandidatur listenkandidatur) {
    formBuilder.addProperty(listenkandidatur.getProperties().getRelativePositionProperty()).readonly();
  }

  public void addKandidaturProperties(FormBuilder formBuilder, Ersatzkandidatur ersatzkandidatur, boolean readonly) {
    kandidaturViewFormBuilder.addKandidaturProperties(formBuilder, ersatzkandidatur, readonly, isPraesentationPropertiesReadonly(), readonly);

    setErsatzkandidaturKandidaturPropertiesRequired(formBuilder, ersatzkandidatur);
  }

  protected boolean isPraesentationPropertiesReadonly() {
    return false;
  }

  private FormBuilder setErsatzkandidaturKandidaturPropertiesRequired(FormBuilder formBuilder, Ersatzkandidatur ersatzkandidatur) {
    setErsatzkandidaturPersonendatenPropertiesRequired(formBuilder, ersatzkandidatur);
    setErsatzkandidaturAnschriftPropertiesRequired(formBuilder, ersatzkandidatur, ersatzkandidatur.getAnschrift());

    return formBuilder;
  }

  public FormBuilder setErsatzkandidaturPersonendatenPropertiesRequired(FormBuilder formBuilder, Ersatzkandidatur ersatzkandidatur) {
    return setPropertiesRequired(formBuilder, getErsatzkandidaturPersonendatenPropertiesRequired(ersatzkandidatur));
  }

  public Set<Class< ? extends Property>> getErsatzkandidaturPersonendatenPropertiesRequired(Ersatzkandidatur ersatzkandidatur) {
    return kandidaturViewFormBuilder.getKandidaturPersonendatenPropertiesRequired(ersatzkandidatur);
  }

  public FormBuilder setErsatzkandidaturAnschriftPropertiesRequired(FormBuilder formBuilder, Ersatzkandidatur ersatzkandidatur, Anschrift anschrift) {
    return setPropertiesRequired(formBuilder, getErsatzkandidaturAnschriftPropertiesRequired(ersatzkandidatur, anschrift));
  }

  public Set<Class< ? extends Property>> getErsatzkandidaturAnschriftPropertiesRequired(Ersatzkandidatur ersatzkandidatur, Anschrift anschrift) {
    return kandidaturViewFormBuilder.getKandidaturAnschriftPropertiesRequired(ersatzkandidatur, anschrift);
  }

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

  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(Ersatzkandidatur ersatzkandidatur) {
    kandidaturViewFormBuilder.preSaveEntity(ersatzkandidatur);
  }
}
