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

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.capitalize;

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

import javax.faces.convert.Converter;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.staat.entity.StaatConstants;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;

public class StaatsangehoerigkeitProperty extends AbstractSelectOneMenuProperty<Staat> implements StaatSelectProperty {

  private final Personendaten personendaten;

  private final int currentValueIndexZeroBased;

  private Staat currentValue;

  private final List<Staat> values;

  private final boolean defaultRequired;

  private final Staat defaultValue;

  public StaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat value) {
    this(propertyIndexZeroBased, personendaten, value, new ArrayList<>(personendaten.getStaatsangehoerigkeitenSorted()));
  }

  public StaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat value, List<Staat> values) {
    this(propertyIndexZeroBased, personendaten, null, value, values);
  }

  public StaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, Staat defaultValue, Staat value, List<Staat> values) {
    this(propertyIndexZeroBased, personendaten, false, defaultValue, value, values);
  }

  public StaatsangehoerigkeitProperty(int propertyIndexZeroBased, Personendaten personendaten, boolean defaultRequired, Staat defaultValue, Staat value, List<Staat> values) {
    super();

    this.personendaten = personendaten;

    this.currentValueIndexZeroBased = propertyIndexZeroBased;
    this.currentValue = value;

    this.values = values;

    this.defaultRequired = defaultRequired;
    this.defaultValue = defaultValue;
  }

  @Override
  public Converter getDefaultConverter() {
    return EntityConverter.getInstance();
  }

  @Override
  public String getDefaultLabel() {
    int staatsangehoerigkeitenCount = personendaten.getStaatsangehoerigkeitenSorted().size();

    if (currentValueIndexZeroBased == 0 || currentValueIndexZeroBased < staatsangehoerigkeitenCount) {
      String defaultLabel = getMessage(getDefaultLabelMsgKey());

      if (staatsangehoerigkeitenCount < 2) {
        return defaultLabel;
      }

      return getMessage("StaatsangehoerigkeitProperty.label", currentValueIndexZeroBased + 1, defaultLabel);
    }

    return "";
  }

  public String getDefaultLabelMsgKey() {
    return StaatConstants.MESSAGE_KEY_NAME_STAATSANGEHOERIGKEIT_EINZAHL;
  }

  @Override
  public String getItemLabel(Staat item) {
    if (nonNull(item)) {
      return capitalize(item.getNameStaatsangehoerigkeit());
    }

    return "";
  }

  @Override
  public boolean getDefaultRequired() {
    return defaultRequired;
  }

  @Override
  public boolean hasNoSelectionItem() {
    return true;
  }

  @Override
  public boolean hasDefaultValue() {
    return super.hasDefaultValue();
  }

  @Override
  public Staat getDefaultValue() {
    return defaultValue;
  }

  @Override
  public boolean hasValue() {
    return super.hasValue();
  }

  @Override
  public Staat getValue() {
    return currentValue;
  }

  @Override
  public void setValue(Staat value) {
    if (isNull(value)) {
      personendaten.removeStaatsangehoerigkeit(currentValue);
    } else {
      personendaten.setStaatsangehoerigkeit(currentValueIndexZeroBased, value);
    }

    currentValue = value;
  }

  @Override
  public List<Staat> getValues() {
    return values;
  }

  @Override
  protected boolean isNullOrBlank(Object value) {
    return super.isNullOrBlank(value) || value instanceof Staat && !((Staat) value).hasAnyCode();
  }
}
