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

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.faces.convert.Converter;

import de.ivu.elect.business.person.entity.EntityMitPersonendatenArt;
import de.ivu.elect.business.person.entity.PersonendatenArt;
import de.ivu.elect.jee.faces.StringEmptyToNullConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;

public class PersonendatenArtProperty extends AbstractSelectOneMenuProperty<String> {

  private static final String MSK_KEY_PREFIX = PersonendatenArt.MSK_KEY_PREFIX;

  private final EntityMitPersonendatenArt entity;

  private final Map<String, PersonendatenArt> personendatenArtPerTechnicalName;

  private final List<String> personendatenArtTechnicalNames;

  private final boolean hasNoSelectionItem;

  public PersonendatenArtProperty(EntityMitPersonendatenArt entity, List<PersonendatenArt> personendatenArten) {
    this(entity, personendatenArten, true);
  }

  public PersonendatenArtProperty(EntityMitPersonendatenArt entity, List<PersonendatenArt> personendatenArten, boolean hasNoSelectionItem) {
    super();

    this.entity = entity;

    this.personendatenArtPerTechnicalName = personendatenArten.stream().collect(Collectors.toMap(PersonendatenArt::getTechnicalName, personendatenArt -> personendatenArt));

    List<String> personendatenArtTechnicalNames = new ArrayList<>(personendatenArtPerTechnicalName.keySet());
    Collections.sort(personendatenArtTechnicalNames);
    Collections.reverse(personendatenArtTechnicalNames); // Quick-Fix, um "Wahlhelfer" nach oben und ggf. als Standardauswahl zu setzen.

    this.personendatenArtTechnicalNames = personendatenArtTechnicalNames;

    this.hasNoSelectionItem = hasNoSelectionItem;
  }

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

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

  @Override
  public String getValue() {
    PersonendatenArt personendatenArt = entity.getPersonendatenArt();

    if (nonNull(personendatenArt)) {
      return personendatenArt.getTechnicalName();
    }

    return "";
  }

  @Override
  public void setValue(String value) {
    entity.setPersonendatenArt(personendatenArtPerTechnicalName.get(value));
  }

  @Override
  public List<String> getValues() {
    return personendatenArtTechnicalNames;
  }

  @Override
  public String getItemLabel(String value) {
    if (isNotBlank(value)) {
      return getMessage(MSK_KEY_PREFIX + value);
    }

    return "";
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(MSK_KEY_PREFIX + "header");
  }

  @Override
  public Converter getDefaultConverter() {
    return new StringEmptyToNullConverter();
  }
}
