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

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 MSG_KEY_PREFIX = PersonendatenArt.MSG_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 = new HashMap<>();

    for (PersonendatenArt personendatenArt : personendatenArten) { // ELECTKOM-2406
      this.personendatenArtPerTechnicalName.put(personendatenArt.getTechnicalName(), personendatenArt);
    }

    List<String> personendatenArtTechnicalNames = new ArrayList<>(this.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 (personendatenArt != null) {
      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(MSG_KEY_PREFIX + value);
    }

    return "";
  }

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

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