
package de.ivu.elect.presentation.anschrift.table;

import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.Map.Entry;
import java.util.function.Function;

import de.ivu.elect.business.anschrift.entity.BarrierefreiWert;
import de.ivu.elect.business.anschrift.entity.EntityMitBarrierefreiheit;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class EntityMitBarrierefreiheitIconsColumn<E extends EntityMitBarrierefreiheit> extends AbstractEntityMitBarrierefreiheitColumn<E> {

  private static final long serialVersionUID = 1L;

  public EntityMitBarrierefreiheitIconsColumn(Messages messages, Icons icons) {
    super(messages, icons);
  }

  @Override
  public ColumnType getType() {
    return ColumnType.COLLECTION;
  }

  @Override
  public Object getValue(E entityMitBarrierefreiheit) {
    return BARRIEREFREI_FCT_PER_KEY_SORTED.entrySet().stream() //
        .map(entry -> getMessage(entry.getValue().apply(entityMitBarrierefreiheit))) //
        .collect(toList());
  }

  @Override
  public String getStyleClass(E entityMitBarrierefreiheit) {
    StringBuilder result = new StringBuilder(trimToEmpty(super.getStyleClass(entityMitBarrierefreiheit)));

    result.append(" barrierefreiheit ");

    if (entityMitBarrierefreiheit != null) {
      for (Entry<String, Function<EntityMitBarrierefreiheit, BarrierefreiWert>> entry : BARRIEREFREI_FCT_PER_KEY_SORTED.entrySet()) {
        boolean gesetztOderAbgeleitetBarrierefrei = entityMitBarrierefreiheit.isGesetztOderAbgeleitetBarrierefrei(entry.getValue());
        boolean gesetztOderAbgeleitetNichtBarrierefrei = entityMitBarrierefreiheit.isGesetztOderAbgeleitetNichtBarrierefrei(entry.getValue());

        if (gesetztOderAbgeleitetBarrierefrei || gesetztOderAbgeleitetNichtBarrierefrei) {
          result.append(" barrierefreiheit-").append(entry.getKey()).append("-");

          if (gesetztOderAbgeleitetBarrierefrei) {
            result.append("true");
          }

          if (gesetztOderAbgeleitetNichtBarrierefrei) {
            result.append("false");
          }

          result.append(" ");
        }
      }
    }

    return result.toString();
  }
}
