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

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.List;

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

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;

@Specializes
public class CommonPersonendatenViewFormBuilder extends PersonendatenViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient PersonendatenAkademischerGradAutoCompleteOptionsProvider personendatenAkademischerGradAutoCompleteOptionsProvider;

  public CommonPersonendatenViewFormBuilder() {
    super();
  }

  public List< ? extends StaatSelectProperty> getStaatsangehoerigkeitProperties(Personendaten personendaten, boolean readonly) {
    List<StaatsangehoerigkeitProperty> result = new ArrayList<>();

    List<Staat> staatsangehoerigkeitenSorted = getStaatsangehoerigkeitenSorted(personendaten);

    for (int i = 0; i < staatsangehoerigkeitenSorted.size(); i++) {
      Staat staatsangehoerigkeit = staatsangehoerigkeitenSorted.get(i);

      if (isNotBlank(staatsangehoerigkeit.getNameStaatsangehoerigkeit())) {
        result.add(createStaatsangehoerigkeitProperty(i, personendaten, getDefaultStaatsangehoerigkeit(), staatsangehoerigkeit, readonly));
      }
    }

    if (result.isEmpty()) {
      // NOTE, dass zumindest immer eine leere Staatsangehörigkeit angezeigt wird.
      result.add(createStaatsangehoerigkeitProperty(0, personendaten, getEmptyStaatsangehoerigkeit(), readonly));
    }

    if (!readonly) {
      // NOTE, dass eine zusätzliche Staatsangehörigkeiten angezeigt wird, um eine weitere Staatsangehörigkeit erfassen
      // zu können.
      result.add(createStaatsangehoerigkeitProperty(result.size(), personendaten, getEmptyStaatsangehoerigkeit(), readonly));
    }

    return result;
  }

  public PersonendatenAkademischerGradAutoCompleteProperty createAkademischerGradProperty(Personendaten personendaten) {
    return new PersonendatenAkademischerGradAutoCompleteProperty(personendaten, personendatenAkademischerGradAutoCompleteOptionsProvider);
  }

  private StaatsangehoerigkeitProperty createStaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat value, boolean readonly) {
    return createStaatsangehoerigkeitProperty(propertyIndexZeroBased, personendaten, null, value, readonly);
  }

  private StaatsangehoerigkeitProperty createStaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat defaultValue, Staat value, boolean readonly) {
    StaatsangehoerigkeitProperty staatsangehoerigkeitProperty = createStaatsangehoerigkeitProperty(propertyIndexZeroBased, personendaten, defaultValue, value);
    staatsangehoerigkeitProperty.setReadonly(readonly);

    return staatsangehoerigkeitProperty;
  }

  protected StaatsangehoerigkeitProperty createStaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat defaultValue, Staat value) {
    return new StaatsangehoerigkeitProperty(propertyIndexZeroBased, personendaten, defaultValue, value, findAllStaatsangehoerigkeiten());
  }

  public void addStaatsangehoerigkeitProperties(FormBuilder formBuilder, Personendaten personendaten, boolean propertiesReadonly) {
    addStaatsangehoerigkeitProperties(formBuilder, personendaten, propertiesReadonly, propertiesReadonly);
  }

  public void addStaatsangehoerigkeitProperties(FormBuilder formBuilder, Personendaten personendaten, boolean propertiesReadonly, boolean personenregisterPropertiesReadonly) {
    addStaatsangehoerigkeitProperties(formBuilder, personendaten, false, propertiesReadonly, personenregisterPropertiesReadonly);
  }

  public void addStaatsangehoerigkeitProperties(FormBuilder formBuilder, Personendaten personendaten, boolean propertiesErweitertInitialVisibleOnPageLoad, boolean propertiesReadonly,
      boolean personenregisterPropertiesReadonly) {
    boolean readonly = propertiesReadonly || isPersonenregisterPropertyReadonlySupported(personendaten, personenregisterPropertiesReadonly);

    addStaatsangehoerigkeitProperties(formBuilder, getStaatsangehoerigkeitProperties(personendaten, readonly), propertiesErweitertInitialVisibleOnPageLoad, readonly);
  }

  public void addStaatsangehoerigkeitProperties(FormBuilder formBuilder, List< ? extends StaatSelectProperty> staatsangehoerigkeitProperties, boolean propertiesErweitertInitialVisibleOnPageLoad,
      boolean readonly) {
    Staat emptyValue = getEmptyStaatsangehoerigkeit();
    Staat defaultValue = getDefaultStaatsangehoerigkeit();

    boolean visibleOnPageLoad = staatsangehoerigkeitProperties.stream() // ELECT-8269
        .filter(property -> property != null && property.hasValue()) //
        .map(StaatSelectProperty::getValue) //
        .anyMatch(value -> !value.hasCodes(emptyValue) && !value.hasCodes(defaultValue));

    for (Property staatsangehoerigkeitProperty : staatsangehoerigkeitProperties) {
      formBuilder.addProperty(staatsangehoerigkeitProperty).withReadonly(readonly).withVisibleOnPageLoad(visibleOnPageLoad || propertiesErweitertInitialVisibleOnPageLoad);
    }
  }

  protected List<Staat> getStaatsangehoerigkeitenSorted(Personendaten personendaten) {
    return new ArrayList<>(personendaten.getStaatsangehoerigkeitenSorted());
  }
}
