package de.ivu.elect.business.ergebniskonflikt.entity;

import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import java.util.Collections;
import java.util.List;

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

public class ErgebnisKonfliktLosoptionSelectOneMenuProperty extends AbstractSelectOneMenuProperty<ErgebnisKonfliktLosoption> {


  private final List<ErgebnisKonfliktLosoption> ergebnisKonfliktLosoptionen;
  private final AbstractErgebnisKonfliktLosoptionenCustomData customData;
  private final ErgebnisKonfliktLosoption losoptionGelost;

  public ErgebnisKonfliktLosoptionSelectOneMenuProperty(List<ErgebnisKonfliktLosoption> ergebnisKonfliktLosoptionen, AbstractErgebnisKonfliktLosoptionenCustomData customData, ErgebnisKonfliktLosoption losoptionGelost) {
    this.ergebnisKonfliktLosoptionen = ergebnisKonfliktLosoptionen;
    this.customData = customData;
    this.losoptionGelost = losoptionGelost;
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(AbstractErgebnisKonfliktLosoptionenCustomDataConstants.MESSAGE_KEY_LOSOPTION_EINZAHL);
  }

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

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

  @Override
  public ErgebnisKonfliktLosoption getValue() {
    return losoptionGelost;
  }

  @Override
  public void setValue(ErgebnisKonfliktLosoption ergebnisKonfliktLosoption) {
    customData.setLosoptionenGelost(Collections.singletonList(ergebnisKonfliktLosoption));
  }

  @Override
  public List<ErgebnisKonfliktLosoption> getValues() {
    return ergebnisKonfliktLosoptionen;
  }

  @Override
  public String getItemLabel(ErgebnisKonfliktLosoption ergebnisKonfliktLosoption) {
    if (ergebnisKonfliktLosoption != null && ergebnisKonfliktLosoption.hasLosoptionName()) {
      return ergebnisKonfliktLosoption.getLosoptionName();
    }

    return "";
  }

  public final class ErgebnisKonfliktLosoptionConverter implements Converter {

    @Override
    public String getAsString(FacesContext ctx, UIComponent component, Object value) {
      if (value instanceof ErgebnisKonfliktLosoption) {
        return ((ErgebnisKonfliktLosoption) value).getPk().toString();
      }

      return null;
    }

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
      if (isNotBlank(value)) {
        return ergebnisKonfliktLosoptionen.stream()
                .filter(e -> e.getPk().toString().equals(value)).findAny().orElse(null);
      }

      return null;
    }
  }

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

  @Override
  public String getNoSelectionLabel() {
    return this.getMessage("component.selection.required");
  }
}
