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

import java.util.ArrayList;
import java.util.Collection;

import javax.annotation.Nullable;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;

@Specializes
public class CommonAnschriftViewFormBuilder extends AnschriftViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient AnschriftPlzAutoCompleteOptionsProvider anschriftPlzAutoCompleteOptionsProvider;

  public CommonAnschriftViewFormBuilder() {
    super();
  }

  @Override
  public void addLokalitaetAnschriftProperties(FormBuilder formBuilder, Anschrift anschrift, boolean propertiesReadonly) {
    super.addLokalitaetAnschriftProperties(formBuilder, anschrift, propertiesReadonly);

    if (formBuilder.containsPropertyByClass(AnschriftOrtAutoUpdateProperty.class)) {
      formBuilder.selectPropertyByClass(AnschriftOrtAutoUpdateProperty.class).withLabel(getMessage(LOKALITAET_MESSAGE_KEY_ORT_EINZAHL));
    }
  }

  @Override
  protected void addPlzOrtProperties(FormBuilder formBuilder, Personendaten personendaten, Anschrift anschrift, Property plzProperty, Property ortProperty, Property ortsteilProperty,
      boolean propertiesErweitertInitialVisibleOnPageLoad, boolean propertiesReadonly, Collection<Class< ? extends Property>> personenregisterPropertiesUebernommen,
      boolean personenregisterPropertiesReadonly) {
    AnschriftPlzAutoCompleteOptionsProvider anschriftPlzAutoCompleteOptionsProvider = getAnschriftPlzAutoCompleteOptionsProvider();

    if (anschriftPlzAutoCompleteOptionsProvider.isDisabled()) { // ELECT-13965
      super.addPlzOrtProperties(formBuilder, personendaten, anschrift, plzProperty, ortProperty, ortsteilProperty, propertiesErweitertInitialVisibleOnPageLoad, propertiesReadonly,
          personenregisterPropertiesUebernommen, personenregisterPropertiesReadonly);
    } else {
      addPlzOrtPropertiesAutoUpdate(formBuilder, personendaten, anschrift, new AnschriftPlzAutoCompleteProperty(anschrift, anschriftPlzAutoCompleteOptionsProvider),
          new AnschriftOrtAutoUpdateProperty(anschrift), new AnschriftOrtsteilAutoUpdateProperty(anschrift), propertiesErweitertInitialVisibleOnPageLoad, propertiesReadonly,
          personenregisterPropertiesUebernommen, personenregisterPropertiesReadonly);
    }
  }

  protected void addPlzOrtPropertiesAutoUpdate(FormBuilder formBuilder, @Nullable Personendaten personendaten, Anschrift anschrift, Property plzProperty, Property ortProperty,
      Property ortsteilProperty, boolean propertiesErweitertInitialVisibleOnPageLoad, boolean propertiesReadonly, Collection<Class< ? extends Property>> personenregisterPropertiesUebernommen,
      boolean personenregisterPropertiesReadonly) {
    addPersonenregisterProperty(formBuilder, personendaten, plzProperty, propertiesErweitertInitialVisibleOnPageLoad, propertiesReadonly, personenregisterPropertiesUebernommen,
        personenregisterPropertiesReadonly);
    addPersonenregisterProperty(formBuilder, personendaten, ortProperty, propertiesErweitertInitialVisibleOnPageLoad, propertiesReadonly, personenregisterPropertiesUebernommen,
        personenregisterPropertiesReadonly).withObservedProperty(plzProperty);
    addPersonenregisterProperty(formBuilder, personendaten, ortsteilProperty, propertiesErweitertInitialVisibleOnPageLoad, propertiesReadonly, personenregisterPropertiesUebernommen,
        personenregisterPropertiesReadonly).withObservedProperty(plzProperty);
  }

  @Override
  public Collection<Class< ? extends Property>> getDefaultPersonenregisterPropertiesUebernommen(@Nullable Personendaten personendaten) {
    Collection<Class< ? extends Property>> result = new ArrayList<>(super.getDefaultPersonenregisterPropertiesUebernommen(personendaten));

    result.add(AnschriftPlzAutoCompleteProperty.class);
    result.add(AnschriftOrtAutoUpdateProperty.class);

    return result;
  }

  protected AnschriftPlzAutoCompleteOptionsProvider getAnschriftPlzAutoCompleteOptionsProvider() {
    return anschriftPlzAutoCompleteOptionsProvider;
  }
}
