
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.Direktkandidatur;
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.Direktkandidat;
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.DirektkandidatViewFormBuilder;

public class DirektkandidaturViewFormBuilder extends AbstractPersonenregisterPropertiesViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient DirektkandidatViewFormBuilder direktkandidatViewFormBuilder;

  @Inject
  private transient KandidaturViewFormBuilder kandidaturViewFormBuilder;

  public DirektkandidaturViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Direktkandidatur direktkandidatur, boolean readonly) {
    addDirektkandidatProperties(formBuilder, direktkandidatur.getDirektkandidat(), readonly);
    addDirektkandidaturProperties(formBuilder, direktkandidatur, readonly);
    addDirektkandidaturGewaehltVorperiodeProperties(formBuilder, direktkandidatur, direktkandidatur.getGewaehltVorperiode(), readonly);
  }

  private void addDirektkandidatProperties(FormBuilder formBuilder, Direktkandidat direktkandidat, boolean readonly) {
    direktkandidatViewFormBuilder.addProperties(formBuilder, direktkandidat);
  }

  private void addDirektkandidaturProperties(FormBuilder formBuilder, Direktkandidatur direktkandidatur, boolean readonly) {
    direktkandidatViewFormBuilder.addSeparator(formBuilder, KandidaturConstants.MESSAGE_KEY_ENTITY_EINZAHL);
    kandidaturViewFormBuilder.addKandidaturProperties(formBuilder, direktkandidatur, readonly, isPraesentationPropertiesReadonly(), readonly);

    formBuilder.removeProperty(direktkandidatur.getProperties().getKandidaturStatusProperty());

    setDirektkandidaturKandidaturPropertiesRequired(formBuilder, direktkandidatur);
  }

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

  protected boolean isPraesentationPropertiesReadonly() {
    return false;
  }

  private FormBuilder setDirektkandidaturKandidaturPropertiesRequired(FormBuilder formBuilder, Direktkandidatur direktkandidatur) {
    setDirektkandidaturPersonendatenPropertiesRequired(formBuilder, direktkandidatur);
    setDirektkandidaturAnschriftPropertiesRequired(formBuilder, direktkandidatur, direktkandidatur.getAnschrift());

    return formBuilder;
  }

  public FormBuilder setDirektkandidaturPersonendatenPropertiesRequired(FormBuilder formBuilder, Direktkandidatur direktkandidatur) {
    return setPropertiesRequired(formBuilder, getDirektkandidaturPersonendatenPropertiesRequired(direktkandidatur));
  }

  public Set<Class< ? extends Property>> getDirektkandidaturPersonendatenPropertiesRequired(Direktkandidatur direktkandidatur) {
    return kandidaturViewFormBuilder.getKandidaturPersonendatenPropertiesRequired(direktkandidatur);
  }

  public FormBuilder setDirektkandidaturAnschriftPropertiesRequired(FormBuilder formBuilder, Direktkandidatur direktkandidatur, Anschrift anschrift) {
    return setPropertiesRequired(formBuilder, getDirektkandidaturAnschriftPropertiesRequired(direktkandidatur, anschrift));
  }

  public Set<Class< ? extends Property>> getDirektkandidaturAnschriftPropertiesRequired(Direktkandidatur direktkandidatur, Anschrift anschrift) {
    return kandidaturViewFormBuilder.getKandidaturAnschriftPropertiesRequired(direktkandidatur, 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(Direktkandidatur direktkandidatur) {
    kandidaturViewFormBuilder.preSaveEntity(direktkandidatur);
  }
}
